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();