I had learned how to use ListCtrl and TreeCtrl using
the examples given in CodeGuru. Soon I felt the need
for a hotkey F2 to rename an Item (As in Internet Explorer),
and add CUT, COPY, PASTE and Undo on the EditCtrl that appears.
These functionality can be achieved by a small modification
to the Article posted by Zafir Anjum.
Although I have taken great care while coding this use this code at your own risk.
Add the following code to the .cpp file of your CListCtrl or CListView
BEGIN_MESSAGE_MAP(CMyListView, CListView) ON_WM_KEYDOWN() ON_NOTIFY_REFLECT_EX( LVN_BEGINLABELEDIT, OnBeginLabelEdit ) ON_NOTIFY_REFLECT_EX( LVN_ENDLABELEDIT, OnEndLabelEdit ) END_MESSAGE_MAP() void CMyListView::OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags ) { CListCtrl& oListCtrl = GetListCtrl( ); switch( nChar ) { case VK_F2: { // To Use F2 as hot Key to get EditCtrl on the ListView it must have // the Style LVS_EDITLABELS ASSERT( oListCtrl.GetStyle() & LVS_EDITLABELS ); // don't do an Edit Label when the multiple Items are selected if( oListCtrl.GetSelectedCount( ) == 1 ) { UINT nListSelectedItem = GetSelectedItem(); VERIFY( oListCtrl.EditLabel( nListSelectedItem ) != NULL ); } else CListView::OnKeyDown( nChar, nRepCnt, nFlags ); } break; default: CListView::OnKeyDown( nChar, nRepCnt, nFlags ); break; } } // this Function Returns the first Selected Item In the List UINT CMyListView::GetSelectedItem() { CListCtrl& oListCtrl = GetListCtrl( ); // this Function Valid Only when a Single Item Is Selected ASSERT( oListCtrl.GetSelectedCount( ) == 1 ); UINT nNoOfItems = oListCtrl.GetItemCount( ); for( UINT nListItem = 0; nListItem < nNoOfItems; nListItem++ ) if( oListCtrl.GetItemState( nListItem, LVIS_SELECTED ) ) break; ASSERT( nListItem < nNoOfItems ); return nListItem; }
Add this in the MessageMap section of CMyListView or CMyListCtrl file.
afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );
Add this Function as a private Member Fn to your CMyListView or CMyListCtrl .h file.
UINT GetSelectedItem();