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
This commit is contained in:
Vadim Zeitlin 2005-04-10 21:55:12 +00:00
parent 9a81018ee1
commit 2bae4332e7
10 changed files with 34 additions and 32 deletions

View File

@ -84,7 +84,7 @@ public:
// MSW only // MSW only
virtual bool MSWCommand(WXUINT param, WXWORD id); virtual bool MSWCommand(WXUINT param, WXWORD id);
WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
virtual WXHBRUSH MSWControlColor(WXHDC hDC); virtual WXHBRUSH MSWControlColor(WXHDC hDC, WXHWND hWnd);
protected: protected:
virtual void DoMoveWindow(int x, int y, int width, int height); virtual void DoMoveWindow(int x, int y, int width, int height);

View File

@ -72,7 +72,7 @@ public:
// default handling of WM_CTLCOLORxxx: this is public so that wxWindow // default handling of WM_CTLCOLORxxx: this is public so that wxWindow
// could call it // could call it
virtual WXHBRUSH MSWControlColor(WXHDC pDC); virtual WXHBRUSH MSWControlColor(WXHDC pDC, WXHWND hWnd);
protected: protected:
// choose the default border for this window // choose the default border for this window
@ -127,7 +127,7 @@ protected:
// common part of the 3 functions above: pass wxNullColour to use the // common part of the 3 functions above: pass wxNullColour to use the
// appropriate background colour (meaning ours or our parents) or a fixed // appropriate background colour (meaning ours or our parents) or a fixed
// one // 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() // this is a helper for the derived class GetClassDefaultAttributes()
// implementation: it returns the right colours for the classes which // implementation: it returns the right colours for the classes which

View File

@ -211,7 +211,7 @@ protected:
void UpdateBgBrush(); void UpdateBgBrush();
// return the themed brush for painting our children // 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 // draw child background
virtual bool MSWPrintChild(WXHDC hDC, wxWindow *win); virtual bool MSWPrintChild(WXHDC hDC, wxWindow *win);

View File

@ -148,7 +148,7 @@ public:
virtual void Command(wxCommandEvent& event); virtual void Command(wxCommandEvent& event);
virtual bool MSWCommand(WXUINT param, WXWORD id); virtual bool MSWCommand(WXUINT param, WXWORD id);
virtual WXHBRUSH MSWControlColor(WXHDC hDC); virtual WXHBRUSH MSWControlColor(WXHDC hDC, WXHWND hWnd);
#if wxUSE_RICHEDIT #if wxUSE_RICHEDIT
virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);

View File

@ -365,15 +365,15 @@ public:
// //
// the base class version returns a solid brush if we have a non default // the base class version returns a solid brush if we have a non default
// background colour or 0 otherwise // 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 // return the background brush to use for painting the given window by
// quering the parent windows via their MSWGetBgBrushForChild() recursively // 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 // be a child of this window which is used by the static box and could be
// potentially useful for other transparent controls // 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. // gives the parent the possibility to draw its children background, e.g.
// this is used by wxNotebook to do it using DrawThemeBackground() // this is used by wxNotebook to do it using DrawThemeBackground()

View File

@ -599,7 +599,7 @@ WXLRESULT wxChoice::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
WXHWND hwnd; WXHWND hwnd;
UnpackCtlColor(wParam, lParam, &hdc, &hwnd); UnpackCtlColor(wParam, lParam, &hdc, &hwnd);
WXHBRUSH hbr = MSWControlColor((WXHDC)hdc); WXHBRUSH hbr = MSWControlColor((WXHDC)hdc, hwnd);
if ( hbr ) if ( hbr )
return (WXLRESULT)hbr; return (WXLRESULT)hbr;
//else: fall through to default window proc //else: fall through to default window proc
@ -634,12 +634,12 @@ bool wxChoice::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
return true; return true;
} }
WXHBRUSH wxChoice::MSWControlColor(WXHDC hDC) WXHBRUSH wxChoice::MSWControlColor(WXHDC hDC, WXHWND hWnd)
{ {
if ( !IsEnabled() ) if ( !IsEnabled() )
return MSWControlColorDisabled(hDC); return MSWControlColorDisabled(hDC);
return wxChoiceBase::MSWControlColor(hDC); return wxChoiceBase::MSWControlColor(hDC, hWnd);
} }
#endif // wxUSE_CHOICE && !(__SMARTPHONE__ && __WXWINCE__) #endif // wxUSE_CHOICE && !(__SMARTPHONE__ && __WXWINCE__)

View File

@ -332,7 +332,7 @@ bool wxControl::MSWOnNotify(int idCtrl,
} }
#endif // Win95 #endif // Win95
WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg) WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd)
{ {
HDC hdc = (HDC)pDC; HDC hdc = (HDC)pDC;
if ( m_hasFgCol ) if ( m_hasFgCol )
@ -343,7 +343,7 @@ WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg)
WXHBRUSH hbr = 0; WXHBRUSH hbr = 0;
if ( !colBg.Ok() ) if ( !colBg.Ok() )
{ {
hbr = MSWGetBgBrush(pDC); hbr = MSWGetBgBrush(pDC, hWnd);
// if the control doesn't have any bg colour, foreground colour will be // 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 // 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; return hbr;
} }
WXHBRUSH wxControl::MSWControlColor(WXHDC pDC) WXHBRUSH wxControl::MSWControlColor(WXHDC pDC, WXHWND hWnd)
{ {
wxColour colBg; wxColour colBg;
@ -375,13 +375,14 @@ WXHBRUSH wxControl::MSWControlColor(WXHDC pDC)
else // if the control is opaque it shouldn't use the parents background else // if the control is opaque it shouldn't use the parents background
colBg = GetBackgroundColour(); colBg = GetBackgroundColour();
return DoMSWControlColor(pDC, colBg); return DoMSWControlColor(pDC, colBg, hWnd);
} }
WXHBRUSH wxControl::MSWControlColorDisabled(WXHDC pDC) WXHBRUSH wxControl::MSWControlColorDisabled(WXHDC pDC)
{ {
return DoMSWControlColor(pDC, return DoMSWControlColor(pDC,
wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE),
GetHWND());
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

View File

@ -1036,14 +1036,14 @@ void wxNotebook::UpdateBgBrush()
} }
} }
WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, wxWindow *win) WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, WXHWND hWnd)
{ {
if ( m_hbrBackground ) if ( m_hbrBackground )
{ {
// before drawing with the background brush, we need to position it // before drawing with the background brush, we need to position it
// correctly // correctly
RECT rc; RECT rc;
::GetWindowRect(GetHwndOf(win), &rc); ::GetWindowRect((HWND)hWnd, &rc);
::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1); ::MapWindowPoints(NULL, GetHwnd(), (POINT *)&rc, 1);
@ -1055,7 +1055,7 @@ WXHBRUSH wxNotebook::MSWGetBgBrushForChild(WXHDC hDC, wxWindow *win)
return m_hbrBackground; return m_hbrBackground;
} }
return wxNotebookBase::MSWGetBgBrushForChild(hDC, win); return wxNotebookBase::MSWGetBgBrushForChild(hDC, hWnd);
} }
bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child) bool wxNotebook::MSWPrintChild(WXHDC hDC, wxWindow *child)

View File

@ -1886,12 +1886,12 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
return true; return true;
} }
WXHBRUSH wxTextCtrl::MSWControlColor(WXHDC hDC) WXHBRUSH wxTextCtrl::MSWControlColor(WXHDC hDC, WXHWND hWnd)
{ {
if ( !IsEnabled() && !HasFlag(wxTE_MULTILINE) ) if ( !IsEnabled() && !HasFlag(wxTE_MULTILINE) )
return MSWControlColorDisabled(hDC); return MSWControlColorDisabled(hDC);
return wxTextCtrlBase::MSWControlColor(hDC); return wxTextCtrlBase::MSWControlColor(hDC, hWnd);
} }
bool wxTextCtrl::AdjustSpaceLimit() bool wxTextCtrl::AdjustSpaceLimit()

View File

@ -3707,13 +3707,13 @@ bool wxWindowMSW::HandleDisplayChange()
#ifndef __WXMICROWIN__ #ifndef __WXMICROWIN__
bool wxWindowMSW::HandleCtlColor(WXHBRUSH *brush, WXHDC pDC, WXHWND pWnd) bool wxWindowMSW::HandleCtlColor(WXHBRUSH *brush, WXHDC pDC, WXHWND hWnd)
{ {
#if wxUSE_CONTROLS #if wxUSE_CONTROLS
wxControl *item = wxDynamicCast(FindItemByHWND(pWnd, true), wxControl); wxControl *item = wxDynamicCast(FindItemByHWND(hWnd, true), wxControl);
if ( item ) if ( item )
*brush = item->MSWControlColor(pDC); *brush = item->MSWControlColor(pDC, hWnd);
else else
#endif // wxUSE_CONTROLS #endif // wxUSE_CONTROLS
*brush = NULL; *brush = NULL;
@ -4003,7 +4003,7 @@ bool wxWindowMSW::DoEraseBackground(WXHDC hDC)
} }
WXHBRUSH WXHBRUSH
wxWindowMSW::MSWGetBgBrushForChild(WXHDC WXUNUSED(hDC), wxWindow *child) wxWindowMSW::MSWGetBgBrushForChild(WXHDC WXUNUSED(hDC), WXHWND hWnd)
{ {
if ( m_hasBgCol ) 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 // children because it would look wrong if a child of non
// transparent child would show our bg colour when the child itself // transparent child would show our bg colour when the child itself
// does not // does not
if ( child == this || wxWindow *win = wxFindWinFromHandle(hWnd);
if ( win == this ||
m_inheritBgCol || m_inheritBgCol ||
(child->HasTransparentBackground() && (win && win->HasTransparentBackground() &&
child->GetParent() == this) ) win->GetParent() == this) )
{ {
// draw children with the same colour as the parent // draw children with the same colour as the parent
wxBrush * wxBrush *
@ -4031,14 +4032,14 @@ wxWindowMSW::MSWGetBgBrushForChild(WXHDC WXUNUSED(hDC), wxWindow *child)
return 0; return 0;
} }
WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC, wxWindow *winToPaint) WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC, WXHWND hWndToPaint)
{ {
if ( !winToPaint ) if ( !hWndToPaint )
winToPaint = this; hWndToPaint = GetHWND();
for ( wxWindowMSW *win = this; win; win = win->GetParent() ) for ( wxWindowMSW *win = this; win; win = win->GetParent() )
{ {
WXHBRUSH hBrush = win->MSWGetBgBrushForChild(hDC, winToPaint); WXHBRUSH hBrush = win->MSWGetBgBrushForChild(hDC, hWndToPaint);
if ( hBrush ) if ( hBrush )
return hBrush; return hBrush;