ビジュアル テーマを組み込みたいカスタム Win32 UI コントロールをコーディングしています。テーマを次のWM_NCCREATE
ように読み込みます。
case WM_NCCREATE:
{
HTHEME hTheme = ::OpenThemeData(hWnd, L"EDIT");
assert(hTheme);
assert(::GetWindowTheme(hWnd) != 0);
}
return 1;
コントロールが破棄されたら解放します。
case WM_DESTROY:
{
HTHEME hTheme = ::GetWindowTheme(hWnd);
assert(hTheme);
if(::CloseThemeData(hTheme) != S_OK)
{
assert(NULL);
}
}
break;
誰かがそのコントロールのスタイルを変更しようとするまで、これはうまくいきます。次の呼び出し (スタイルを変更することなく、単独で):
::SetWindowLongPtr(hChildWnd, GWL_STYLE, dwStyle);
NULL を返しますGetWindowTheme
。hChildWnd
それで、それはバグですか、それとも機能ですか?
PS。再現可能な Win32 の例を作成するには、VS 2017 のストック Win32 ソリューションを調整する必要がありました (ここにその完全なソース コードがあります)。問題のテーマがあります:
次に、メイン ウィンドウの白い領域をクリックすると、そのスタイルを変更しようとすると、テーマが消えます。
そのプロジェクトの完全な Win32 コードを確認するために、PasteBin にも投稿しました。