Mesoscopic Programming

タコさんプログラミング専門

子ウィンドウをポップアップウィンドウに変更するには?

やっと分かったぞ!
せっかく調べたのでその方法を公開します。
ポップアップウィンドウを作るとき、
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
更新テスト。