3

ビジュアル テーマを組み込みたいカスタム 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 を返しますGetWindowThemehChildWnd

それで、それはバグですか、それとも機能ですか?

PS。再現可能な Win32 の例を作成するには、VS 2017 のストック Win32 ソリューションを調整する必要がありました (ここにその完全なソース コードがあります)。問題のテーマがあります:

ここに画像の説明を入力

次に、メイン ウィンドウの白い領域をクリックすると、そのスタイルを変更しようとすると、テーマが消えます。

ここに画像の説明を入力

そのプロジェクトの完全な Win32 コードを確認するために、PasteBin にも投稿しました

4

1 に答える 1