2012年11月9日金曜日

TRichEdit と VCL スタイル


TRichEdit と VCL スタイルを併用する場合は注意が必要です。
というのも、TRichEdit は、VCL スタイルをサポートしているとは言いづらいためです。
もしかすると、Vcl.ComCtrls に登録されている Win32 Common Controls は、どれも問題があるのかもしれません。
個人的に TListViewTTreeView は使い方が煩雑なので、使っていないため判りませんが……。

QuolityCentral に送った画像で申し訳ないですが、TRichEdit と VCL スタイルを併用するとこんな事が起こります。


スクロールバーの亡霊が表示される



文字の再描画がおかしい
というか、そもそもフォントの色がおかしい



このように色々と崩れます。
VCL スタイルが適用されているフォームにTRichEdit のインスタンスを作るだけで簡単に確認可能です。

また、画像としては取れていませんが、WM_ERASEBKGND を受け取ると TRichEdit.Color で背景色が塗りつぶされるため、一瞬「白」が見えた後にスタイルの色で塗られます。
これの解決策は、TRicEdit.Color にスタイルの色を設定しておけば大丈夫です。

uses
Vcl.Themes;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
RichEdit1.Color := StyleServices.GetStyleColor(scWindow);
end;

この処置を行うと、文字の再描画がおかしい(2番目の画像)、という問題も直ります。

と、色々とおかしいので、TRichEdit と VCL スタイルは、併用しない方が賢明です。
どうしても、という場合は、下記の様にします。

procedure TForm1.FormCreate(Sender: TObject);
begin
// 背景色をスタイルの色と同じに設定する
RichEdit1.Color := StyleServices.GetStyleColor(scWindow);
 
// スクロールバーを消さない
RichEdit1.HideScrollBars := False;
// フォントは自前でやる
RichEdit1.StyleElements := [seClient, seBorder];
RichEdit1.Font.Color :=
StyleServices.GetFontColor(sfEditBoxTextNormal);
// なお上記のコードを別のメソッドに纏めて、
//スタイルが変更されるとき必ず呼ばれるようにしておく必要がある。
end;

これで、一応、おかしな動作はしなくなります。

0 件のコメント:

コメントを投稿