bool wxWindowMSW::HandlePaint()
{
-// if (GetExtraStyle() & wxWS_EX_THEMED_BACKGROUND)
-// return false;
-
HRGN hRegion = ::CreateRectRgn(0, 0, 0, 0); // Dummy call to get a handle
if ( !hRegion )
wxLogLastError(wxT("CreateRectRgn"));
bool wxWindowMSW::HandleEraseBkgnd(WXHDC hdc)
{
- // Prevents flicker when dragging
- if ( ::IsIconic(GetHwnd()) )
- return true;
-
wxDCTemp dc(hdc);
dc.SetHDC(hdc);
void wxWindowMSW::OnEraseBackground(wxEraseEvent& event)
{
- switch ( GetBackgroundStyle() )
+ // standard controls always erase their background themselves (although the
+ // user may try to override it in a derived class)
+ if ( IsOfStandardClass() )
{
- default:
- wxFAIL_MSG( _T("unexpected background style") );
- // fall through
+ event.Skip();
+ return;
+ }
- case wxBG_STYLE_CUSTOM:
- // don't skip the event here, custom background means that the app
- // is drawing it itself in its OnPaint()
- break;
+ if ( GetBackgroundStyle() == wxBG_STYLE_CUSTOM )
+ {
+ // don't skip the event here, custom background means that the app
+ // is drawing it itself in its OnPaint(), so don't draw it at all
+ // now to avoid flicker
+ return;
+ }
- case wxBG_STYLE_SYSTEM:
-#if wxUSE_NOTEBOOK && wxUSE_UXTHEME && !defined(__WXUNIVERSAL__)
- // automatically apply the tab control theme background to any
- // child panels to have the same look as the native property sheet
- // dialogs
- if ( !IsOfStandardClass() )
- {
- for ( wxWindow *win = this; win; win = win->GetParent() )
- {
- wxNotebook *nbook = wxDynamicCast(win, wxNotebook);
- if ( nbook )
- {
- nbook->DoEraseBackground(event);
- return;
- }
- }
- }
-#endif // wxUSE_NOTEBOOK
- event.Skip();
- break;
- case wxBG_STYLE_COLOUR:
- // we have a fixed solid background colour, do use it
- RECT rect;
- ::GetClientRect(GetHwnd(), &rect);
+ // do default background painting
+ wxDC& dc = *event.GetDC();
+ HBRUSH hBrush = (HBRUSH)MSWGetBgBrush(dc.GetHDC());
+ if ( hBrush )
+ {
+ RECT rc;
+ ::GetClientRect(GetHwnd(), &rc);
+ ::FillRect(GetHdcOf(dc), &rc, hBrush);
+ }
+ else
+ {
+ // let the system paint the background
+ event.Skip();
+ }
+}
- HBRUSH hBrush = ::CreateSolidBrush(
- wxColourToPalRGB(GetBackgroundColour()));
- if ( !hBrush )
- wxLogLastError(wxT("CreateSolidBrush"));
+WXHBRUSH wxWindowMSW::MSWGetSolidBgBrushForChild(wxWindow *child)
+{
+ wxColour col = MSWGetBgColourForChild(child);
+ if ( col.Ok() )
+ {
+ // draw children with the same colour as the parent
+ wxBrush *brush = wxTheBrushList->FindOrCreateBrush(col, wxSOLID);
- HDC hdc = GetHdcOf((*event.GetDC()));
+ return (WXHBRUSH)brush->GetResourceHandle();
+ }
- ::FillRect(hdc, &rect, hBrush);
- ::DeleteObject(hBrush);
+ return 0;
+}
+
+wxColour wxWindowMSW::MSWGetBgColourForChild(wxWindow * WXUNUSED(child))
+{
+ return m_hasBgCol ? GetBackgroundColour() : wxNullColour;
+}
+
+WXHBRUSH wxWindowMSW::MSWGetBgBrushForSelf(wxWindow *parent, WXHDC hDC)
+{
+ return parent->MSWGetBgBrushForChild(hDC, (wxWindow *)this);
+}
+
+WXHBRUSH wxWindowMSW::MSWGetBgBrush(WXHDC hDC)
+{
+ for ( wxWindow *win = (wxWindow *)this; win; win = win->GetParent() )
+ {
+ // background is not inherited beyond the containing TLW
+ if ( win->IsTopLevel() )
+ break;
+
+ WXHBRUSH hBrush = MSWGetBgBrushForSelf(win, hDC);
+ if ( hBrush )
+ return hBrush;
}
+
+ return 0;
}
// ---------------------------------------------------------------------------
case VK_NUMLOCK: id = WXK_NUMLOCK; break;
case VK_SCROLL: id = WXK_SCROLL; break;
+ // the mapping for these keys may be incorrect on non-US keyboards so
+ // maybe we shouldn't map them to ASCII values at all
case VK_OEM_1: id = ';'; break;
- case VK_OEM_PLUS: id = '='; break;
+ case VK_OEM_PLUS: id = '+'; break;
case VK_OEM_COMMA: id = ','; break;
case VK_OEM_MINUS: id = '-'; break;
case VK_OEM_PERIOD: id = '.'; break;
bool bVirtual;
//High order with GetAsyncKeyState only available on WIN32
-#ifdef __WIN32__
+#ifdef __WIN32__
//If the requested key is a LED key, return
//true if the led is pressed
if (key == WXK_NUMLOCK ||
key == WXK_SCROLL)
{
#endif
- //low order bit means LED is highlighted,
+ //low order bit means LED is highlighted,
//high order means key is down
//Here, for compat with other ports we want both
return GetKeyState( wxCharCodeWXToMSW(key, &bVirtual) ) != 0;
-#ifdef __WIN32__
+#ifdef __WIN32__
}
else
{
static LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MSG *msg = (MSG*)lParam;
- if ( msg->message == WM_NULL )
+
+ // only process the message if it is actually going to be removed from
+ // the message queue, this prevents that the same event from being
+ // processed multiple times if now someone just called PeekMessage()
+ if ( msg->message == WM_NULL && wParam == PM_REMOVE )
{
wxTheApp->ProcessPendingEvents();
}