1

私はクロスプラットフォームの GUI ライブラリの作成に取り組んでおり、興味深い障害に遭遇しました。インターフェースを良くするために、親なしでボタンを作成し、コンストラクターが終了した後に親を割り当てることができるようにしようとしています。コードはほとんど動作するようになりましたが、ボタンをクリックすると、親ウィンドウがフォーカスを失います。CreateWindowEx() を使用してボタンを作成し、スタイル WS_POPUP | を指定しています。BS_PUSHBUTTON と null の親。WS_POPUP を使用する理由は、タイトル バーのサイズがボタンのサイズに影響しないようにするためです。それがなければ、ボタンは押しつぶされます。ボタンを作成したら、SetParent() を使用して、WS_POPUP フラグを WS_CHILD に置き換えます。

4

1 に答える 1

2

Windows API ウィンドウは、それほど柔軟ではありません。MSDN で文書化されているように、API 呼び出し (たとえばShowWindow()、変更)を使用しない限り、手動でフラグを変更することはできませんWS_VISIBLECreateWindowEx()ライブラリ ボタン オブジェクトが親ウィンドウに割り当てられるまで、呼び出しを遅らせてみませんか?

WS_POPUP は、素人がウィンドウと呼ぶものを作成することを意味します。つまり、ウィジェット (WS_CHILD ウィンドウ) を含めることができるトップレベルのフレームです。フラグを WS_CHILD に変更しても、ボタンが別のトップレベル ウィンドウとしてシステムに表示されるため、親として設定したウィンドウはおそらくフォーカスを失います。

Windows の動作には、現在設定されているフラグ以上のものがあります。Windows が適切に設計されている場合、2 種類のウィンドウ (WS_POPUPWS_CHILD) は、CreateWindowEx に渡されるフラグに応じて選択された、フードの下にある 2 つのまったく異なるオブジェクトによって実装されます。フラグを変更しても、基になるオブジェクトが魔法のようにあるタイプから別のタイプにモーフィングされるわけではありません。

MSDN API ドキュメントに、フラグが直接操作されることを意図していると明示されておらず、変更を処理するための API 呼び出しがない場合、ウィンドウの ID のその側面は不変です。

于 2012-06-08T00:59:53.040 に答える