1

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) )

4

2 に答える 2

4

WM_INITMENUPOPUPを探していると思います。これは、メニューが表示されようとしているときに送信されるため、必要なチェックを行い、メニュー項目を適切に有効/無効にすることができます。

于 2012-07-02T02:26:26.363 に答える
0

編集コントロールにフォーカスがない/フォーカスを失ったときにメニューを無効にしたいですか?

WndProc では、エディット コントロールは WM_COMMAND の形式で通知を送信します。関心のある 2 つは次のとおりです。 EN_KILLFOCUS - コントロールがキーボード フォーカスを失ったとき EN_SETFOCUS - コントロールがキーボード フォーカスを取得したとき。

于 2012-07-02T01:26:29.563 に答える