CXTThemeManagerStyle* CXTThemeManagerStyleFactory::GetSafeTheme() { if (m_pTheme == NULL) { m_pTheme = CreateTheme(XTThemeManager()->m_enumTheme); } if (m_pTheme) { m_pTheme->m_pFactory = this; m_pTheme->RefreshMetrics(); } return m_pTheme; }
void CXTThemeManagerStyleFactory::SetTheme(XTThemeStyle theme) { SetTheme(CreateTheme(theme)); }
int WINAPI wWinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE /* hPrevInstance */, __in_z_opt LPWSTR lpCmdLine, __in int /*nCmdShow*/ ) { ::HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); HRESULT hr = S_OK; BOOL fComInitialized = FALSE; LPWSTR sczThemeFile = NULL; ATOM atom = 0; HWND hWnd = NULL; HANDLE hDisplayThread = NULL; HANDLE hLoadThread = NULL; BOOL fRet = FALSE; MSG msg = { }; hr = ::CoInitialize(NULL); ExitOnFailure(hr, "Failed to initialize COM."); fComInitialized = TRUE; hr = ProcessCommandLine(lpCmdLine, &sczThemeFile); ExitOnFailure(hr, "Failed to process command line."); hr = CreateTheme(hInstance, &vpTheme); ExitOnFailure(hr, "Failed to create theme."); hr = CreateMainWindowClass(hInstance, vpTheme, &atom); ExitOnFailure(hr, "Failed to create main window."); hWnd = ::CreateWindowExW(0, reinterpret_cast<LPCWSTR>(atom), vpTheme->sczCaption, vpTheme->dwStyle, CW_USEDEFAULT, CW_USEDEFAULT, vpTheme->nWidth, vpTheme->nHeight, HWND_DESKTOP, NULL, hInstance, NULL); ExitOnNullWithLastError(hWnd, hr, "Failed to create window."); if (!sczThemeFile) { // Prompt for a path to the theme file. OPENFILENAMEW ofn = { }; WCHAR wzFile[MAX_PATH] = { }; ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = wzFile; ofn.nMaxFile = countof(wzFile); ofn.lpstrFilter = L"Theme Files\0*.thm\0XML Files\0*.xml\0All Files\0*.*\0"; ofn.nFilterIndex = 1; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; ofn.lpstrTitle = vpTheme->sczCaption; if (::GetOpenFileNameW(&ofn)) { hr = StrAllocString(&sczThemeFile, wzFile, 0); ExitOnFailure(hr, "Failed to copy opened file to theme file."); } else { ::MessageBoxW(hWnd, L"Must specify a path to theme file.", vpTheme->sczCaption, MB_OK | MB_ICONERROR); ExitFunction1(hr = E_INVALIDARG); } } hr = DisplayStart(hInstance, hWnd, &hDisplayThread, &vdwDisplayThreadId); ExitOnFailure(hr, "Failed to start display."); hr = LoadStart(sczThemeFile, hWnd, &hLoadThread); ExitOnFailure(hr, "Failed to start load."); // message pump while (0 != (fRet = ::GetMessageW(&msg, NULL, 0, 0))) { if (-1 == fRet) { hr = E_UNEXPECTED; ExitOnFailure(hr, "Unexpected return value from message pump."); } else if (!ThemeHandleKeyboardMessage(vpTheme, msg.hwnd, &msg)) { ::TranslateMessage(&msg); ::DispatchMessageW(&msg); } } LExit: if (::IsWindow(hWnd)) { ::DestroyWindow(hWnd); } if (hDisplayThread) { ::PostThreadMessageW(vdwDisplayThreadId, WM_QUIT, 0, 0); ::WaitForSingleObject(hDisplayThread, 10000); ::CloseHandle(hDisplayThread); } // TODO: come up with a good way to kill the load thread, probably need to switch // the ReadDirectoryW() to overlapped mode. ReleaseHandle(hLoadThread); if (atom && !::UnregisterClassW(reinterpret_cast<LPCWSTR>(atom), hInstance)) { DWORD er = ::GetLastError(); er = er; } ThemeFree(vpTheme); ThemeUninitialize(); // uninitialize COM if (fComInitialized) { ::CoUninitialize(); } ReleaseStr(sczThemeFile); return hr; }