- Fixed ownerdrawn multiline buttons.
- wxCheckListBox item background fixed.
- Fixed error when trying to read a value from key not accessible for writing.
+- Fixed keyboard cue visibility issues under Windows 2000/XP
wxWinCE:
// the background, false otherwise (i.e. the system should erase it)
bool DoEraseBackground(WXHDC hDC);
+ // generate WM_UPDATEUISTATE if it's needed for the OS we're running under
+ void MSWUpdateUIState();
+
private:
// common part of all ctors
void Init();
}
#endif
- // for some reason we need to manually send ourselves this message as
- // otherwise the mnemonics are always shown -- even if they're configured
- // to be hidden until "Alt" is pressed in the control panel
- //
- // this could indicate a bug somewhere else but for now this is the only
- // fix we have
+ // for standard dialogs the dialog manager generates WM_CHANGEUISTATE
+ // itself but for custom windows we have to do it ourselves in order to
+ // make the keyboard indicators (such as underlines for accelerators and
+ // focus rectangles) work under Win2k+
if ( ret )
{
- ::SendMessage
- (
- GetHwnd(),
- WM_UPDATEUISTATE,
- MAKEWPARAM(UIS_INITIALIZE, UISF_HIDEFOCUS | UISF_HIDEACCEL),
- 0
- );
+ MSWUpdateUIState();
}
// Note: if we include PocketPC in this test, dialogs can fail to show up,
return true;
}
-void wxWindowMSW::WarpPointer (int x, int y)
+void wxWindowMSW::WarpPointer(int x, int y)
{
ClientToScreen(&x, &y);
}
}
+void wxWindowMSW::MSWUpdateUIState()
+{
+ // WM_UPDATEUISTATE only appeared in Windows 2000 so it can do us no good
+ // to use it on older systems -- and could possibly do some harm
+ static int s_needToUpdate = -1;
+ if ( s_needToUpdate == -1 )
+ {
+ int verMaj, verMin;
+ s_needToUpdate = wxGetOsVersion(&verMaj, &verMin) == wxWINDOWS_NT &&
+ verMaj >= 5;
+ }
+
+ if ( s_needToUpdate )
+ {
+ // NB: it doesn't seem to matter what we put in wParam, whether we
+ // include just one UISF_XXX or both, both are affected, no idea
+ // why
+ ::SendMessage(GetHwnd(), WM_UPDATEUISTATE,
+ MAKEWPARAM(UIS_INITIALIZE,
+ UISF_HIDEFOCUS | UISF_HIDEACCEL), 0);
+ }
+}
+
// ---------------------------------------------------------------------------
// scrolling stuff
// ---------------------------------------------------------------------------
if ( GetEventHandler()->ProcessEvent(event) )
{
+ // as we don't call IsDialogMessage(), which would take of
+ // this by default, we need to manually send this message
+ // so that controls could change their appearance
+ // appropriately
+ MSWUpdateUIState();
+
return true;
}
}