Visual Studio 6Visual C++ 7.0Windows 2000Visual C++ 6.0Windows XPMFCIntermediateDevVisual StudioWindowsC++
双列表选择器






4.81/5 (8投票s)
一个允许用户从一个列表选择项并添加到另一个列表的控件

引言
在应用程序中,很常见的是看到两个列表,用户可以将一个或多个项目从一个列表“移动”到另一个列表。例如,一个列表可能显示一个组中的用户列表,而另一个列表显示不在该组中的用户。然后,用户可以添加用户到组或从中删除用户。
虽然在应用程序中添加两个列表以及用于移动项目的按钮并不难,但这个控件通过将列表和按钮以及列表标签包装在一起,使其更加简单。该控件支持动态调整大小,并允许直接访问列表,或通过其自己的函数访问列表。
如何使用
使用 CDoubleListPicker
类非常简单。按照以下步骤将其添加到现有项目中。
- 将源代码文件(DoubleListPicker.cpp 和 DoubleListPicker.h)放到您希望使用的目录中后,将这些文件添加到您的 Visual Studio 项目中。
- 在资源编辑器中,在您希望放置选择器控件的位置添加一个静态控件,并为其指定一个不同于默认值
IDC_STATIC
的 ID。 - 最好为其提供一个客户端边框或静态边框,以便在设计时可以看到控件的边界。(这些样式将在运行时通过子类化控件时移除。除非您真的想要边框,否则不要添加边框,因为此边框(
WS_BORDER
)在运行时无法移除。) - 如果您希望能够通过 Tab 键访问控件,请为其设置 Tab 键停止属性。
- 在类向导中,为您的静态控件添加一个成员变量,在“类别”列表中选择“控件”,在“变量类型”列表中选择“
CDoubleListPicker
”。(如果CDoubleListPicker
未出现在列表中,您可能需要删除类向导文件(.clw)并重新生成它)。
文档
列表控件、标签和按钮由控件在创建时或子类化时创建。“子”控件作为控件的同级创建,而不是子控件,这意味着 Tab 键、加速键等将继续正常工作。
选择器控件将像管理一个控件一样管理这些子控件,因此选择器的调整大小、显示/隐藏、启用/禁用等操作将相应地移动/显示/隐藏子控件。
为了让选择器控件能够处理列表和按钮的通知,这些控件被子类化,通知被反射并传递给选择器控件。在反射后,它们会被传递给选择器的父窗口,因此如果有需要,可以在那里对任何通知做出响应。
函数
类中的公共函数如下:
- CDoubleListPicker();
- 标准的空构造函数
virtual BOOL Create(LPCTSTR lpszTitle, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);- 这与
CStatic::Create
基本相同,只是它会获取提供的窗口文本作为控件的标题文本,并添加WS_CHILD
样式。然后调用CStatic::Create
来完成创建。
int AddListItem(BOOL bLeft, LPCSTR lpszItem, LPVOID lpData);- int AddListItem(BOOL bLeft, LPCSTR lpszItem, DWORD dwData = 0);
- 这些函数可用于将项目添加到左侧列表(如果
bLeft
为TRUE
)或右侧列表(bLeft
为FALSE
)。除了指定要添加到列表中的字符串外,您还可以(可选地)指定要附加到列表项的数据,分别为 void 指针或DWORD
。
int AddListItems(BOOL bLeft, const CStringArray& saItems);- int AddListItems(BOOL bLeft, const CStringList& slistItems);
- 这些函数允许您一次性将多个项目添加到列表中,分别来自
CStringArray
或CStringList
。如果bLeft
为TRUE
,则项目将被添加到左侧列表,否则它们将被添加到右侧列表。这些函数返回添加到列表中的项目数。无法使用这些函数添加数据。
int GetListItems(BOOL bLeft, CStringArray& saItems);- int GetListItems(BOOL bLeft, CStringList& slistItems);
- 与上述函数类似,这将从列表中检索项目到
CStringArray
或CStringList
。同样,bLeft
指定要检索哪个列表的项目。函数返回检索到的项目数。
void SetListSort(BOOL bLeft, BOOL bSort = TRUE);- 此函数可用于切换任一列表是否被排序。它可以在控件创建之前或之后调用。
void SetListMultiSel(BOOL bLeft, BOOL bMultiSel = TRUE);- 此函数可用于切换任一列表是否允许多选(扩展选择)。它可以在控件创建之前或之后调用。
void SetTitle(LPCSTR lpszTitle = NULL);- 此函数设置控件的标题。它可以在控件创建之前或之后调用。
void SetLabels(LPCSTR lpszLabelLeft = NULL, LPCSTR lpszLabelRight = NULL);- 此函数设置左侧或右侧的标签。它可以在控件创建之前或之后调用。
CListBox& GetListCtrl(BOOL bLeft = TRUE);- 此函数返回左侧或右侧列表控件的引用。
CStatic& GetLabelCtrl(BOOL bLeft = TRUE);- 此函数返回左侧或右侧标签控件的引用。
CStatic& GetTitleCtrl();- 此函数返回标题静态控件的引用。
CString GetTitle();- 此函数返回当前的标题文本。
CString GetLabel(BOOL bLeft = TRUE);- 此函数返回任一列表的当前标签文本。
void SetHorizontal(BOOL bHorizontal = TRUE);- 将列表设置为水平方向。
BOOL GetHorizontal() const;- 返回列表是否为水平放置。
枚举
为了让选择器的父窗口能够处理通知消息,选择器的控件 ID 按如下方式枚举:
CDoubleListPicker::ID_TITLE // Title static control CDoubleListPicker::ID_LABEL_LEFT // Left label CDoubleListPicker::ID_LABEL_RIGHT // Right Label CDoubleListPicker::ID_BTN_MOVE_RIGHT // ">" button CDoubleListPicker::ID_BTN_MOVE_LEFT // "<" button CDoubleListPicker::ID_BTN_MOVE_ALL_RIGHT // ">>" button CDoubleListPicker::ID_BTN_MOVE_ALL_LEFT // "<<" button CDoubleListPicker::ID_LIST_LEFT // Left list CDoubleListPicker::ID_LIST_RIGHT // Right list
历史
版本 2.1 - 2003 年 7 月 9 日
- 更新以支持 Unicode。
版本 2 - 2003 年 2 月 7 日
- 添加了显示列表水平的功能。使用了 Anneke Sicherer-Roetman (drawing to a bitmap device context) 和 Stefan Schwedt (drawing rotated text) 的代码。
版本 1 - 2002 年 7 月 31 日
- 第一版