先日質問したばかりですが、XPスタイル表示についてまた質問があります。
フォーカスがセットされている時だけコンポーネントの色が変わるように、
TEditを拡張したコンポーネントを使用しています。
Windows2000でクラシック表示すると、フォーカスが来たときにEditの色が
指定した色になり、フォーカスが抜けた時にまたもとの色に戻ります。
XPスタイルで実行しても動作は同じですが、フォーカスが外れた時、Editの
縁の部分だけ、色が消えずに残ってしまいます。これを縁の部分まで正常に
表示させる方法はないでしょうか。
DelphiのバージョンやXPスタイル表示の方法にかかわらず、同じ現象が起こります。
コンポーネントのソースを抜粋すると、
//-----------------------------------------------------------------------------
type
TMyEdit = class(TEdit)
private
FBkColor: TColor; // 非フォーカス時のカラーバックアップ用
procedure WMSetFocus(var Msg: TWMSetFocus); message WM_SETFOCUS;
procedure WMKillFocus(var Msg: TWMKillFocus); message WM_KILLFOCUS;
end;
implementation
// フォーカスがセットされた時、コントロールの色をclYellowに変更
procedure TMyEdit.WMSetFocus(var Msg: TWMSetFocus);
begin
inherited;
if not (csDesigning in ComponentState) then
begin
FbkColor := Color;
Color := clYellow;
end;
end;
// フォーカスが離れる時、コントロールの色を元に戻す
procedure TMyEdit.WMKillFocus(var Msg: TWMKillFocus);
begin
inherited;
if not (csDesigning in ComponentState) then
Color := FbkColor;
end;
//-----------------------------------------------------------------------------
こんな感じです。
1つ気になるのは、フォーカスがあるEditの上にマウスカーソルが1度でも
乗ると、縁が残るようになり、縁が残っている状態でまたマウスカーソルを
乗せると縁が消えます。
つまり、KillFocus時にマウスカーソルが乗ったときの描画が再現できれば
縁も消えると思うんですが、それを再現させるコーディングが思いつきません。
マウスカーソルが乗るときのイベントはTControl.CMMouseEnterでいいかと
思うんですが...
細かすぎる質問で申し訳ありませんが、よろしくお願いします。
Edit1.Color := clRed;
とした後
Edit1.Hide;
Edit1.Show;
か
Edit1.Enabled := False;
Edit1.Enabled := True;
のどちらかで縁まで色が変わります
KHE00221様の方法を利用し、
WMKillFocusメソッドの
Color := FbkColor;
の後に、
Hide;
Show;
でちゃんと描画できました。でもRefreshだとうまくいかないんですね。
Refreshはコンポーネント全体を再描画すると思っていましたが、そうでは
ないのでしょうか。あるいは同じ描画処理でも、メソッドにより描画領域が
違うと言うことでしょうか。
とりあえず、困っていたことは完全に解決できました。
ありがとうございました。
ツイート | ![]() |