diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2021-10-27 15:29:19 -0500 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2021-11-01 16:34:09 -0500 |
| commit | dce1c97c7d3e76c18e4f80d4ffe288d2933a74bc (patch) | |
| tree | 68dc0653ee1a6fe962d82dac2159c8ab00a95808 /src/libs | |
| parent | bad2e93524f376cfeb76d5231d4b08510bdad033 (diff) | |
| download | wix-dce1c97c7d3e76c18e4f80d4ffe288d2933a74bc.tar.gz wix-dce1c97c7d3e76c18e4f80d4ffe288d2933a74bc.tar.bz2 wix-dce1c97c7d3e76c18e4f80d4ffe288d2933a74bc.zip | |
Make thmutil automatically load controls during window creation.
Add control loaded event.
Diffstat (limited to 'src/libs')
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/thmutil.h | 43 | ||||
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/thmutil.cpp | 137 |
2 files changed, 118 insertions, 62 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h b/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h index 9557c11c..eda81485 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h | |||
| @@ -6,6 +6,10 @@ | |||
| 6 | extern "C" { | 6 | extern "C" { |
| 7 | #endif | 7 | #endif |
| 8 | 8 | ||
| 9 | // forward declare | ||
| 10 | |||
| 11 | typedef struct _THEME THEME; | ||
| 12 | |||
| 9 | #define ReleaseTheme(p) if (p) { ThemeFree(p); p = NULL; } | 13 | #define ReleaseTheme(p) if (p) { ThemeFree(p); p = NULL; } |
| 10 | 14 | ||
| 11 | typedef HRESULT(CALLBACK *PFNTHM_EVALUATE_VARIABLE_CONDITION)( | 15 | typedef HRESULT(CALLBACK *PFNTHM_EVALUATE_VARIABLE_CONDITION)( |
| @@ -111,6 +115,10 @@ typedef enum _WM_THMUTIL | |||
| 111 | // wparam is THEME_CONTROLWMNOTIFY_ARGS* and lparam is THEME_CONTROLWMNOTIFY_RESULTS*. | 115 | // wparam is THEME_CONTROLWMNOTIFY_ARGS* and lparam is THEME_CONTROLWMNOTIFY_RESULTS*. |
| 112 | // Return code is TRUE to prevent further processing of the message. | 116 | // Return code is TRUE to prevent further processing of the message. |
| 113 | WM_THMUTIL_CONTROL_WM_NOTIFY = WM_APP - 3, | 117 | WM_THMUTIL_CONTROL_WM_NOTIFY = WM_APP - 3, |
| 118 | // Sent after created a control. | ||
| 119 | // wparam is THEME_LOADEDCONTROL_ARGS* and lparam is THEME_LOADEDCONTROL_RESULTS*. | ||
| 120 | // Return code is TRUE if it was processed. | ||
| 121 | WM_THMUTIL_LOADED_CONTROL = WM_APP - 4, | ||
| 114 | } WM_THMUTIL; | 122 | } WM_THMUTIL; |
| 115 | 123 | ||
| 116 | struct THEME_COLUMN | 124 | struct THEME_COLUMN |
| @@ -287,6 +295,7 @@ struct THEME_CONTROL | |||
| 287 | // state variables that should be ignored | 295 | // state variables that should be ignored |
| 288 | HWND hWnd; | 296 | HWND hWnd; |
| 289 | DWORD dwData; // type specific data | 297 | DWORD dwData; // type specific data |
| 298 | THEME* pTheme; | ||
| 290 | }; | 299 | }; |
| 291 | 300 | ||
| 292 | 301 | ||
| @@ -340,7 +349,7 @@ struct THEME_FONT | |||
| 340 | }; | 349 | }; |
| 341 | 350 | ||
| 342 | 351 | ||
| 343 | struct THEME | 352 | typedef struct _THEME |
| 344 | { | 353 | { |
| 345 | WORD wNextControlId; | 354 | WORD wNextControlId; |
| 346 | 355 | ||
| @@ -403,7 +412,7 @@ struct THEME | |||
| 403 | PFNTHM_SET_VARIABLE_STRING pfnSetStringVariable; | 412 | PFNTHM_SET_VARIABLE_STRING pfnSetStringVariable; |
| 404 | 413 | ||
| 405 | LPVOID pvVariableContext; | 414 | LPVOID pvVariableContext; |
| 406 | }; | 415 | } THEME; |
| 407 | 416 | ||
| 408 | typedef struct _THEME_CONTROLWMCOMMAND_ARGS | 417 | typedef struct _THEME_CONTROLWMCOMMAND_ARGS |
| 409 | { | 418 | { |
| @@ -431,6 +440,18 @@ typedef struct _THEME_CONTROLWMNOTIFY_RESULTS | |||
| 431 | LRESULT lResult; | 440 | LRESULT lResult; |
| 432 | } THEME_CONTROLWMNOTIFY_RESULTS; | 441 | } THEME_CONTROLWMNOTIFY_RESULTS; |
| 433 | 442 | ||
| 443 | typedef struct _THEME_LOADEDCONTROL_ARGS | ||
| 444 | { | ||
| 445 | DWORD cbSize; | ||
| 446 | const THEME_CONTROL* pThemeControl; | ||
| 447 | } THEME_LOADEDCONTROL_ARGS; | ||
| 448 | |||
| 449 | typedef struct _THEME_LOADEDCONTROL_RESULTS | ||
| 450 | { | ||
| 451 | DWORD cbSize; | ||
| 452 | HRESULT hr; | ||
| 453 | } THEME_LOADEDCONTROL_RESULTS; | ||
| 454 | |||
| 434 | typedef struct _THEME_LOADINGCONTROL_ARGS | 455 | typedef struct _THEME_LOADINGCONTROL_ARGS |
| 435 | { | 456 | { |
| 436 | DWORD cbSize; | 457 | DWORD cbSize; |
| @@ -528,24 +549,6 @@ HRESULT DAPI ThemeCreateParentWindow( | |||
| 528 | ); | 549 | ); |
| 529 | 550 | ||
| 530 | /******************************************************************** | 551 | /******************************************************************** |
| 531 | ThemeLoadControls - creates the windows for all the theme controls | ||
| 532 | using the window created in ThemeCreateParentWindow. | ||
| 533 | |||
| 534 | *******************************************************************/ | ||
| 535 | HRESULT DAPI ThemeLoadControls( | ||
| 536 | __in THEME* pTheme | ||
| 537 | ); | ||
| 538 | |||
| 539 | /******************************************************************** | ||
| 540 | ThemeUnloadControls - resets all the theme control windows so the theme | ||
| 541 | controls can be reloaded. | ||
| 542 | |||
| 543 | *******************************************************************/ | ||
| 544 | void DAPI ThemeUnloadControls( | ||
| 545 | __in THEME* pTheme | ||
| 546 | ); | ||
| 547 | |||
| 548 | /******************************************************************** | ||
| 549 | ThemeLocalize - Localizes all of the strings in the theme. | 552 | ThemeLocalize - Localizes all of the strings in the theme. |
| 550 | 553 | ||
| 551 | *******************************************************************/ | 554 | *******************************************************************/ |
diff --git a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp index a3c5d80c..068638f6 100644 --- a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp | |||
| @@ -205,6 +205,7 @@ static HRESULT ParseControl( | |||
| 205 | __in_opt THEME_PAGE* pPage | 205 | __in_opt THEME_PAGE* pPage |
| 206 | ); | 206 | ); |
| 207 | static void InitializeThemeControl( | 207 | static void InitializeThemeControl( |
| 208 | THEME* pTheme, | ||
| 208 | THEME_CONTROL* pControl | 209 | THEME_CONTROL* pControl |
| 209 | ); | 210 | ); |
| 210 | static HRESULT ParseActions( | 211 | static HRESULT ParseActions( |
| @@ -273,6 +274,12 @@ static HRESULT FindImageList( | |||
| 273 | __in_z LPCWSTR wzImageListName, | 274 | __in_z LPCWSTR wzImageListName, |
| 274 | __out HIMAGELIST *phImageList | 275 | __out HIMAGELIST *phImageList |
| 275 | ); | 276 | ); |
| 277 | static HRESULT LoadThemeControls( | ||
| 278 | __in THEME* pTheme | ||
| 279 | ); | ||
| 280 | static void UnloadThemeControls( | ||
| 281 | __in THEME* pTheme | ||
| 282 | ); | ||
| 276 | static HRESULT OnLoadingControl( | 283 | static HRESULT OnLoadingControl( |
| 277 | __in THEME* pTheme, | 284 | __in THEME* pTheme, |
| 278 | __in const THEME_CONTROL* pControl, | 285 | __in const THEME_CONTROL* pControl, |
| @@ -452,6 +459,10 @@ static BOOL OnNotifyEnMsgFilter( | |||
| 452 | __in const THEME_CONTROL* pThemeControl, | 459 | __in const THEME_CONTROL* pThemeControl, |
| 453 | __in MSGFILTER* msgFilter | 460 | __in MSGFILTER* msgFilter |
| 454 | ); | 461 | ); |
| 462 | static BOOL OnPanelCreate( | ||
| 463 | __in THEME_CONTROL* pControl, | ||
| 464 | __in HWND hWnd | ||
| 465 | ); | ||
| 455 | static BOOL OnWmCommand( | 466 | static BOOL OnWmCommand( |
| 456 | __in THEME* pTheme, | 467 | __in THEME* pTheme, |
| 457 | __in WPARAM wParam, | 468 | __in WPARAM wParam, |
| @@ -888,35 +899,6 @@ LExit: | |||
| 888 | return hr; | 899 | return hr; |
| 889 | } | 900 | } |
| 890 | 901 | ||
| 891 | |||
| 892 | DAPI_(HRESULT) ThemeLoadControls( | ||
| 893 | __in THEME* pTheme | ||
| 894 | ) | ||
| 895 | { | ||
| 896 | HRESULT hr = S_OK; | ||
| 897 | |||
| 898 | if (!pTheme->hwndParent) | ||
| 899 | { | ||
| 900 | ThmExitOnFailure(hr = E_INVALIDSTATE, "ThemeLoadControls called before theme parent window created."); | ||
| 901 | } | ||
| 902 | |||
| 903 | hr = LoadControls(pTheme, NULL); | ||
| 904 | |||
| 905 | LExit: | ||
| 906 | return hr; | ||
| 907 | } | ||
| 908 | |||
| 909 | |||
| 910 | DAPI_(void) ThemeUnloadControls( | ||
| 911 | __in THEME* pTheme | ||
| 912 | ) | ||
| 913 | { | ||
| 914 | UnloadControls(pTheme->cControls, pTheme->rgControls); | ||
| 915 | |||
| 916 | pTheme->hwndHover = NULL; | ||
| 917 | pTheme->hwndParent = NULL; | ||
| 918 | } | ||
| 919 | |||
| 920 | DAPI_(HRESULT) ThemeLocalize( | 902 | DAPI_(HRESULT) ThemeLocalize( |
| 921 | __in THEME *pTheme, | 903 | __in THEME *pTheme, |
| 922 | __in const WIX_LOCALIZATION *pWixLoc | 904 | __in const WIX_LOCALIZATION *pWixLoc |
| @@ -1089,6 +1071,17 @@ extern "C" LRESULT CALLBACK ThemeDefWindowProc( | |||
| 1089 | } | 1071 | } |
| 1090 | break; | 1072 | break; |
| 1091 | 1073 | ||
| 1074 | case WM_CREATE: | ||
| 1075 | if (FAILED(LoadThemeControls(pTheme))) | ||
| 1076 | { | ||
| 1077 | return -1; | ||
| 1078 | } | ||
| 1079 | break; | ||
| 1080 | |||
| 1081 | case WM_DESTROY: | ||
| 1082 | UnloadThemeControls(pTheme); | ||
| 1083 | break; | ||
| 1084 | |||
| 1092 | case WM_NCHITTEST: | 1085 | case WM_NCHITTEST: |
| 1093 | if (pTheme->dwStyle & WS_POPUP) | 1086 | if (pTheme->dwStyle & WS_POPUP) |
| 1094 | { | 1087 | { |
| @@ -3406,7 +3399,7 @@ static HRESULT ParseControl( | |||
| 3406 | BOOL fAnyTextChildren = FALSE; | 3399 | BOOL fAnyTextChildren = FALSE; |
| 3407 | BOOL fAnyNoteChildren = FALSE; | 3400 | BOOL fAnyNoteChildren = FALSE; |
| 3408 | 3401 | ||
| 3409 | InitializeThemeControl(pControl); | 3402 | InitializeThemeControl(pTheme, pControl); |
| 3410 | 3403 | ||
| 3411 | hr = XmlGetAttributeEx(pixn, L"Name", &pControl->sczName); | 3404 | hr = XmlGetAttributeEx(pixn, L"Name", &pControl->sczName); |
| 3412 | ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control Name attribute."); | 3405 | ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control Name attribute."); |
| @@ -3715,6 +3708,7 @@ LExit: | |||
| 3715 | } | 3708 | } |
| 3716 | 3709 | ||
| 3717 | static void InitializeThemeControl( | 3710 | static void InitializeThemeControl( |
| 3711 | THEME* pTheme, | ||
| 3718 | THEME_CONTROL* pControl | 3712 | THEME_CONTROL* pControl |
| 3719 | ) | 3713 | ) |
| 3720 | { | 3714 | { |
| @@ -3722,6 +3716,7 @@ static void InitializeThemeControl( | |||
| 3722 | pControl->dwFontId = THEME_INVALID_ID; | 3716 | pControl->dwFontId = THEME_INVALID_ID; |
| 3723 | pControl->dwFontSelectedId = THEME_INVALID_ID; | 3717 | pControl->dwFontSelectedId = THEME_INVALID_ID; |
| 3724 | pControl->uStringId = UINT_MAX; | 3718 | pControl->uStringId = UINT_MAX; |
| 3719 | pControl->pTheme = pTheme; | ||
| 3725 | } | 3720 | } |
| 3726 | 3721 | ||
| 3727 | 3722 | ||
| @@ -3854,7 +3849,7 @@ static HRESULT ParseBillboardPanels( | |||
| 3854 | pControl = pParentControl->rgControls + pParentControl->cControls; | 3849 | pControl = pParentControl->rgControls + pParentControl->cControls; |
| 3855 | pParentControl->cControls += 1; | 3850 | pParentControl->cControls += 1; |
| 3856 | pControl->type = THEME_CONTROL_TYPE_PANEL; | 3851 | pControl->type = THEME_CONTROL_TYPE_PANEL; |
| 3857 | InitializeThemeControl(pControl); | 3852 | InitializeThemeControl(pTheme, pControl); |
| 3858 | 3853 | ||
| 3859 | if (pPage) | 3854 | if (pPage) |
| 3860 | { | 3855 | { |
| @@ -5400,6 +5395,24 @@ static BOOL OnNotifyEnMsgFilter( | |||
| 5400 | return fProcessed; | 5395 | return fProcessed; |
| 5401 | } | 5396 | } |
| 5402 | 5397 | ||
| 5398 | static BOOL OnPanelCreate( | ||
| 5399 | __in THEME_CONTROL* pControl, | ||
| 5400 | __in HWND hWnd | ||
| 5401 | ) | ||
| 5402 | { | ||
| 5403 | HRESULT hr = S_OK; | ||
| 5404 | |||
| 5405 | ThmExitOnNull(pControl, hr, E_INVALIDSTATE, "Null control for OnPanelCreate"); | ||
| 5406 | |||
| 5407 | pControl->hWnd = hWnd; | ||
| 5408 | |||
| 5409 | hr = LoadControls(pControl->pTheme, pControl); | ||
| 5410 | ThmExitOnFailure(hr, "Failed to load panel controls."); | ||
| 5411 | |||
| 5412 | LExit: | ||
| 5413 | return SUCCEEDED(hr); | ||
| 5414 | } | ||
| 5415 | |||
| 5403 | static BOOL OnWmCommand( | 5416 | static BOOL OnWmCommand( |
| 5404 | __in THEME* pTheme, | 5417 | __in THEME* pTheme, |
| 5405 | __in WPARAM wParam, | 5418 | __in WPARAM wParam, |
| @@ -6017,17 +6030,24 @@ static LRESULT CALLBACK PanelWndProc( | |||
| 6017 | ) | 6030 | ) |
| 6018 | { | 6031 | { |
| 6019 | LRESULT lres = 0; | 6032 | LRESULT lres = 0; |
| 6020 | THEME* pTheme = reinterpret_cast<THEME*>(::GetWindowLongPtrW(hWnd, GWLP_USERDATA)); | 6033 | THEME_CONTROL* pControl = reinterpret_cast<THEME_CONTROL*>(::GetWindowLongPtrW(hWnd, GWLP_USERDATA)); |
| 6021 | 6034 | ||
| 6022 | switch (uMsg) | 6035 | switch (uMsg) |
| 6023 | { | 6036 | { |
| 6024 | case WM_NCCREATE: | 6037 | case WM_NCCREATE: |
| 6025 | { | 6038 | { |
| 6026 | LPCREATESTRUCTW lpcs = reinterpret_cast<LPCREATESTRUCTW>(lParam); | 6039 | LPCREATESTRUCTW lpcs = reinterpret_cast<LPCREATESTRUCTW>(lParam); |
| 6027 | pTheme = reinterpret_cast<THEME*>(lpcs->lpCreateParams); | 6040 | pControl = reinterpret_cast<THEME_CONTROL*>(lpcs->lpCreateParams); |
| 6028 | ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pTheme)); | 6041 | ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pControl)); |
| 6042 | break; | ||
| 6029 | } | 6043 | } |
| 6030 | break; | 6044 | |
| 6045 | case WM_CREATE: | ||
| 6046 | if (!OnPanelCreate(pControl, hWnd)) | ||
| 6047 | { | ||
| 6048 | return -1; | ||
| 6049 | } | ||
| 6050 | break; | ||
| 6031 | 6051 | ||
| 6032 | case WM_NCDESTROY: | 6052 | case WM_NCDESTROY: |
| 6033 | lres = ::DefWindowProcW(hWnd, uMsg, wParam, lParam); | 6053 | lres = ::DefWindowProcW(hWnd, uMsg, wParam, lParam); |
| @@ -6039,7 +6059,7 @@ static LRESULT CALLBACK PanelWndProc( | |||
| 6039 | break; | 6059 | break; |
| 6040 | } | 6060 | } |
| 6041 | 6061 | ||
| 6042 | return ControlGroupDefWindowProc(pTheme, hWnd, uMsg, wParam, lParam); | 6062 | return ControlGroupDefWindowProc(pControl ? pControl->pTheme : NULL, hWnd, uMsg, wParam, lParam); |
| 6043 | } | 6063 | } |
| 6044 | 6064 | ||
| 6045 | static LRESULT CALLBACK StaticOwnerDrawWndProc( | 6065 | static LRESULT CALLBACK StaticOwnerDrawWndProc( |
| @@ -6087,6 +6107,30 @@ static HRESULT OnLoadingControl( | |||
| 6087 | return hr; | 6107 | return hr; |
| 6088 | } | 6108 | } |
| 6089 | 6109 | ||
| 6110 | static HRESULT LoadThemeControls( | ||
| 6111 | __in THEME* pTheme | ||
| 6112 | ) | ||
| 6113 | { | ||
| 6114 | HRESULT hr = S_OK; | ||
| 6115 | |||
| 6116 | ThmExitOnNull(pTheme->hwndParent, hr, E_INVALIDSTATE, "LoadThemeControls called before theme parent window created."); | ||
| 6117 | |||
| 6118 | hr = LoadControls(pTheme, NULL); | ||
| 6119 | |||
| 6120 | LExit: | ||
| 6121 | return hr; | ||
| 6122 | } | ||
| 6123 | |||
| 6124 | static void UnloadThemeControls( | ||
| 6125 | __in THEME* pTheme | ||
| 6126 | ) | ||
| 6127 | { | ||
| 6128 | UnloadControls(pTheme->cControls, pTheme->rgControls); | ||
| 6129 | |||
| 6130 | pTheme->hwndHover = NULL; | ||
| 6131 | pTheme->hwndParent = NULL; | ||
| 6132 | } | ||
| 6133 | |||
| 6090 | static HRESULT LoadControls( | 6134 | static HRESULT LoadControls( |
| 6091 | __in THEME* pTheme, | 6135 | __in THEME* pTheme, |
| 6092 | __in_opt THEME_CONTROL* pParentControl | 6136 | __in_opt THEME_CONTROL* pParentControl |
| @@ -6103,10 +6147,15 @@ static HRESULT LoadControls( | |||
| 6103 | int h = 0; | 6147 | int h = 0; |
| 6104 | int x = 0; | 6148 | int x = 0; |
| 6105 | int y = 0; | 6149 | int y = 0; |
| 6150 | THEME_LOADEDCONTROL_ARGS loadedControlArgs = { }; | ||
| 6151 | THEME_LOADEDCONTROL_RESULTS loadedControlResults = { }; | ||
| 6106 | 6152 | ||
| 6107 | GetControls(pTheme, pParentControl, cControls, rgControls); | 6153 | GetControls(pTheme, pParentControl, cControls, rgControls); |
| 6108 | ::GetClientRect(hwndParent, &rcParent); | 6154 | ::GetClientRect(hwndParent, &rcParent); |
| 6109 | 6155 | ||
| 6156 | loadedControlArgs.cbSize = sizeof(loadedControlArgs); | ||
| 6157 | loadedControlResults.cbSize = sizeof(loadedControlResults); | ||
| 6158 | |||
| 6110 | for (DWORD i = 0; i < cControls; ++i) | 6159 | for (DWORD i = 0; i < cControls; ++i) |
| 6111 | { | 6160 | { |
| 6112 | THEME_CONTROL* pControl = rgControls + i; | 6161 | THEME_CONTROL* pControl = rgControls + i; |
| @@ -6124,8 +6173,7 @@ static HRESULT LoadControls( | |||
| 6124 | 6173 | ||
| 6125 | switch (pControl->type) | 6174 | switch (pControl->type) |
| 6126 | { | 6175 | { |
| 6127 | case THEME_CONTROL_TYPE_BILLBOARD: | 6176 | case THEME_CONTROL_TYPE_BILLBOARD: __fallthrough; |
| 6128 | __fallthrough; | ||
| 6129 | case THEME_CONTROL_TYPE_PANEL: | 6177 | case THEME_CONTROL_TYPE_PANEL: |
| 6130 | wzWindowClass = vsczPanelClass; | 6178 | wzWindowClass = vsczPanelClass; |
| 6131 | dwWindowExBits |= WS_EX_CONTROLPARENT; | 6179 | dwWindowExBits |= WS_EX_CONTROLPARENT; |
| @@ -6309,7 +6357,7 @@ static HRESULT LoadControls( | |||
| 6309 | pControl->dwStyle &= ~WS_VISIBLE; | 6357 | pControl->dwStyle &= ~WS_VISIBLE; |
| 6310 | } | 6358 | } |
| 6311 | 6359 | ||
| 6312 | pControl->hWnd = ::CreateWindowExW(dwWindowExBits, wzWindowClass, pControl->sczText, pControl->dwStyle | dwWindowBits, x, y, w, h, hwndParent, reinterpret_cast<HMENU>(wControlId), NULL, pTheme); | 6360 | pControl->hWnd = ::CreateWindowExW(dwWindowExBits, wzWindowClass, pControl->sczText, pControl->dwStyle | dwWindowBits, x, y, w, h, hwndParent, reinterpret_cast<HMENU>(wControlId), NULL, pControl); |
| 6313 | ThmExitOnNullWithLastError(pControl->hWnd, hr, "Failed to create window."); | 6361 | ThmExitOnNullWithLastError(pControl->hWnd, hr, "Failed to create window."); |
| 6314 | 6362 | ||
| 6315 | if (pControl->sczTooltip) | 6363 | if (pControl->sczTooltip) |
| @@ -6445,10 +6493,15 @@ static HRESULT LoadControls( | |||
| 6445 | } | 6493 | } |
| 6446 | } | 6494 | } |
| 6447 | 6495 | ||
| 6448 | if (pControl->cControls) | 6496 | loadedControlArgs.pThemeControl = pControl; |
| 6497 | loadedControlResults.hr = E_NOTIMPL; | ||
| 6498 | if (::SendMessageW(pTheme->hwndParent, WM_THMUTIL_LOADED_CONTROL, reinterpret_cast<WPARAM>(&loadedControlArgs), reinterpret_cast<LPARAM>(&loadedControlResults))) | ||
| 6449 | { | 6499 | { |
| 6450 | hr = LoadControls(pTheme, pControl); | 6500 | if (E_NOTIMPL != loadedControlResults.hr) |
| 6451 | ThmExitOnFailure(hr, "Failed to load child controls."); | 6501 | { |
| 6502 | hr = loadedControlResults.hr; | ||
| 6503 | ThmExitOnFailure(hr, "ThmLoadedControl failed"); | ||
| 6504 | } | ||
| 6452 | } | 6505 | } |
| 6453 | } | 6506 | } |
| 6454 | 6507 | ||
