Don't process last HDN_ITEMCHANGING notification

Just skipping last HDN_ITEMCHANGING arriving after HDN_ENDTRACK (to prevent emitting EVT_HEADER_RESIZING) when current column width is less than minimal value allowed is not enough because this notification will be handled by the native control in a standard way causing column width to resize below the limit.
When current width is below the limit this last HDN_ITEMCHANGING notification has to be explicitly "vetoed" to prevent default handling from happening.

Close #18335.
This commit is contained in:
Artur Wieczorek
2019-01-22 23:43:51 +01:00
parent 2753bb2f50
commit 5d40d57218

View File

@@ -747,7 +747,7 @@ bool wxHeaderCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
// HDN_ITEMCHANGED // HDN_ITEMCHANGED
// In both cases last HDN_ITEMCHANGING notification is sent // In both cases last HDN_ITEMCHANGING notification is sent
// after HDN_ENDTRACK so we have to skip it. // after HDN_ENDTRACK so we have to skip it.
if ( nmhdr->pitem && (nmhdr->pitem->mask & HDI_WIDTH) && m_isColBeingResized ) if ( nmhdr->pitem && (nmhdr->pitem->mask & HDI_WIDTH) )
{ {
// prevent the column from being shrunk beneath its min width // prevent the column from being shrunk beneath its min width
width = nmhdr->pitem->cxy; width = nmhdr->pitem->cxy;
@@ -757,13 +757,19 @@ bool wxHeaderCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
// happening // happening
veto = true; veto = true;
} }
else // width is acceptable // width is acceptable and notification arrived before HDN_ENDTRACK
else if ( m_isColBeingResized )
{ {
// generate the resizing event from here as we don't seem // generate the resizing event from here as we don't seem
// to be getting HDN_TRACK events at all, at least with // to be getting HDN_TRACK events at all, at least with
// comctl32.dll v6 // comctl32.dll v6
evtType = wxEVT_HEADER_RESIZING; evtType = wxEVT_HEADER_RESIZING;
} }
// else
// Nnotification arriving after HDN_ENDTRACK is handled normally
// by the control but EVT_HEADER_RESIZING event cannot be generated
// because EVT_HEADER_END_RESIZE finalizing the resizing has been
// already emitted.
} }
break; break;