2010-07-14 91 views
2

有沒有人知道如何獲取TRichEdit控件中文本的寬度和高度,就像在TCanvas上使用TextWidth和TextHeight一樣?如何在Delphi中獲取RichEdit的文本範圍

我需要知道這個的原因是我在一個不可見的窗體上使用Richedit.Perform(EM_FORMATRANGE,...)將內容複製到畫布的RichEdit。問題是EM_FORMATRANGE需要一個TFormatRange類型的參數,其中指定了目標矩形,但我不知道該矩形應該是什麼,因爲我事先不知道RichEdit中內容的大小。希望這是有道理的。

+0

我要補充,我用Delphi 2007 – 2010-07-14 08:00:12

回答

4

再次使用EM_FORMATRANGE測量,見​​MSDN上:

的wParam指定是否呈現 文本。如果此參數爲非零值,則會呈現文本。 否則,文本只是測量。

通常情況下,您已經有了一個目標區域,它具有寬度和高度,您可以在其中執行繪圖,如在紙張上打印或在預定義的曲面上生成預覽。一個預定義寬度的最簡單示例可以獲得所需的高度;

var 
    Range: TFormatRange; 
    Rect: TRect; 
    LogX, LogY, SaveMapMode: Integer; 
begin 
    Range.hdc := ACanvas.Handle; 
    Range.hdcTarget := ACanvas.Handle; 

    LogX := GetDeviceCaps(Range.hdc, LOGPIXELSX); 
    LogY := GetDeviceCaps(Range.hdc, LOGPIXELSY); 

    Range.rc.Left := 0; 
    Range.rc.Right := RichEdit1.ClientWidth * 1440 div LogX; // Any predefined width 
    Range.rc.Top := 0; 
    Range.rc.Bottom := Screen.Height * 1440 div LogY; // Some big number 
    Range.rcPage := Range.rc; 
    Range.chrg.cpMin := 0; 
    Range.chrg.cpMax := -1; 
    RichEdit1.Perform(EM_FORMATRANGE, 0, Longint(@Range)); 

    ShowMessage(IntToStr(Range.rc.Bottom * LogY div 1440)); // Get the height 
    RichEdit1.Perform(EM_FORMATRANGE, 0, 0); // free cache 


更完整的例子看this article,或任何一般的RichEdit預覽/打印代碼...

+0

[此鏈接](HTTP:/ /web.archive.org/web/20080723234245/http://www.delphi3000.com/articles/article_2987.asp)似乎現在工作。 – 2016-12-30 18:34:56

相關問題