From 417b8fcc49295f5c4e33d0ea1b706da87085db08 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 21 May 2010 13:17:25 +0000 Subject: [PATCH] Use ListView_CancelEditLabel() to implement wxListCtrl::EndEditLabel(). Windows XP and later finally added a special message to cancel label editing, use it if available. Also improve the documentation of this method. See #7663. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64374 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- interface/wx/listctrl.h | 8 +++++++- src/msw/listctrl.cpp | 19 +++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/interface/wx/listctrl.h b/interface/wx/listctrl.h index bfa9b019bc..c8650246b3 100644 --- a/interface/wx/listctrl.h +++ b/interface/wx/listctrl.h @@ -252,7 +252,13 @@ public: This method allows to programmatically end editing a list control item in place. Usually it will only be called when editing is in progress, - i.e. if GetEditControl() returns non-NULL. + i.e. if GetEditControl() returns non-NULL. In particular, do not call + it from EVT_LIST_BEGIN_LABEL_EDIT handler as the edit control is not + yet fully created by then, just veto the event in this handler instead + to prevent the editing from even starting. + + Notice that calling this method will result in EVT_LIST_END_LABEL_EDIT + event being generated. Currently only implemented in wxMSW. diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index ec5add16ea..5e0e786436 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -1561,10 +1561,21 @@ bool wxListCtrl::EndEditLabel(bool cancel) if ( !hwnd ) return false; - // We shouldn't destroy the control ourselves according to MSDN, which - // proposes WM_CANCELMODE to do this, but it doesn't seem to work so - // emulate the corresponding user action instead. - ::SendMessage(hwnd, WM_KEYDOWN, cancel ? VK_ESCAPE : VK_RETURN, 0); + // Newer versions of Windows have a special message for cancelling editing, + // use it if available. +#ifdef ListView_CancelEditLabel + if ( cancel && (wxApp::GetComCtl32Version() >= 600) ) + { + ListView_CancelEditLabel(GetHwnd()); + } + else +#endif // ListView_CancelEditLabel + { + // We shouldn't destroy the control ourselves according to MSDN, which + // proposes WM_CANCELMODE to do this, but it doesn't seem to work so + // emulate the corresponding user action instead. + ::SendMessage(hwnd, WM_KEYDOWN, cancel ? VK_ESCAPE : VK_RETURN, 0); + } return true; } -- 2.45.2