掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
複数のペインからなるプログラムで、フォーカスの有無により各ペインのタイトル部の色を変えるには (ID:47526)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Application.OnIdle は、(うまく使えば)最強…と思ってたんですが、、、恐ろしいことに FontDialog1.Execute 後は発生しないことに気付きました。(つまり今回の目的を満たせない。) これでは上のみっともないコードが最強になってしまう…何とかそれを阻止したかったので いろいろ探してみますと、WinEvent というのがありました。 この WinEvent、Windows98時代から存在するのですが、なぜかあまり利用されてないような。 SetWinEventHook関数で指定できるイベントの種類は↓こんなにたくさんあるんですが。 http://msdn.microsoft.com/en-us/library/dd318066%28v=vs.85%29.aspx その中の EVENT_OBJECT_FOCUS を使って、上のサンプルを書き直してみました。 変更点のみ記述。 private FEventHook: THandle; FPrevFocusedCtrl: TWinControl; function GetFocusedCtrl: TWinControl; procedure ColorChange(); // Screen.ActiveControl はフォーム内のコントロール以外を示す // こともあるので、不都合なら Self.ActiveControl に変更する function TForm1.GetFocusedCtrl(): TWinControl; begin if Assigned(Screen.ActiveControl) and Screen.ActiveControl.Focused then Result:=Screen.ActiveControl else Result:=nil; end; procedure WinEventProc(hWinEventHook: THandle; event: DWORD; hwnd: HWND; idObject, idChild: Longint; idEventThread, dwmsEventTime: DWORD); stdcall; begin if Form1.GetFocusedCtrl=Form1.FPrevFocusedCtrl then Exit; Form1.FPrevFocusedCtrl:=Form1.GetFocusedCtrl; Form1.ColorChange(); end; procedure TForm1.FormCreate(Sender: TObject); begin FEventHook:=SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, 0, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnhookWinEvent(FEventHook); end; procedure TForm1.ColorChange(); ≪以下同文≫
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.