C++/Win32 アプリケーションのウィンドウを作成した後にウィンドウスタイルと拡張ウィンドウスタイルを変更する方法です。
ウィンドウスタイルの削除
ウィンドウスタイルを削除する方法です。変更を反映するには、SWP_FRAMECHANGED フラグを指定して SetWindowPos を呼び出す必要があります。例では WS_MAXIMIZEBOX を削除しています。
// ウィンドウスタイル取得
LONG lStyle = ::GetWindowLong(hWnd, GWL_STYLE);
// 削除
lStyle &= ~WS_MAXIMIZEBOX;
// 変更
lStyle = ::SetWindowLong(hWnd, GWL_STYLE, lStyle);
// ウィンドウへ反映
::SetWindowPos(hWnd, NULL, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED));
ウィンドウスタイルの追加
ウィンドウスタイルを追加する方法です。例では WS_MAXIMIZEBOX を追加しています。
// ウィンドウスタイル取得
LONG lStyle = ::GetWindowLong(hWnd, GWL_STYLE);
// 追加
lStyle |= WS_MAXIMIZEBOX;
// スタイル変更
lStyle = ::SetWindowLong(hWnd, GWL_STYLE, lStyle);
// ウィンドウへ反映
::SetWindowPos(hWnd, NULL, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED));
拡張ウィンドウスタイルの削除
拡張ウィンドウスタイルを削除する方法です。ウィンドウスタイルと同様、変更を反映するには、SWP_FRAMECHANGED フラグを指定して SetWindowPos を呼び出す必要があります。例では WS_EX_CLIENTEDGE を削除しています。
// ウィンドウスタイル取得
LONG lExStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE);
// 削除
lExStyle &= ~WS_EX_CLIENTEDGE;
// スタイル変更
lExStyle = ::SetWindowLong(hWnd, GWL_EXSTYLE, lExStyle);
// ウィンドウへ反映
::SetWindowPos(hWnd, NULL, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED));
拡張ウィンドウスタイルの追加
拡張ウィンドウスタイルを追加する方法です。例では WS_EX_CLIENTEDGE を追加しています。
// ウィンドウスタイル取得
LONG lExStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE);
// 追加
lExStyle |= WS_EX_CLIENTEDGE;
// スタイル変更
lExStyle = ::SetWindowLong(hWnd, GWL_EXSTYLE, lExStyle);
// ウィンドウへ反映
::SetWindowPos(hWnd, NULL, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED));
おわりに
いつもどーすんだっけってなってたんですが、ようやく記事にできました。これでいつでも変更できます。現在 C++/Win32 版のテキストエディタを作ってるんですが、やっぱり記事にしといて良かった。動的にスタイル変更する場面に遭遇しました。
コメント