2

見にくい再描画バグに直面しました (Delphi 5、Windows 7 64 ビット、クラシック テーマ)。

クライアントに合わせたリッチエディットを含むサイズ変更可能なダイアログを作成し、機能を提供する場合

procedure TQueryDlg.ShowDialog(const Txt: string);
begin
  RichEdit.Text:=Txt;
  ShowModal;
end;

少なくともWindows 7では、ダイアログのサイズを変更すると、行は再ラップされませんが、文字のピクセルがスペースを埋め続け、領域全体が無効にならないように見えます。マウスでコントロールをアクティブにすると、リッチエディットが正しく機能し始めます。

Delphi のフォームとダイアログのメッセージ キューと関係があると思いますが、おそらく特定のバージョンの RichEdits に固有のものです。じぶんの

  • System32/Richedit32.dll - v6.1.7601.17514

  • System32/RichEdit20.dll - v3.1、5.31.23.1230

おそらく、いくつかの回避策情報は素晴らしいでしょう。

4

1 に答える 1

1

コントロールにも同様の問題がありましたTRichEdit。表示されていない限り、それ自体は描画されないことがわかりました(私のアプリでは常にそうではありませんでした)。また、ユーザーがフォーカスを設定するまで、正しくレンダリングされないことがわかりました。 どちらも非常に刺激的です。

私にとってうまくいったのは、独自のクラスを作成し、それにRender()メソッドを追加することでした。このようにして、必要なときにいつでもペイントするように指示できます (たとえば、フォームのサイズを変更するときや、コンポーネントが表示されていないときなど)。

これは私がやったことの非常に簡素化されたバージョンです:

interface

uses
  Winapi.Messages, Vcl.ComCtrls;

type
  TMyRichEdit = class(TRichEdit)
  private
    procedure WMPaint(var Message: TMessage); message WM_PAINT;
  public
    procedure DoExit; override;
    procedure DoEnter; override;
    procedure Render;
  end;

var
  PaintMsg: TMessage;

implementation

procedure TMyRichEdit.DoEnter;
begin
  inherited;
  WMPaint(PaintMsg);
end;

procedure TMyRichEdit.DoExit;
begin
  inherited;
  WMPaint(PaintMsg);
end;

procedure TMyRichEdit.Render;
begin
  WMPaint(PaintMsg);
end;

procedure TMyRichEdit.WMPaint(var Message: TMessage);
begin
  // eliminated custom code to tweak the text content...
  inherited;
end;

initialization
  PaintMsg.Msg := WM_PAINT;
  PaintMsg.WParam := 0;
  PaintMsg.LParam := 0;
  PaintMsg.Result := 0;

end.

WMPaint()レンダリングする前にテキスト コンテンツを微調整する必要があったため、追加しました。しかし、あなたがしていることにはそのコードは必要ありません。WMPaint()したがって、メッセージを宣言して処理する代わりに、メソッドから を投稿WM_PAINTするだけでよいでしょう。申し訳ありませんが、コードをコンパイルしたり、削除して使用したりする時間がありません...PaintMsgDoExit()DoEnter()Render()WMPaint()PostMessage()

于 2013-05-30T00:37:30.433 に答える