Navigating through CListCtrl’s rows with the arrow and tab keys

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

Environment: Demo was created with Visual C++ 6.0

.

I needed to be able to edit some fields from a database, and wanted to have a label,
the field name, followed by an edit box that the user could enter the field data in.
The only problem was that there could be anywhere from 1 to 50 fields. So I used
a CListCtrl with two columns to represent the field name and the field value. There
are many articles here that show how to edit subitems, but I only needed to be able to
edit one item on each row, so I just rearranged the columns to have the editable item
be the second cloumn. The following code is all that is necessary to rearrange the
columns.


int aiCol[2] = { 1, 0 };
m_List.SetColumnOrderArray (2, aiCol);

I also needed the user to be able to navigate through the fields with the tab and arrow
keys. This was a pain because the CListCtrl creates its own edit box for editing items,
and it was stealing all the key strokes that I wanted. I did not want to have to draw
and manage my own edit box, so I just created my own CEdit based class and subclassed
the edit box created by the CListCtrl. To subclass the edit control with your own edit
control, m_Edit, all you need is:


Inside a message handler for the LVN_BEGINLABELEDIT message, you need to add the following code:

HWND hWnd = (HWND)SendMessage (LVM_GETEDITCONTROL);
ASSERT (hWnd != NULL);
if (m_Edit.m_hWnd != 0)
m_Edit.DestroyWindow ();
VERIFY (m_Edit.SubclassWindow (hWnd));


Inside a message handler for the LVN_ENDLABELEDIT message, you need to add the following code:

if (m_Edit.m_hWnd)
VERIFY (m_Edit.UnsubclassWindow () != NULL);

You can then add a message handler in your m_Edit class to catch the KeyDown event and then
begin editing the next item.




The example program is simply a dialog box with an CListCtrl drawn on it. Ten fields are added
in the OnInitDialog function to illustrate this functionality.

Download demo – 19 KB

Date Last Updated: April 24, 1999

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read