From 2bae4332e74923585bc0843f70bfc11e9759c33b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 10 Apr 2005 21:55:12 +0000 Subject: [PATCH] extended wxWindow::MSWGetBgBrush() and wxControl::MSWControlColor() to work for arbitrary HWNDs and not just wxWindows: this allows us to draw proper background for slider labels and other subcontrols git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33488 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/choice.h | 2 +- include/wx/msw/control.h | 4 ++-- include/wx/msw/notebook.h | 2 +- include/wx/msw/textctrl.h | 2 +- include/wx/msw/window.h | 6 +++--- src/msw/choice.cpp | 6 +++--- src/msw/control.cpp | 11 ++++++----- src/msw/notebook.cpp | 6 +++--- src/msw/textctrl.cpp | 4 ++-- src/msw/window.cpp | 23 ++++++++++++----------- 10 files changed, 34 insertions(+), 32 deletions(-) diff --git a/include/wx/msw/choice.h b/include/wx/msw/choice.h index 5348fd5e26..5667010c9a 100644 --- a/include/wx/msw/choice.h +++ b/include/wx/msw/choice.h @@ -84,7 +84,7 @@ public: // MSW only virtual bool MSWCommand(WXUINT param, WXWORD id); WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); - virtual WXHBRUSH MSWControlColor(WXHDC hDC); + virtual WXHBRUSH MSWControlColor(WXHDC hDC, WXHWND hWnd); protected: virtual void DoMoveWindow(int x, int y, int width, int height); diff --git a/include/wx/msw/control.h b/include/wx/msw/control.h index a917a0e449..f220821fbb 100644 --- a/include/wx/msw/control.h +++ b/include/wx/msw/control.h @@ -72,7 +72,7 @@ public: // default handling of WM_CTLCOLORxxx: this is public so that wxWindow // could call it - virtual WXHBRUSH MSWControlColor(WXHDC pDC); + virtual WXHBRUSH MSWControlColor(WXHDC pDC, WXHWND hWnd); protected: // choose the default border for this window @@ -127,7 +127,7 @@ protected: // common part of the 3 functions above: pass wxNullColour to use the // appropriate background colour (meaning ours or our parents) or a fixed // one - virtual WXHBRUSH DoMSWControlColor(WXHDC pDC, wxColour colBg); + virtual WXHBRUSH DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd); // this is a helper for the derived class GetClassDefaultAttributes() // implementation: it returns the right colours for the classes which diff --git a/include/wx/msw/notebook.h b/include/wx/msw/notebook.h index 27e9160960..1ddd735d41 100644 --- a/include/wx/msw/notebook.h +++ b/include/wx/msw/notebook.h @@ -211,7 +211,7 @@ protected: void UpdateBgBrush(); // return the themed brush for painting our children - virtual WXHBRUSH MSWGetBgBrushForChild(WXHDC hDC, wxWindow *win); + virtual WXHBRUSH MSWGetBgBrushForChild(WXHDC hDC, WXHWND hWnd); // draw child background virtual bool MSWPrintChild(WXHDC hDC, wxWindow *win); diff --git a/include/wx/msw/textctrl.h b/include/wx/msw/textctrl.h index 3f09055cdf..5d7815f099 100644 --- a/include/wx/msw/textctrl.h +++ b/include/wx/msw/textctrl.h @@ -148,7 +148,7 @@ public: virtual void Command(wxCommandEvent& event); virtual bool MSWCommand(WXUINT param, WXWORD id); - virtual WXHBRUSH MSWControlColor(WXHDC hDC); + virtual WXHBRUSH MSWControlColor(WXHDC hDC, WXHWND hWnd); #if wxUSE_RICHEDIT virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index dc7bbad256..688cf27772 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -365,15 +365,15 @@ public: // // the base class version returns a solid brush if we have a non default // background colour or 0 otherwise - virtual WXHBRUSH MSWGetBgBrushForChild(WXHDC hDC, wxWindow *child); + virtual WXHBRUSH MSWGetBgBrushForChild(WXHDC hDC, WXHWND hWnd); // return the background brush to use for painting the given window by // quering the parent windows via their MSWGetBgBrushForChild() recursively // - // winToPaint is normally NULL meaning this window itself, but it can also + // hWndToPaint is normally NULL meaning this window itself, but it can also // be a child of this window which is used by the static box and could be // potentially useful for other transparent controls - WXHBRUSH MSWGetBgBrush(WXHDC hDC, wxWindow *winToPaint = NULL); + WXHBRUSH MSWGetBgBrush(WXHDC hDC, WXHWND hWndToPaint = NULL); // gives the parent the possibility to draw its children background, e.g. // this is used by wxNotebook to do it using DrawThemeBackground() diff --git a/src/msw/choice.cpp b/src/msw/choice.cpp index bf0739540f..c8681252f8 100644 --- a/src/msw/choice.cpp +++ b/src/msw/choice.cpp @@ -599,7 +599,7 @@ WXLRESULT wxChoice::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) WXHWND hwnd; UnpackCtlColor(wParam, lParam, &hdc, &hwnd); - WXHBRUSH hbr = MSWControlColor((WXHDC)hdc); + WXHBRUSH hbr = MSWControlColor((WXHDC)hdc, hwnd); if ( hbr ) return (WXLRESULT)hbr; //else: fall through to default window proc @@ -634,12 +634,12 @@ bool wxChoice::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) return true; } -WXHBRUSH wxChoice::MSWControlColor(WXHDC hDC) +WXHBRUSH wxChoice::MSWControlColor(WXHDC hDC, WXHWND hWnd) { if ( !IsEnabled() ) return MSWControlColorDisabled(hDC); - return wxChoiceBase::MSWControlColor(hDC); + return wxChoiceBase::MSWControlColor(hDC, hWnd); } #endif // wxUSE_CHOICE && !(__SMARTPHONE__ && __WXWINCE__) diff --git a/src/msw/control.cpp b/src/msw/control.cpp index d17556945e..d0395958a3 100644 --- a/src/msw/control.cpp +++ b/src/msw/control.cpp @@ -332,7 +332,7 @@ bool wxControl::MSWOnNotify(int idCtrl, } #endif // Win95 -WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg) +WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd) { HDC hdc = (HDC)pDC; if ( m_hasFgCol ) @@ -343,7 +343,7 @@ WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg) WXHBRUSH hbr = 0; if ( !colBg.Ok() ) { - hbr = MSWGetBgBrush(pDC); + hbr = MSWGetBgBrush(pDC, hWnd); // if the control doesn't have any bg colour, foreground colour will be // ignored as the return value would be 0 -- so forcefully give it a @@ -366,7 +366,7 @@ WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg) return hbr; } -WXHBRUSH wxControl::MSWControlColor(WXHDC pDC) +WXHBRUSH wxControl::MSWControlColor(WXHDC pDC, WXHWND hWnd) { wxColour colBg; @@ -375,13 +375,14 @@ WXHBRUSH wxControl::MSWControlColor(WXHDC pDC) else // if the control is opaque it shouldn't use the parents background colBg = GetBackgroundColour(); - return DoMSWControlColor(pDC, colBg); + return DoMSWControlColor(pDC, colBg, hWnd); } WXHBRUSH wxControl::MSWControlColorDisabled(WXHDC pDC) { return DoMSWControlColor(pDC, - wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); + wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE), + GetHWND()); } // --------------------------------------------------------------------------- diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index a9d59425a9..cb09470b78 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -1036,14 +1036,14 @@ void wxNotebook::UpdateBgBrush() } } -WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, wxWindow *win) +WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, WXHWND hWnd) { if ( m_hbrBackground ) { // before drawing with the background brush, we need to position it // correctly RECT rc; - ::GetWindowRect(GetHwndOf(win), &rc); + ::GetWindowRect((HWND)hWnd, &rc); ::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1); @@ -1055,7 +1055,7 @@ WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, wxWindow *win) return m_hbrBackground; } - return wxNotebookBase::MSWGetBgBrushForChild(hDC, win); + return wxNotebookBase::MSWGetBgBrushForChild(hDC, hWnd); } bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child) diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 0d2db8f3ca..7151acb27d 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -1886,12 +1886,12 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) return true; } -WXHBRUSH wxTextCtrl::MSWControlColor(WXHDC hDC) +WXHBRUSH wxTextCtrl::MSWControlColor(WXHDC hDC, WXHWND hWnd) { if ( !IsEnabled() && !HasFlag(wxTE_MULTILINE) ) return MSWControlColorDisabled(hDC); - return wxTextCtrlBase::MSWControlColor(hDC); + return wxTextCtrlBase::MSWControlColor(hDC, hWnd); } bool wxTextCtrl::AdjustSpaceLimit() diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 43d21ba44d..d4d1edf578 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -3707,13 +3707,13 @@ bool wxWindowMSW::HandleDisplayChange() #ifndef __WXMICROWIN__ -bool wxWindowMSW::HandleCtlColor(WXHBRUSH *brush, WXHDC pDC, WXHWND pWnd) +bool wxWindowMSW::HandleCtlColor(WXHBRUSH *brush, WXHDC pDC, WXHWND hWnd) { #if wxUSE_CONTROLS - wxControl *item = wxDynamicCast(FindItemByHWND(pWnd, true), wxControl); + wxControl *item = wxDynamicCast(FindItemByHWND(hWnd, true), wxControl); if ( item ) - *brush = item->MSWControlColor(pDC); + *brush = item->MSWControlColor(pDC, hWnd); else #endif // wxUSE_CONTROLS *brush = NULL; @@ -4003,7 +4003,7 @@ bool wxWindowMSW::DoEraseBackground(WXHDC hDC) } WXHBRUSH -wxWindowMSW::MSWGetBgBrushForChild(WXHDC WXUNUSED(hDC), wxWindow *child) +wxWindowMSW::MSWGetBgBrushForChild(WXHDC WXUNUSED(hDC), WXHWND hWnd) { if ( m_hasBgCol ) { @@ -4015,10 +4015,11 @@ wxWindowMSW::MSWGetBgBrushForChild(WXHDC WXUNUSED(hDC), wxWindow *child) // children because it would look wrong if a child of non // transparent child would show our bg colour when the child itself // does not - if ( child == this || + wxWindow *win = wxFindWinFromHandle(hWnd); + if ( win == this || m_inheritBgCol || - (child->HasTransparentBackground() && - child->GetParent() == this) ) + (win && win->HasTransparentBackground() && + win->GetParent() == this) ) { // draw children with the same colour as the parent wxBrush * @@ -4031,14 +4032,14 @@ wxWindowMSW::MSWGetBgBrushForChild(WXHDC WXUNUSED(hDC), wxWindow *child) return 0; } -WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC, wxWindow *winToPaint) +WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC, WXHWND hWndToPaint) { - if ( !winToPaint ) - winToPaint = this; + if ( !hWndToPaint ) + hWndToPaint = GetHWND(); for ( wxWindowMSW *win = this; win; win = win->GetParent() ) { - WXHBRUSH hBrush = win->MSWGetBgBrushForChild(hDC, winToPaint); + WXHBRUSH hBrush = win->MSWGetBgBrushForChild(hDC, hWndToPaint); if ( hBrush ) return hBrush; -- 2.45.2