THotKey を実際に貼ってみると下図のように、簡単にホットキーが表示できます。
かっこわるい!
これは、THotKey に専用の StyleHook が用意されていないために起きています(THotKey の StyleHook は TEditStyleHook が指定されています)。
StyleHook については、こちら(ヘルプ)や、第23回デベロッパーキャンプ 【B2】 Delphiテクニカルセッション 「見た目で楽しいDelphiプログラミング」のセッション資料を、ご覧ください。
Win32 の HotKey コントロールは自動的にホットキーを表示してくれますが、背景モードが OPAQUE になっています。
そのため、テキストの描画で、背景が塗りつぶされてしまうのです。
そこで、次の API を呼んでやります。
そのため、テキストの描画で、背景が塗りつぶされてしまうのです。
そこで、次の API を呼んでやります。
SetBkMode(Canvas.Handle, TRANSPARENT);
SetBkMode で TRANSPARENT に設定することで、テキストを描画したときに背景を塗りつぶさなくなります。
描画時に SetBkMode を呼ぶような Custom Style Hook の例が↓です。
unit uHotKeyStyleHook; (略) procedure THotKeyStyleHook.Paint(Canvas: TCanvas); var Text: String; Shift: TShiftState; Key: Word; begin // 表示する文字列を作成 ShortCutToKey(THotKey(Control).HotKey, Key, Shift); if (ssAlt in Shift) then Text := Text + 'Alt + '; if (ssCtrl in Shift) then Text := Text + 'Ctrl + '; if (ssShift in Shift) then Text := Text + 'Shift + '; Text := Text + ShortCutToText(Key); // 背景モードを指定 SetBkMode(Canvas.Handle, TRANSPARENT); // フォントカラーを StyleServices から取得 Canvas.Font.Color := StyleServices.GetStyleFontColor(sfEditBoxTextNormal); // テキストを描画 Canvas.TextOut(0, 0, Text); end; initialization begin TCustomStyleEngine.RegisterStyleHook(THotKey, THotKeyStyleHook); end; end.
ここで、一点。
RegisterStyleHook を initialization 節に書いていますが、本来は StyleHook を適用したいコントロールの class constructor に書きます。
そうすると、そのコントロールを使わない限り、StyleHook が読み込まれることもありません。
しかし、THotKey は VCL で提供されているコントロールのため、THotKey のコードを書き換えるのは憚られます。
RegisterStyleHook を initialization 節に書いていますが、本来は StyleHook を適用したいコントロールの class constructor に書きます。
そうすると、そのコントロールを使わない限り、StyleHook が読み込まれることもありません。
しかし、THotKey は VCL で提供されているコントロールのため、THotKey のコードを書き換えるのは憚られます。
そのため、StyleHook 側の initialization 節に書いてみました。
この THotKeyStyleHook を使うために必要なコードは、たったこれだけです。
この THotKeyStyleHook を使うために必要なコードは、たったこれだけです。
というインターフェースから、ホットキーの組み合わせ文字列を取得できるみたいです。
僕は上手くできなかったので、どなたかお願いいたします!
0 件のコメント:
コメントを投稿