diff options
author | Steve Dower <steve.dower@microsoft.com> | 2015-05-31 16:39:46 -0700 |
---|---|---|
committer | Steve Dower <steve.dower@microsoft.com> | 2015-05-31 16:39:46 -0700 |
commit | ac47ab86661bab685a40ab264b3504960a49ee1d (patch) | |
tree | dd65129205f12416b91987a34ddf7a67990fc71e /Tools/msi/bundle/bootstrap | |
parent | 7120712ef35d61785cf5b789457113f5f8363502 (diff) | |
download | cpython-ac47ab86661bab685a40ab264b3504960a49ee1d.tar.gz |
Issue #24293: Adds mapping from explicit colours to system colours to correctly handle user themes.
Diffstat (limited to 'Tools/msi/bundle/bootstrap')
-rw-r--r-- | Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp index 7f5af74eb5..0c40be5ff5 100644 --- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp +++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp @@ -1475,6 +1475,8 @@ private: POINT ptCursor = { }; HMONITOR hMonitor = nullptr; MONITORINFO mi = { }; + COLORREF fg, bg; + HBRUSH bgBrush; // If the theme did not provide an icon, try using the icon from the bundle engine. if (!hIcon) { @@ -1484,12 +1486,23 @@ private: } } + fg = RGB(0, 0, 0); + bg = RGB(255, 255, 255); + bgBrush = (HBRUSH)(COLOR_WINDOW+1); + if (_theme->dwFontId < _theme->cFonts) { + THEME_FONT *font = &_theme->rgFonts[_theme->dwFontId]; + fg = font->crForeground; + bg = font->crBackground; + bgBrush = font->hBackground; + RemapColor(&fg, &bg, &bgBrush); + } + // Register the window class and create the window. wc.lpfnWndProc = PythonBootstrapperApplication::WndProc; wc.hInstance = _hModule; wc.hIcon = hIcon; wc.hCursor = ::LoadCursorW(nullptr, (LPCWSTR)IDC_ARROW); - wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wc.hbrBackground = bgBrush; wc.lpszMenuName = nullptr; wc.lpszClassName = PYBA_WINDOW_CLASS; if (!::RegisterClassW(&wc)) { @@ -1704,12 +1717,12 @@ private: } break; + case WM_CTLCOLORSTATIC: case WM_CTLCOLORBTN: if (pBA) { - HWND button = (HWND)lParam; - DWORD style = GetWindowLong(button, GWL_STYLE) & BS_TYPEMASK; - if (style == BS_COMMANDLINK || style == BS_DEFCOMMANDLINK) { - return (LRESULT)pBA->_theme->rgFonts[pBA->_theme->dwFontId].hBackground; + HBRUSH brush = nullptr; + if (pBA->SetControlColor((HWND)lParam, (HDC)wParam, &brush)) { + return (LRESULT)brush; } } break; @@ -1782,6 +1795,40 @@ private: return SUCCEEDED(hr); } + void RemapColor(COLORREF *fg, COLORREF *bg, HBRUSH *bgBrush) { + if (*fg == RGB(0, 0, 0)) { + *fg = GetSysColor(COLOR_WINDOWTEXT); + } else if (*fg == RGB(128, 128, 128)) { + *fg = GetSysColor(COLOR_GRAYTEXT); + } + if (*bgBrush && *bg == RGB(255, 255, 255)) { + *bg = GetSysColor(COLOR_WINDOW); + *bgBrush = GetSysColorBrush(COLOR_WINDOW); + } + } + + BOOL SetControlColor(HWND hWnd, HDC hDC, HBRUSH *brush) { + for (int i = 0; i < _theme->cControls; ++i) { + if (_theme->rgControls[i].hWnd != hWnd) { + continue; + } + + DWORD fontId = _theme->rgControls[i].dwFontId; + if (fontId > _theme->cFonts) { + fontId = 0; + } + THEME_FONT *fnt = &_theme->rgFonts[fontId]; + + COLORREF fg = fnt->crForeground, bg = fnt->crBackground; + *brush = fnt->hBackground; + RemapColor(&fg, &bg, brush); + SetTextColor(hDC, fg); + SetBkColor(hDC, bg); + + return TRUE; + } + return FALSE; + } // // OnShowFailure - display the failure page. |