3

通常、サブウィンドウ(WS_POPUP)を作成すると、子ウィンドウがアクティブになり、親が非アクティブになります。ただし、メニューを使用すると、両方がアクティブなままになります。少なくとも私はメニューがアクティブであると仮定しています、それは少なくともフォーカスを持っています。

例:メモ帳のファイルメニューをクリックすると、メニューが表示されますが、メモ帳ウィンドウはアクティブに見えます。

この動作をウィンドウスタイルまたは特定のメッセージへの応答のいずれかでミラーリングすることは可能ですか?

ありがとう

別の例:コンボボックスにはサブウィンドウが表示されているように見えますが、ウィンドウを非アクティブ化しないでください。また、アクティブ化されたメインウィンドウを維持したまま、そのサブウィンドウをクリックできます。そのウィンドウのクラス/スタイルを取得する方法について何かアイデアはありますか?

4

4 に答える 4

4

コンボボックスのリストドロップダウンはちょっとしたハックで、ポップアップと子ウィンドウの両方です。そのアプローチはお勧めできません(ドキュメント化されていないスタイルの組み合わせとIIRC、これを「通常の」で行うのは少しバグがあります"フローティングウィンドウ/ツールバー)

これにより、2つのオプションが残ります。

  • WS_EX_NOACTIVATE(メインウィンドウはアクティブのままで、フローティングウィンドウはアクティブではありません)
  • アクティブ化メッセージを処理します(両方のウィンドウがアクティブに見えます)
于 2010-05-21T11:11:26.337 に答える
0

新しいポップアップウィンドウを作成するとアクティブになることに驚いています。通常、 SetActiveWindowを呼び出す必要があります。ただし、ウィンドウが非アクティブになるのを停止する方法については、WM_ACTIVATEおよびWM_NCACTIVATEを確認してください。

于 2010-05-20T22:31:51.803 に答える
0

多くの人が見逃している事実は、ウィンドウには個別のウィンドウマネージャーコンポーネントがないことです:-ウィンドウ管理業務のほとんどは、各ウィンドウによって実行されます-通常はDefWindowProcで。

ほとんどのウィンドウの配置とアクティブ化/非アクティブ化は、最終的にはSetWindowPosの呼び出しを介して行われます。これにより、常にWM_WINDOWPOSCHANGINGメッセージが送信され、ウィンドウが何が起こるかを最終的に判断できるようになります。

DefWindowProcは、マウスのクリックなどに応じて独自のウィンドウもアクティブにします。

これらすべての結果として、アクティベーションを受け入れないウィンドウを作成することは非常に可能です。アクティベーションにつながった可能性のあるメッセージと状況を広範囲に理解する必要があります。

最終的には、リモートデバッグ用にデバッグ設定を構成しておくと非常に便利であると言えます。これにより、システムのアクティブ化状態に影響を与えることなくデバッガーと対話できるため、質問WM_ACTIVATEハンドラーのウィンドウにブレークポイントをドロップします。不要なアクティベーションにつながる状況をデバッグします。

キーボードフォーカスも処理したい場合は、注意が必要な場合があります。通常、フォーカスはアクティブ化されたウィンドウに与えられますが、通常は両方の割り当てを担当するDefWindowProcです。1つのウィンドウがまだアクティブになっていて、別のウィンドウにフォーカスがあるので危険だと思います。これにより、支援ソフトウェアが大幅に混乱します。

メッセージループレベルのメッセージフック(IsDialogMessageと同様)を実行して、ポップアップウィンドウ用のキーストロークをフィルタリングしたいと思います。

于 2010-05-21T05:27:52.747 に答える
0

WS_EX_NOACTIVATEを使用してポップアップウィンドウを作成した場合、ユーザー入力によってアクティブ化されないため(プログラムでアクティブ化することもできます)、メインアプリケーションウィンドウはアクティブなままになります。

于 2010-05-21T07:53:05.480 に答える