Fix sending of wxEVT_COMMAND_LIST_COL_DRAGGING events in wxMSW wxListCtrl.

We were not getting HDN_TRACK from the system because apparently it is not
sent for header controls with HDS_FULLDRAG style which is used by default by
the native list control. A possible solution would be to forcefully unset this
style but this would make the UI look old fashioned and less intuitive so
instead send these DRAGGING events from HDN_ITEMCHANGING.

Closes #9471,

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63240 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-01-24 01:00:27 +00:00
parent 002374070e
commit b66c3a6751
2 changed files with 33 additions and 8 deletions

View File

@@ -518,6 +518,7 @@ MSW:
wxBORDER_THEME in a container window. wxBORDER_THEME in a container window.
- Suppressed spurious character event for decimal key in numeric keypad. - Suppressed spurious character event for decimal key in numeric keypad.
- Allow to not create wxPaintDC in EVT_PAINT handler. - Allow to not create wxPaintDC in EVT_PAINT handler.
- Fix sending of wxEVT_COMMAND_LIST_COL_DRAGGING events in wxListCtrl.
i18n: i18n:

View File

@@ -2029,29 +2029,50 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
event.m_itemIndex = -1; event.m_itemIndex = -1;
bool ignore = false;
switch ( nmhdr->code ) switch ( nmhdr->code )
{ {
// yet another comctl32.dll bug: under NT/W2K it sends Unicode // yet another comctl32.dll bug: under NT/W2K it sends Unicode
// TRACK messages even to ANSI programs: on my system I get // TRACK messages even to ANSI programs: on my system I get
// HDN_BEGINTRACKW and HDN_ENDTRACKA and no HDN_TRACK at all! // HDN_BEGINTRACKW and HDN_ENDTRACKA!
// //
// work around is to simply catch both versions and hope that it // work around is to simply catch both versions and hope that it
// works (why should this message exist in ANSI and Unicode is // works (why should this message exist in ANSI and Unicode is
// beyond me as it doesn't deal with strings at all...) // beyond me as it doesn't deal with strings at all...)
// //
// note that fr HDN_TRACK another possibility could be to use // another problem is that HDN_TRACK is not sent at all by header
// HDN_ITEMCHANGING but it is sent even after HDN_ENDTRACK and when // with HDS_FULLDRAG style which is used by default by wxListCtrl
// something other than the item width changes so we'd have to // under recent Windows versions (starting from at least XP) so we
// filter out the unwanted events then // need to use HDN_ITEMCHANGING instead of it
case HDN_BEGINTRACKA: case HDN_BEGINTRACKA:
case HDN_BEGINTRACKW: case HDN_BEGINTRACKW:
eventType = wxEVT_COMMAND_LIST_COL_BEGIN_DRAG; eventType = wxEVT_COMMAND_LIST_COL_BEGIN_DRAG;
// fall through // fall through
case HDN_TRACKA: case HDN_ITEMCHANGING:
case HDN_TRACKW:
if ( eventType == wxEVT_NULL ) if ( eventType == wxEVT_NULL )
{
if ( !nmHDR->pitem || !(nmHDR->pitem->mask & HDI_WIDTH) )
{
// something other than the width is being changed,
// ignore it
ignore = true;
break;
}
// also ignore the events sent when the width didn't really
// change: this is not just an optimization but also gets
// rid of a useless and unexpected DRAGGING event which
// would otherwise be sent after the END_DRAG one as we get
// an HDN_ITEMCHANGING after HDN_ENDTRACK for some reason
if ( nmHDR->pitem->cxy == GetColumnWidth(nmHDR->iItem) )
{
ignore = true;
break;
}
eventType = wxEVT_COMMAND_LIST_COL_DRAGGING; eventType = wxEVT_COMMAND_LIST_COL_DRAGGING;
}
// fall through // fall through
case HDN_ENDTRACKA: case HDN_ENDTRACKA:
@@ -2089,8 +2110,11 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
return true; return true;
default: default:
return wxControl::MSWOnNotify(idCtrl, lParam, result); ignore = true;
} }
if ( ignore )
return wxControl::MSWOnNotify(idCtrl, lParam, result);
} }
else else
#endif // defined(HDN_BEGINTRACKA) #endif // defined(HDN_BEGINTRACKA)