自定义报表列表控件,带内嵌组合框和编辑控件
列表控件支持单元格内的内嵌组合框和编辑控件,
引言
列表控件,特别是“报表”样式,是任何用户界面中最常用的控件之一。
作为开发人员,有时我们希望能够
- 从项目列表中选择一个单元格的值
- 键入任何单元格的值
- 整个只读列
开发具有这些功能的列表控件需要大量时间。 我只是尝试创建可重用的类,以便为开发人员提供就地下拉组合框和编辑控件。
列表控件的列可以通过公共接口分配上述属性。 此示例也是将控件嵌入到另一个控件中的一个示例,方法是将嵌入的控件设为父控件的属性。 默认情况下,所有单元格都支持就地编辑控件。
本文的代码是在 Windows 2000 Professional 和 Microsoft Visual C++ 6 上编写的。 我已经测试过并在我的工作中使用了它。
特点
需要使用如上所述的列表控件的开发人员只需在项目中包含以下文件即可
- ComboListCtrl.cpp
- ComboListCtrl.h
- InPlaceEdit.cpp
- InPlaceEdit.h
- InPlaceCombo.cpp
- InPlaceCombo.h
开发人员需要创建一个列表控件资源,并将控件成员变量与之关联。 然后,必须将“CListCtrl
”类型修改为“CComboListCtrl
”。
可以使用可用的公共接口指定需要支持就地组合框、编辑控件和只读属性的列。
要在组合框下拉列表中显示的项目的列表可以由父类指定。 这允许不同的列具有不同的项目集。
对于编辑控件,可以指定有效的字符。 如果未指定任何内容,则所有字符都被视为有效。 除了对键入和粘贴的字符进行内部验证外,还会向父控件发送通知以进行进一步验证。 这允许父类处理特定于格式的任何验证。
顾名思义,只读列超出了最终用户的操作范围。
开发人员还可以启用或禁用就地组合框的水平和垂直滚动条。
公共方法
需要支持就地组合框的列可以通过将列索引传递给SetComboColumns
来设置。 默认情况下,此函数将在单元格中启用对组合框的支持。 组合框支持可以通过将第二个默认参数传递为 false 来重置。
// Sets/Resets the column, which support the in place combo box void SetComboColumns(int iColumnIndex, bool bSet = true);
需要作为只读的列可以通过将列索引传递给SetReadOnlyColumns
来设置。 默认情况下,此函数将在单元格中启用只读属性。 组合框支持可以通过将第二个默认参数传递为 false 来重置。
// Sets/Resets the column, which support the in place edit control void SetReadOnlyColumns(int iColumnIndex, bool bSet = true);
编辑控件的有效字符可以通过SetValidEditCtrlCharacters
设置。 就地编辑控件将仅允许将这些字符键入或粘贴到控件中。 在粘贴无效字符或有效和无效字符的组合时,粘贴操作将不会成功。
// Sets the valid characters for the edit ctrl void SetValidEditCtrlCharacters(CString& rstrValidCharacters);
组合框通常具有支持垂直和水平滚动条的功能。 但是,对于嵌入的就地控件,是否需要取决于使用情况。 可以通过类似于EnableWindow()
的以下接口启用或禁用滚动条。
// Enables the vertical scroll if the bool passed is true // Disables the vertical scroll if the bool passed is false // The default value for the argument is true void EnableVScroll(bool bEnable = true); // Enables the horizontal scroll if the bool passed is true // Disables the horizontal scroll if the bool passed is false // The default value for the argument is true void EnableHScroll(bool bEnable = true);
用户定义的消息
根据使用情况,可能需要验证在编辑控件中输入的文本的格式。 为此,就地控件将必须向列表控件的父级发送一条消息,指示编辑操作的结束。 使用用户定义的消息WM_VALIDATE
发送到父级以指示编辑结束。 父类可以处理此消息以对格式进行必要的验证。
// This message is posted to the parent // The message can be handled to make the necessary validations, if any #define WM_VALIDATE WM_USER + 0x7FFD
组合框中的项目必须由列表控件的父级外部指定。 消息WM_SET_ITEMS
使用::SendMessage()
发布到父级。 父级可以处理此消息并填充要在组合框中显示的项目列表。 不同的列可以有不同的项目。 这可以通过如下示例所示来实现。
// This message is posted to the parent // The message should be handled to specify the items // to the added to the combo #define WM_SET_ITEMS WM_USER + 0x7FFC
示例
LRESULT CMyDialog::PopulateComboList(WPARAM wParam, LPARAM lParam) { CStringList* pComboList = reinterpret_cast<CSTRINGLIST*> (lParam); pComboList->RemoveAll(); if (iColumnIndex == 1) { pComboList->AddTail("Name1"); pComboList->AddTail("Name2");pComboList->AddTail("Name3"); } else if (iColumnIndex == 2) {pComboList->AddTail("Age1"); pComboList->AddTail("Age2");pComboList->AddTail("Age3"); } }