子ウィンドウをポップアップウィンドウに変更するには?
やっと分かったぞ!
せっかく調べたのでその方法を公開します。
ポップアップウィンドウを作るとき、
CreateWindow関数だと超簡単に親ウィンドウ(=オーナーウィンドウ)を設定できるけど、
子ウィンドウからポップアップウィンドウに変更するとなると
そう簡単には行かないのだった(分かってしまえば簡単だけど)。
// hWnd 子ウィンドウまたはポップアップウィンドウハンドル // hParent 親ウィンドウハンドル //----------------------------------------------------------------------------- // 子ウィンドウをポップアップウィンドウに変更する // 親ウィンドウをクリアする ::SetParent( hWnd, nullptr ); // ウィンドウスタイルを設定する ::SetWindowLongPtrW( hWnd, GWL_STYLE, static_cast< LONG_PTR >( WS_POPUP ) ); // オーナーウィンドウを設定する ::SetWindowLongPtrW( hWnd, GWLP_HWNDPARENT, reinterpret_cast< LONG_PTR >( hParent ) ); //----------------------------------------------------------------------------- // ポップアップウィンドウを子ウィンドウに変更する // ウィンドウスタイルを設定する ::SetWindowLongPtrW( hWnd, GWL_STYLE, static_cast< LONG_PTR >( WS_CHILD ) ) ); // 親ウィンドウを設定する ::SetParent( hWnd, hParent );
解説
要はSetWindowLong関数の部分ですにゃ。
※64ビットのユニコード用なのでSetWindowLongPtrW関数を使っているけども。
これがなかなか見つからなかった。
だってSetParent関数だと思うじゃん、普通。
ところがSetParent関数だと、ウィンドウが消えちゃうじゃん!
これが違うかったんだにゃ。
これで2日ほど悩んだっぺした。
分かってスッキリしたべ。
以上です。
2018/11/5
更新テスト。