記事のソース: インターネット 著者: ggg82/CSDN
現在、多くのユーザー インターフェイスはツールバーを使用してメニュー バーを作成しています。私は最近これに興味を持ち、オンラインでヘルプを求めました。しかし、私が受け取ったヘルプのほとんどは、BCGControlBar のソース コードまたは SizableRebar のソース コードでした。独自のインターフェイスを使用できるので、機能的な友人にとっては、デモを見てから、これを選択するのが良いでしょう。その後、他の人のクラス ライブラリを直接呼び出すだけですが、このトピックに興味があり、隅々まで理解したいと考えている私たちのような読者にとっては、詳細な説明なしでこれらのソース コードを直接見て、そこから理由を理解する必要はありません。少なくとも私のような初心者にとっては簡単です。このため、この記事がまだ助けを求めている読者に役立つことを願っています。
以下を見て話しましょう:
ツールバー ボタンが押されたメッセージを受信すると、通常は TrackPopupMenuEx を使用してメニューをポップアップします。問題の鍵は、メニューが閉じられていない場合、TrackPopupMenuEx が返されず、マウスとキーボードのメッセージを傍受することです。この時点ではツールバー メッセージが受信されない場合、もちろんホットスポットを変更する方法はありません。これには、マウスの位置を自分で検出し、前のメニューを閉じて、マウスが次のホットスポットに移動したときに次のメニューを表示する必要があります。ここでは、フック関数 SetWindowsHookEx を使用して、TrackPupupMenuEx を呼び出す前に WH_MSGFILTER フックをインストールします。コードは次のとおりです。
m_hMsgHook = SetWindowsHookEx( WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId() );
MssageProc はフック関数であり、コードは次のとおりです。
void TrackPopup(HWND hWndToolBar, int iButton)
{
while (iButton >= 0)
{
SendMessage(hWndToolBar,TB_SETHOTITEM,iButton,0);
iPopup = iButton;
//フックをインストールする
g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());
//ポップアップメニュー
TrackPopupMenuEx(…);
//アンインストールフック
UnhookWindowsHookEx(g_hMsgHook);
iButton = iNextPop //次のポップアップ項目が負の場合、終了します。
}
SendMessage(hWndToolBar,TB_SETHOTITEM,-1,0);
}
(経験と提案: ボタンが TBSTYLE_DROPDOWN スタイルを使用している場合、メッセージ TBN_DROPDOWN 内で関数を直接呼び出さないでください。TBN_DROPDOWN が直接返せるように、中間メッセージを使用してから、PostMessa を使用してメッセージを送信する必要があります。そうでない場合は、最初のメッセージが返されます。ハイライトされたホットスポットが削除されます。)
iPopup は現在のポップアップ項目であり、iNextPop は次のポップアップ項目です。これらの変数は関数 HookMessageProc で処理する必要があります。サンプル コードは次のとおりです。