VS 2010 Pro で Win32 用の C++ アプリケーションを作成しています。アプリには [貼り付け] 項目を含む [編集] メニューが含まれており、アプリのメイン ウィンドウにはテキスト ボックス コントロールが含まれています。通常の切り取り/コピー/貼り付けコマンドはすべて、そのコントロールで適切に機能します。これはたまたまアプリケーションの唯一のユーザー編集可能なフィールドです。
テキスト ボックス コントロールで点滅しているカーソルがない場合 (つまり、テキスト ボックスにフォーカスがない場合) に[貼り付け] メニュー項目を無効にしたい。/コピー/貼り付け操作が可能です。
次のコードを使用してメニュー項目を有効/無効にすることができます (テストとして、メニューが作成された直後にこのスニペットを WM_CREATE 内に配置してテストしました)。通常のユーザー イベント (マウス クリックなど) の過程で呼び出されるように、コードをプログラムのどこに配置すればよいかわかりません。これにより、フォーカスがテキスト ボックスから離れたり、テキスト ボックスに戻ったりします。
MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
mii.fMask = MIIM_STATE;
GetMenuItemInfo(hMenu, ID_EDIT_PASTE, FALSE, &mii);
mii.fState ^= MFS_DISABLED;
SetMenuItemInfo(hMenu, ID_EDIT_PASTE, FALSE, &mii);
コードを正しい場所に配置したら、アプリのテキスト ボックスにフォーカスがない場合にのみコードが実行される (メニュー項目を無効にする) ように、 ifステートメントに埋め込む予定です。
if(GetFocus() != hWndTextbox)
おそらく、 CALLBACK switch(msg)セクション内に、これがすべて存在するはずのcaseステートメントがありますか? 私はまだ基本的な C++ Win32 プログラム構造を学んでいます。ありがとうございました!
(PS 2 つのリソースが私をここまで助けてくれました:初心者の視点から見たメニューの検討、ウィンドウにフォーカスがあるかどうかを知るにはどうすればよいですか? (Win32 API) )