return 0;
}
+ if ( nMsg == WM_UPDATEUISTATE )
+ {
+ // DefWindowProc() redraws just the static box text when it gets this
+ // message and it does it using the standard (blue in standard theme)
+ // colour and not our own label colour that we use in PaintForeground()
+ // resulting in the label mysteriously changing the colour when e.g.
+ // "Alt" is pressed anywhere in the window, see #12497.
+ //
+ // To avoid this we simply refresh the window forcing our own code
+ // redrawing the label in the correct colour to be called. This is
+ // inefficient but there doesn't seem to be anything else we can do.
+ //
+ // Notice that the problem is XP-specific and doesn't arise under later
+ // systems.
+ if ( m_hasFgCol && wxGetWinVersion() == wxWinVersion_XP )
+ Refresh();
+ }
+
return wxControl::MSWWindowProc(nMsg, wParam, lParam);
}
// we did it
// 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();
wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl();
- HBRUSH hbr = (HBRUSH)parent->MSWGetBgBrush(impl->GetHDC(), GetHWND());
+ HBRUSH hbr = MSWGetBgBrush(impl->GetHDC());
// if there is no special brush for painting this control, just use the
// solid background colour
wxBrush brush;
if ( !hbr )
{
- brush = wxBrush(parent->GetBackgroundColour());
+ brush = wxBrush(GetParent()->GetBackgroundColour());
hbr = GetHbrushOf(brush);
}
PaintBackground(dc, dimensions);
}
+ UINT drawTextFlags = DT_SINGLELINE | DT_VCENTER;
+
+ // determine the state of UI queues to draw the text correctly under XP
+ // and later systems
+ static const bool isXPorLater = wxGetWinVersion() >= wxWinVersion_XP;
+ if ( isXPorLater )
+ {
+ if ( ::SendMessage(GetHwnd(), WM_QUERYUISTATE, 0, 0) &
+ UISF_HIDEACCEL )
+ {
+ drawTextFlags |= DT_HIDEPREFIX;
+ }
+ }
+
// now draw the text
if ( !rtl )
{
RECT rc2 = { x, 0, x + width, y };
::DrawText(hdc, label.wx_str(), label.length(), &rc2,
- DT_SINGLELINE | DT_VCENTER);
+ drawTextFlags);
}
else // RTL
{
RECT rc2 = { x, 0, x - width, y };
::DrawText(hdc, label.wx_str(), label.length(), &rc2,
- DT_SINGLELINE | DT_VCENTER | DT_RTLREADING);
+ drawTextFlags | DT_RTLREADING);
}
}
}