XPスタイル表示時、コントロールの色を設定しても縁が描画されない

解決


ヌル山  2008-01-30 17:38:23  No: 29581  IP: 192.*.*.*

先日質問したばかりですが、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でいいかと
思うんですが...

細かすぎる質問で申し訳ありませんが、よろしくお願いします。

編集 削除
KHE00221  2008-01-30 19:49:28  No: 29582  IP: 192.*.*.*

Edit1.Color := clRed;

とした後

Edit1.Hide;
Edit1.Show;



Edit1.Enabled := False;
Edit1.Enabled := True;

のどちらかで縁まで色が変わります

編集 削除
ヌル山  2008-01-31 10:18:25  No: 29583  IP: 192.*.*.*

KHE00221様の方法を利用し、
WMKillFocusメソッドの
Color := FbkColor;
の後に、
Hide;
Show;
でちゃんと描画できました。でもRefreshだとうまくいかないんですね。
Refreshはコンポーネント全体を再描画すると思っていましたが、そうでは
ないのでしょうか。あるいは同じ描画処理でも、メソッドにより描画領域が
違うと言うことでしょうか。

とりあえず、困っていたことは完全に解決できました。
ありがとうございました。

編集 削除