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

解決


ヌル山  2008-01-31 02:38:23  No: 29581

先日質問したばかりですが、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-31 04:49:28  No: 29582

Edit1.Color := clRed;

とした後

Edit1.Hide;
Edit1.Show;

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

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


ヌル山  2008-01-31 19:18:25  No: 29583

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加