在开发Pocket PC2002应用程序时,尝试实现一个自定义绘制的列表框控件,以便在每行列表的开头显示一个小图标。类似于Davide Calabro在他的文章中展示的CListBoxST
,这是一个从CListBox
派生的控件。然而,很快发现Windows CE不支持列表框控件的自定义绘制风格,这让感到非常沮丧。因此,寻找了另一种解决方案,并找到了一个。使用了一个简单的自定义绘制列表控件CListCtrl
,在报表样式中模拟了一个单选列表框,并在每行的开头添加了一个小图标。
还添加了一些典型的列表框功能,如GetCurSelItem
和SetCurSelItem
,用于获取和设置当前选定的项目,以及一些将列表中的一个项目移动到另一个位置的函数。所有这些功能都被示例应用程序使用,因此,有关更详细的信息,请查看示例应用程序的源代码。
int GetCurSelItem() const;
BOOL SetCurSelItem(int nIndex);
BOOL MoveItem(int nOldIndex, int nNewIndex);
BOOL MoveItemUp(int nIndex);
BOOL MoveItemDown(int nIndex);
BOOL MoveItemTop(int nIndex);
BOOL MoveItemBottom(int nIndex);
使用自定义绘制列表控件CCeListCtrlEx
非常简单。只需将列表控件添加到对话框中,并将成员变量从CCeListCtrlEx
类型分配给列表控件,添加到对话框类中。不要忘记包含CeListCtrlEx.h
头文件。
C++
CCeListCtrlEx m_ctrlList;
在对话框的OnInitDialog
函数中,创建一个图像列表并将其分配给列表控件。之后,可以向列表控件添加一些项目(每行开头有一些小图标)。
BOOL CListCtrlTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
// TODO: Add extra initialization here
...
// Create a image list and assign it to the list control
VERIFY(m_imageList.Create(IDB_BITMAP1,
16,
1,
RGB(255, 0, 255)));
m_ctrlList.SetImageList(&m_imageList, LVSIL_SMALL);
// Insert some sample items
for (int n = 0; n < 10; n++)
{
CString str;
str.Format(_T("Item %d"), n);
m_ctrlList.InsertItem(n, str, n % 8);
}
...
return TRUE; // return TRUE unless you set the focus to a control
}
用于自定义绘制列表控件的DrawItem
函数基于Uwe Keim的文章"Selection Highlighting of an Entire Row"。使用了Uwe的文章中的原始DrawItem
函数,并做了一些简单的修改。