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

@@ -2029,29 +2029,50 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
event.m_itemIndex = -1;
bool ignore = false;
switch ( nmhdr->code )
{
// yet another comctl32.dll bug: under NT/W2K it sends Unicode
// 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
// works (why should this message exist in ANSI and Unicode is
// beyond me as it doesn't deal with strings at all...)
//
// note that fr HDN_TRACK another possibility could be to use
// HDN_ITEMCHANGING but it is sent even after HDN_ENDTRACK and when
// something other than the item width changes so we'd have to
// filter out the unwanted events then
// another problem is that HDN_TRACK is not sent at all by header
// with HDS_FULLDRAG style which is used by default by wxListCtrl
// under recent Windows versions (starting from at least XP) so we
// need to use HDN_ITEMCHANGING instead of it
case HDN_BEGINTRACKA:
case HDN_BEGINTRACKW:
eventType = wxEVT_COMMAND_LIST_COL_BEGIN_DRAG;
// fall through
case HDN_TRACKA:
case HDN_TRACKW:
case HDN_ITEMCHANGING:
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;
}
// fall through
case HDN_ENDTRACKA:
@@ -2089,8 +2110,11 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
return true;
default:
return wxControl::MSWOnNotify(idCtrl, lParam, result);
ignore = true;
}
if ( ignore )
return wxControl::MSWOnNotify(idCtrl, lParam, result);
}
else
#endif // defined(HDN_BEGINTRACKA)