BCB中获得RichEdit 默认行间距
首先,這些功能支持RichEdit2.0 以上功能;
其次,用常規的方法是無法獲得LineSpace 的;
- 你使用 EM_GETPARAFORMAT也得不到,你會發現dyLineSpacing 的值永遠是0
- 你先EM_SETPARAFORMAT ,指定 bLineSpacingRule = 4,再用GETPARAFORMAT 去取dyLineSpacing 同樣是0
也許RichEdit的作者有辦法。
https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/f67f6416-eab3-4aee-bfcc-85b9f26fde39/rich-edit-control-line-height
下面是richedit 作者的blog
https://blogs.msdn.microsoft.com/murrays/2010/01/12/richedit-versions-1-0-through-3-0/#comment-12105
下面是我的解決辦法。
我發現了一個規律,當用EM_SETPARAFORMAT ,改變行間距的時候。整體文本區域的高度也改變了。
?
代碼如下
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop#include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1;static int LineSpace = 400; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) { } //---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) {RichEdit1->SelectAll();PARAFORMAT2 Para;Para.cbSize = sizeof(Para);Para.dwMask = PFM_LINESPACING;Para.bLineSpacingRule = 4;Para.dyLineSpacing = LineSpace;SendMessage(RichEdit1->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para)); } //---------------------------------------------------------------------------由此我們得到啟發,如果我們1開始,制定LinSpace 是1,然后逐漸累加。
當,文本區域的高度和默認文本高度相同時,是不是就得到,LineSpace 對應的值了呢?
問題1,如何得到文本區域的高度?? 看我的另一個博客 http://www.cnblogs.com/songr/p/5485187.html
問題2,計算,這個超級簡單;
下面是實現代碼
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop#include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1;static int LineSpace = 400; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) { } //---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) {RichEdit1->SelectAll();PARAFORMAT2 Para;Para.cbSize = sizeof(Para);Para.dwMask = PFM_LINESPACING;Para.bLineSpacingRule = 4;Para.dyLineSpacing = LineSpace;SendMessage(RichEdit1->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para)); } //---------------------------------------------------------------------------int TForm1::getTextAreaHeight() {RichEdit1->Text = RichEdit1->Text.TrimRight();int LogX,LogY;HDC richdc = GetDC(RichEdit1->Handle);LogX = GetDeviceCaps(richdc, LOGPIXELSX);LogY = GetDeviceCaps(richdc, LOGPIXELSY);FORMATRANGE formatrange = {0};formatrange.hdc = richdc;formatrange.hdcTarget = richdc;formatrange.rc.left = 0;formatrange.rc.top = 0;formatrange.rc.right = RichEdit1->ClientWidth * 1440 / LogX;formatrange.rc.bottom= Screen->Height* 1440 / LogY;formatrange.rcPage = formatrange.rc;formatrange.chrg.cpMin = 0;formatrange.chrg.cpMax = -1;RichEdit1->Perform(EM_FORMATRANGE,0,(long)&formatrange);int totalHeight = formatrange.rc.bottom * LogY / 1440;RichEdit1->Perform(EM_FORMATRANGE,0,NULL);ReleaseDC(RichEdit1->Handle,richdc);return totalHeight; }void __fastcall TForm1::Button2Click(TObject *Sender) { //首先將RichEdit 設置成默認Single spacingRichEdit1->SelectAll();PARAFORMAT2 Para;Para.cbSize = sizeof(Para);Para.dwMask = PFM_LINESPACING;Para.bLineSpacingRule = 0;SendMessage(RichEdit1->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para)); //得到默認情況下的文本區域高度int defTextAreaHeight = getTextAreaHeight();int i = 0;do{ //不停的改變行間距,直到文本區域高度和默認情況下相同i++;PARAFORMAT2 Para;Para.cbSize = sizeof(Para);Para.dwMask = PFM_LINESPACING;Para.bLineSpacingRule = 4;Para.dyLineSpacing = i;SendMessage(RichEdit1->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para));}while (defTextAreaHeight != getTextAreaHeight());ShowMessage(IntToStr(i)); } //---------------------------------------------------------------------------?
說明,當累加到 278 的時候,文本區域的高度相同了。也就是說,278 是,默認行高的基準線。
有了這個基準線之后。我就可以用這個278 作為,我們計算行高的基礎值了。(例如,減少行高時,不能小于這個值。)
?
轉載于:https://www.cnblogs.com/songr/p/5633234.html
總結
以上是生活随笔為你收集整理的BCB中获得RichEdit 默认行间距的全部內容,希望文章能夠幫你解決所遇到的問題。