#include "wx/msw/uxtheme.h"
#include "wx/msw/private.h"
#include "wx/msw/missing.h"
+#include "wx/msw/dc.h"
// the values coincide with those in tmschema.h
#define BP_GROUPBOX 4
return true;
}
-wxBorder wxStaticBox::GetDefaultBorder() const
-{
- return wxBORDER_NONE;
-}
-
WXDWORD wxStaticBox::MSWGetStyle(long style, WXDWORD *exstyle) const
{
long styleWin = wxStaticBoxBase::MSWGetStyle(style, exstyle);
AutoHRGN hrgnRect(::CreateRectRgn(left, top, right, bottom));
if ( !hrgnRect )
{
- wxLogLastError(_T("CreateRectRgn()"));
+ wxLogLastError(wxT("CreateRectRgn()"));
return;
}
// 3. this is backwards compatible behaviour and some people rely on it,
// see http://groups.google.com/groups?selm=4252E932.3080801%40able.es
wxWindow *parent = GetParent();
- HBRUSH hbr = (HBRUSH)parent->MSWGetBgBrush(dc.GetHDC(), GetHWND());
+ wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl();
+ HBRUSH hbr = (HBRUSH)parent->MSWGetBgBrush(impl->GetHDC(), this);
// if there is no special brush for painting this control, just use the
// solid background colour
hbr = GetHbrushOf(brush);
}
- ::FillRect(GetHdcOf(dc), &rc, hbr);
+ ::FillRect(GetHdcOf(*impl), &rc, hbr);
}
void wxStaticBox::PaintForeground(wxDC& dc, const RECT& rc)
{
- MSWDefWindowProc(WM_PAINT, (WPARAM)GetHdcOf(dc), 0);
+ wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl();
+ MSWDefWindowProc(WM_PAINT, (WPARAM)GetHdcOf(*impl), 0);
// when using XP themes, neither setting the text colour nor transparent
// background mode doesn't change anything: the static box def window proc
if ( m_hasFgCol && wxUxThemeEngine::GetIfActive() )
{
// draw over the text in default colour in our colour
- HDC hdc = GetHdcOf(dc);
+ HDC hdc = GetHdcOf(*impl);
::SetTextColor(hdc, GetForegroundColour().GetPixel());
const bool rtl = wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft;
dimensions.right += 2;
dimensions.bottom += 2;
- PaintBackground(dc, dimensions);
+ if ( UseBgCol() )
+ {
+ // our own background colour should be used for the background of
+ // the label: this is consistent with the behaviour under pre-XP
+ // systems (i.e. without visual themes) and generally makes sense
+ wxBrush brush = wxBrush(GetBackgroundColour());
+ wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl();
+ ::FillRect(GetHdcOf(*impl), &dimensions, GetHbrushOf(brush));
+ }
+ else // paint parent background
+ {
+ PaintBackground(dc, dimensions);
+ }
// now draw the text
if ( !rtl )
{
RECT rc2 = { x, 0, x + width, y };
- ::DrawText(hdc, label, label.length(), &rc2,
+ ::DrawText(hdc, label.wx_str(), label.length(), &rc2,
DT_SINGLELINE | DT_VCENTER);
}
else // RTL
{
RECT rc2 = { x, 0, x - width, y };
- ::DrawText(hdc, label, label.length(), &rc2,
+ ::DrawText(hdc, label.wx_str(), label.length(), &rc2,
DT_SINGLELINE | DT_VCENTER | DT_RTLREADING);
}
}
dc.Blit(border, 0, rc.right - border, borderTop,
&memdc, border, 0);
// bottom
- dc.Blit(border, rc.bottom - border, rc.right - border, rc.bottom,
+ dc.Blit(border, rc.bottom - border, rc.right - border, border,
&memdc, border, rc.bottom - border);
// left
dc.Blit(0, 0, border, rc.bottom,
&memdc, 0, 0);
- // right
- dc.Blit(rc.right - border, 0, rc.right, rc.bottom,
- &memdc, rc.right - border, 0);
+ // right (note that upper and bottom right corners were already part of the
+ // first two blits so we shouldn't overwrite them here to avoi flicker)
+ dc.Blit(rc.right - border, borderTop,
+ border, rc.bottom - borderTop - border,
+ &memdc, rc.right - border, borderTop);
// create the region excluding box children
// and also the box itself
MSWGetRegionWithoutSelf((WXHRGN) hrgn, rc.right, rc.bottom);
- HDCClipper clipToBg(GetHdcOf(dc), hrgn);
+ wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl();
+ HDCClipper clipToBg(GetHdcOf(*impl), hrgn);
// paint the inside of the box (excluding box itself and child controls)
PaintBackground(dc, rc);