BCB中获得RichEdit 默认行间距
首先,這些功能支持RichEdit2.0 以上功能;
其次,用常規(guī)的方法是無(wú)法獲得LineSpace 的;
- 你使用 EM_GETPARAFORMAT也得不到,你會(huì)發(fā)現(xiàn)dyLineSpacing 的值永遠(yuǎn)是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
下面是我的解決辦法。
我發(fā)現(xiàn)了一個(gè)規(guī)律,當(dāng)用EM_SETPARAFORMAT ,改變行間距的時(shí)候。整體文本區(qū)域的高度也改變了。
?
代碼如下
//--------------------------------------------------------------------------- #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)); } //---------------------------------------------------------------------------由此我們得到啟發(fā),如果我們1開(kāi)始,制定LinSpace 是1,然后逐漸累加。
當(dāng),文本區(qū)域的高度和默認(rèn)文本高度相同時(shí),是不是就得到,LineSpace 對(duì)應(yīng)的值了呢?
問(wèn)題1,如何得到文本區(qū)域的高度?? 看我的另一個(gè)博客 http://www.cnblogs.com/songr/p/5485187.html
問(wèn)題2,計(jì)算,這個(gè)超級(jí)簡(jiǎn)單;
下面是實(shí)現(xiàn)代碼
//--------------------------------------------------------------------------- #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 設(shè)置成默認(rèn)Single spacingRichEdit1->SelectAll();PARAFORMAT2 Para;Para.cbSize = sizeof(Para);Para.dwMask = PFM_LINESPACING;Para.bLineSpacingRule = 0;SendMessage(RichEdit1->Handle, EM_SETPARAFORMAT, 0, LPARAM(&Para)); //得到默認(rèn)情況下的文本區(qū)域高度int defTextAreaHeight = getTextAreaHeight();int i = 0;do{ //不停的改變行間距,直到文本區(qū)域高度和默認(rèn)情況下相同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)); } //---------------------------------------------------------------------------?
說(shuō)明,當(dāng)累加到 278 的時(shí)候,文本區(qū)域的高度相同了。也就是說(shuō),278 是,默認(rèn)行高的基準(zhǔn)線。
有了這個(gè)基準(zhǔn)線之后。我就可以用這個(gè)278 作為,我們計(jì)算行高的基礎(chǔ)值了。(例如,減少行高時(shí),不能小于這個(gè)值。)
?
轉(zhuǎn)載于:https://www.cnblogs.com/songr/p/5633234.html
總結(jié)
以上是生活随笔為你收集整理的BCB中获得RichEdit 默认行间距的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。