Fix handling of ampersands in wxCheckListBox under MSW

They were incorrectly interpreted as mnemonics when drawing
wxCheckListBox items, which didn't make sense and was inconsistent with
the other ports and even wxListBox in wxMSW itself.

It also affected wxRearrangeCtrl under MSW, which uses wxCheckListBox
for its implementation.

Closes #19201.
This commit is contained in:
Vadim Zeitlin
2021-06-16 19:12:32 +01:00
parent 6f9826ea69
commit 2d9c9d9689
3 changed files with 22 additions and 1 deletions

View File

@@ -21,6 +21,12 @@ public:
virtual bool OnDrawItem(wxDC& dc, const wxRect& rc,
wxODAction act, wxODStatus stat) wxOVERRIDE;
protected:
// get the type of the text to draw in OnDrawItem(), by default is
// DST_PREFIXTEXT but can be overridden to return DST_TEXT when not using
// mnemonics
virtual int MSWGetTextType() const;
};
#endif // wxUSE_OWNER_DRAWN

View File

@@ -100,6 +100,15 @@ public:
void Toggle()
{ Check(!IsChecked()); }
protected:
virtual int MSWGetTextType() const wxOVERRIDE
{
// Don't handle mnemonics in the label specially, they don't make sense
// for the listbox items that can't be activated from keyboard using
// them.
return DST_TEXT;
}
private:
wxCheckListBox *m_parent;
bool m_checked;

View File

@@ -24,6 +24,12 @@
// implementation of wxOwnerDrawn class
// ============================================================================
int wxOwnerDrawn::MSWGetTextType() const
{
// By default, handle the mnemonics.
return DST_PREFIXTEXT;
}
// draw the item
bool wxOwnerDrawn::OnDrawItem(wxDC& dc, const wxRect& rc,
wxODAction, wxODStatus stat)
@@ -64,7 +70,7 @@ bool wxOwnerDrawn::OnDrawItem(wxDC& dc, const wxRect& rc,
SIZE sizeRect;
::GetTextExtentPoint32(hdc, text.c_str(), text.length(), &sizeRect);
int flags = DST_PREFIXTEXT;
int flags = MSWGetTextType();
if ( (stat & wxODDisabled) && !(stat & wxODSelected) )
flags |= DSS_DISABLED;