私のアプリケーションには、CTreeCtrlタイプのツリーがあります。ツリーのノードの1つは、このツリー構造の子として作成されたCComboBoxコントロールです。
c_combo-> Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_HASSTRINGS | CBS_DROPDOWNLIST、myrect、m_pTree、IDD_OBTC_COMBO);
基本的に、ComboBoxはツリーノードをクリックすると作成され、:: OnComboKillFocus()メソッド(基本的にON_CBN_KILLFOCUSメッセージを処理します)で破棄します。
コンボボックスがある場合のように、ノードの1つがコントロールである場合を除いて、ツリーの1つのノードから別のノードに移動するときにWindowsはWM_SETFOCUSメッセージを発行しません。したがって、ComboBoxドロップダウンリストからオプションを選択し、ツリーの別のノードを左クリックすると、WM_SETFOCUSが起動されます。これは、WindowsXPでの動作です。
ただし、明らかにWindows 7では、ComboBoxドロップダウンリストからオプションを選択した後、別のノードをクリックしてもWM_SETFOCUSメッセージは表示されません。したがって、新しいノードが強調表示されても、フォーカスはComboBoxに残ります。また、マウスホイールをスクロールしたり、矢印キーを使用したりすると、ComboBoxのオプションが変更されます。
これは既知の問題ですか、それともWindows 7の予想される動作(Windows XPとは異なります)ですか?
あるノード(ComboBoxなど)から別のノードに切り替えたときにWindows 7にWM_SETFOCUSメッセージを表示させる方法はありますか?
詳細を追加するには-
ツリーコントロールのTVN_SELCHANGEDメッセージを処理し、コンボボックスコントロールのON_CBN_KILLFOCUSメッセージを処理して、:: OnComboKillFocus()メソッドでロジックを実行してから、コンボボックスを破棄し、ノードを単純なツリーアイテムに戻します。:: OnSelChanged()はヒットしますが、:: OnComboKillfocus()はヒットしません
本質的に、Win 7はノードの選択の変更を通知しますが、フォーカスの変更(コンボボックスノードからツリーの別のノードへ)は通知しません。また、Spy ++を使用し、コンボボックス(同じツリーの別のノード)に最初にフォーカスした別のツリーノードを選択(シングルクリック)しても、Win7がWM_SETFOCUSを起動しないことを確認しました。WinXPはメッセージを起動します。
また、次の回避策は、Win7がWM_SETFOCUSをトリガーするのに役立ちます
:: OnSelChanged()内のツリー(CTreeCtrl)コントロールでSetFocus()を実行する
コンボボックスのON_CBN_CLOSEUPメッセージの処理
または、コンボボックスのON_CBN_SELENDOKメッセージを処理します
新しい発見-
私のアプリケーションは、「ビジュアルスタイルを有効にする」というディレクティブを使用して構築されています。どうやら、XPスタイルのComCtl32.dllはこの問題を引き起こしませんが、WindowsVistaおよびWindows7のComCtl32.dllは上記の問題を引き起こします。
ビジュアルスタイルを有効にせず、Windows 7でアプリケーションを実行しても、上記の問題は発生しません。