0

私のアプリケーションには、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をトリガーするのに役立ちます

  1. :: OnSelChanged()内のツリー(CTreeCtrl)コントロールでSetFocus()を実行する

  2. コンボボックスのON_CBN_CLOSEUPメッセージの処理

  3. または、コンボボックスのON_CBN_SELENDOKメッセージを処理します

新しい発見-

私のアプリケーションは、「ビジュアルスタイルを有効にする」というディレクティブを使用して構築されています。どうやら、XPスタイルのComCtl32.dllはこの問題を引き起こしませんが、WindowsVistaおよびWindows7のComCtl32.dllは上記の問題を引き起こします。

ビジュアルスタイルを有効にせず、Windows 7でアプリケーションを実行しても、上記の問題は発生しません。

4

1 に答える 1

1

これは予期される動作です。またはそれ以上: 文書化されていない動作を使用しています。WM_SETFOCUS は、コントロールがフォーカスを取得または失った場合に送信されます。ツリー コントロールは 1 つの単一のコントロールです。別の別のコントロールを使用して構築されている可能性がありますが、これは修正されていません。Win7 でわかるように、変更されています。ツリー コントロールは 1 つの単一のコントロールになり、ツリー項目は直接描画されます。他のさまざまなコントロールから構築されています。

代わりにTVN_BEGINLABELEDIT通知を使用してください。または、WM_SETFOCUS と同様のものが必要な場合は、TVN_ITEMCHANGED通知を使用して、選択状態の変更を確認します。

于 2010-07-26T14:49:04.520 に答える