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:
parent
9a81018ee1
commit
2bae4332e7
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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()
|
||||||
|
@ -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__)
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@ -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)
|
||||||
|
@ -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()
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user