From 3092ec5137d25d4cb491e4c0288d72c12e2f3b4a Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 26 Mar 2017 16:46:55 +0000 Subject: [PATCH] [EXPLORER]: Fix most problems with the size of the taskbar. (Most problems when run in windows. Running on ros still isn't perfect.) - CTaskSwitchWnd: Use the height of the start button as minimum height in horizontal mode. - CTrayClockWnd: Actually process WM_THEMECHANGED message. - CTaskSwitchWnd: Use SM_CYSIZE as the height of the buttons of the toolbar. - CStartButton: Simplify calculating the minimum size of the button. - CTrayWindow: Don't use IsThemeActive. Checking if OpenThemeData returned non null is enough. svn path=/trunk/; revision=74231 --- reactos/base/shell/explorer/precomp.h | 2 +- reactos/base/shell/explorer/taskband.cpp | 13 ++++++++---- reactos/base/shell/explorer/taskswnd.cpp | 2 +- reactos/base/shell/explorer/trayntfy.cpp | 4 +--- reactos/base/shell/explorer/traywnd.cpp | 26 +++++++++++------------- 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/reactos/base/shell/explorer/precomp.h b/reactos/base/shell/explorer/precomp.h index 286cafbfb0f..eeb646f0dc2 100644 --- a/reactos/base/shell/explorer/precomp.h +++ b/reactos/base/shell/explorer/precomp.h @@ -233,7 +233,7 @@ ShowCustomizeNotifyIcons(HINSTANCE, HWND); */ extern const GUID CLSID_ITaskBand; /* Internal Task Band CLSID */ -HRESULT CTaskBand_CreateInstance(IN ITrayWindow *Tray, REFIID riid, void **ppv); +HRESULT CTaskBand_CreateInstance(IN ITrayWindow *Tray, HWND hWndStartButton, REFIID riid, void **ppv); /* * tbsite.cpp diff --git a/reactos/base/shell/explorer/taskband.cpp b/reactos/base/shell/explorer/taskband.cpp index 230ac9e9aea..1186367e279 100644 --- a/reactos/base/shell/explorer/taskband.cpp +++ b/reactos/base/shell/explorer/taskband.cpp @@ -40,6 +40,7 @@ class CTaskBand : CComPtr m_Site; HWND m_hWnd; + HWND m_hWndStartButton; DWORD m_BandID; public: @@ -124,7 +125,10 @@ public: } else { - pdbi->ptMinSize.y = GetSystemMetrics(SM_CYSIZE) + (2 * GetSystemMetrics(SM_CYEDGE)); /* FIXME: Query */ + /* When the band is horizontal its minimum height is the height of the start button */ + RECT rcButton; + GetWindowRect(m_hWndStartButton, &rcButton); + pdbi->ptMinSize.y = rcButton.bottom - rcButton.top; pdbi->ptIntegral.y = pdbi->ptMinSize.y + (3 * GetSystemMetrics(SM_CYEDGE) / 2); /* FIXME: Query metrics */ /* We're not going to allow task bands where not even the minimum button size fits into the band */ pdbi->ptMinSize.x = pdbi->ptIntegral.y; @@ -327,10 +331,11 @@ public: /*****************************************************************************/ - HRESULT STDMETHODCALLTYPE Initialize(IN OUT ITrayWindow *tray) + HRESULT STDMETHODCALLTYPE Initialize(IN OUT ITrayWindow *tray, HWND hWndStartButton) { m_Tray = tray; m_BandID = (DWORD) -1; + m_hWndStartButton = hWndStartButton; return S_OK; } @@ -348,7 +353,7 @@ public: END_COM_MAP() }; -HRESULT CTaskBand_CreateInstance(IN ITrayWindow *Tray, REFIID riid, void **ppv) +HRESULT CTaskBand_CreateInstance(IN ITrayWindow *Tray, HWND hWndStartButton, REFIID riid, void **ppv) { - return ShellObjectCreatorInit(Tray, riid, ppv); + return ShellObjectCreatorInit(Tray, hWndStartButton, riid, ppv); } diff --git a/reactos/base/shell/explorer/taskswnd.cpp b/reactos/base/shell/explorer/taskswnd.cpp index b08ad604463..3d89bd4240a 100644 --- a/reactos/base/shell/explorer/taskswnd.cpp +++ b/reactos/base/shell/explorer/taskswnd.cpp @@ -1146,7 +1146,7 @@ public: BOOL Horizontal; int cx = GetSystemMetrics(SM_CXMINIMIZED); - int cy = m_ButtonSize.cy = GetSystemMetrics(SM_CYSIZE) + (2 * GetSystemMetrics(SM_CYEDGE)); + int cy = m_ButtonSize.cy = GetSystemMetrics(SM_CYSIZE); m_TaskBar.SetButtonSize(cx, cy); if (GetClientRect(&rcClient) && !IsRectEmpty(&rcClient)) diff --git a/reactos/base/shell/explorer/trayntfy.cpp b/reactos/base/shell/explorer/trayntfy.cpp index 49208eaa412..4696ae336f5 100644 --- a/reactos/base/shell/explorer/trayntfy.cpp +++ b/reactos/base/shell/explorer/trayntfy.cpp @@ -1206,6 +1206,7 @@ public: MESSAGE_HANDLER(WM_SIZE, OnSize) MESSAGE_HANDLER(WM_PAINT, OnPaint) MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) + MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged) MESSAGE_HANDLER(WM_TIMER, OnTimer) MESSAGE_HANDLER(WM_NCHITTEST, OnNcHitTest) MESSAGE_HANDLER(WM_SETFONT, OnSetFont) @@ -1229,10 +1230,7 @@ public: Create(hWndParent, 0, NULL, dwStyle); if (m_hWnd != NULL) - { SetWindowTheme(m_hWnd, L"TrayNotify", NULL); - OnThemeChanged(); - } return m_hWnd; diff --git a/reactos/base/shell/explorer/traywnd.cpp b/reactos/base/shell/explorer/traywnd.cpp index a8bc029b9fe..8743f04e24f 100644 --- a/reactos/base/shell/explorer/traywnd.cpp +++ b/reactos/base/shell/explorer/traywnd.cpp @@ -101,10 +101,7 @@ public: Size.cx = 2 * GetSystemMetrics(SM_CXEDGE) + GetSystemMetrics(SM_CYCAPTION) * 3; } - if (GetWindowTheme(m_hWnd)) - Size.cy = max(Size.cy, GetSystemMetrics(SM_CYCAPTION)); - else - Size.cy = max(Size.cy, GetSystemMetrics(SM_CYSIZE) + (2 * GetSystemMetrics(SM_CYEDGE))); + Size.cy = max(Size.cy, GetSystemMetrics(SM_CYCAPTION)); /* Save the size of the start button */ m_Size = Size; @@ -732,6 +729,10 @@ public: void UpdateFonts() { + /* There is nothing to do if themes are not enabled */ + if (m_Theme) + return; + m_StartButton.UpdateFont(); NONCLIENTMETRICS ncm = {sizeof(ncm)}; @@ -902,7 +903,7 @@ GetPrimaryRect: *pRect = *pScreen; - if(!IsThemeActive()) + if(!m_Theme) { /* Move the border outside of the screen */ InflateRect(pRect, @@ -1407,7 +1408,7 @@ ChangePos: entire window size, not just the client size. However, we use a thinner border than a standard thick border, so that the start button and bands are not stuck to the screen border. */ - if(!IsThemeActive()) + if(!m_Theme) { sr.Size.cx = StartBtnSize.cx + (2 * (EdgeSize.cx + DlgFrameSize.cx)); sr.Size.cy = StartBtnSize.cy + (2 * (EdgeSize.cy + DlgFrameSize.cy)); @@ -1445,7 +1446,7 @@ ChangePos: loaded from the registry are at least. The windows explorer behaves the same way, it allows the user to save a zero width vertical tray window, but not a zero height horizontal tray window. */ - if(!IsThemeActive()) + if(!m_Theme) { WndSize.cx = 2 * (EdgeSize.cx + DlgFrameSize.cx); WndSize.cy = StartBtnSize.cy + (2 * (EdgeSize.cy + DlgFrameSize.cy)); @@ -1970,7 +1971,7 @@ ChangePos: dwExStyle |= WS_EX_TOPMOST; DWORD dwStyle = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; - if(!IsThemeActive()) + if(!m_Theme) { dwStyle |= WS_THICKFRAME | WS_BORDER; } @@ -2098,7 +2099,7 @@ ChangePos: m_StartMenuPopup = CreateStartMenu(this, &m_StartMenuBand, hbmBanner, 0); /* Create the task band */ - hRet = CTaskBand_CreateInstance(this, IID_PPV_ARG(IDeskBand, &m_TaskBand)); + hRet = CTaskBand_CreateInstance(this, m_StartButton.m_hWnd, IID_PPV_ARG(IDeskBand, &m_TaskBand)); if (FAILED_UNEXPECTEDLY(hRet)) return FALSE; @@ -2153,10 +2154,7 @@ ChangePos: if (m_Theme) CloseThemeData(m_Theme); - if (IsThemeActive()) - m_Theme = OpenThemeData(m_hWnd, L"TaskBar"); - else - m_Theme = NULL; + m_Theme = OpenThemeData(m_hWnd, L"TaskBar"); if (m_Theme) { @@ -2690,7 +2688,7 @@ HandleTrayContextMenu: { RECT *rc = NULL; /* Ignore WM_NCCALCSIZE if we are not themed or locked */ - if(!IsThemeActive() || Locked) + if(!m_Theme || Locked) { bHandled = FALSE; return 0;