3

TCanvas で TextWidth と TextHeight を使用するのと同じ方法で、TRichEdit コントロールでテキストの幅と高さを取得する方法を知っている人はいますか?

これを行う必要がある理由は、Richedit.Perform(EM_FORMATRANGE, ...) を使用して内容をキャンバスにコピーする非表示フォームに RichEdit があるためです。問題は、EM_FORMATRANGE には対象の rect を指定する TFormatRange 型のパラメータが必要なのですが、RichEdit のコンテンツのサイズが事前にわからないため、rect がどうあるべきかわかりません。それが理にかなっていることを願っています。

4

1 に答える 1

6

再度 EM_FORMATRANGE を使用して測定します。MSDNのEM_FORMATRANGE メッセージを参照してください。

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


より完全な例については、この記事、または一般的に RichEdit のプレビュー/印刷コードを参照してください。

于 2010-07-14T10:29:31.683 に答える