65.9K
CodeProject 正在变化。 阅读更多。
Home

双列表选择器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (8投票s)

2002年7月31日

CPOL

5分钟阅读

viewsIcon

74434

downloadIcon

2041

一个允许用户从一个列表选择项并添加到另一个列表的控件

DoublelistPicker Demo

DoubleListPicker Horizontal View

引言

在应用程序中,很常见的是看到两个列表,用户可以将一个或多个项目从一个列表“移动”到另一个列表。例如,一个列表可能显示一个组中的用户列表,而另一个列表显示不在该组中的用户。然后,用户可以添加用户到组或从中删除用户。

虽然在应用程序中添加两个列表以及用于移动项目的按钮并不难,但这个控件通过将列表和按钮以及列表标签包装在一起,使其更加简单。该控件支持动态调整大小,并允许直接访问列表,或通过其自己的函数访问列表。

如何使用

使用 CDoubleListPicker 类非常简单。按照以下步骤将其添加到现有项目中。

  1. 将源代码文件(DoubleListPicker.cppDoubleListPicker.h)放到您希望使用的目录中后,将这些文件添加到您的 Visual Studio 项目中。
  2. 在资源编辑器中,在您希望放置选择器控件的位置添加一个静态控件,并为其指定一个不同于默认值 IDC_STATIC 的 ID。
  3. 最好为其提供一个客户端边框或静态边框,以便在设计时可以看到控件的边界。(这些样式将在运行时通过子类化控件时移除。除非您真的想要边框,否则不要添加边框,因为此边框(WS_BORDER)在运行时无法移除。)
  4. 如果您希望能够通过 Tab 键访问控件,请为其设置 Tab 键停止属性。
  5. 在类向导中,为您的静态控件添加一个成员变量,在“类别”列表中选择“控件”,在“变量类型”列表中选择“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);
这些函数可用于将项目添加到左侧列表(如果 bLeftTRUE)或右侧列表(bLeftFALSE)。除了指定要添加到列表中的字符串外,您还可以(可选地)指定要附加到列表项的数据,分别为 void 指针或 DWORD

int AddListItems(BOOL bLeft, const CStringArray& saItems);
int AddListItems(BOOL bLeft, const CStringList& slistItems);
这些函数允许您一次性将多个项目添加到列表中,分别来自 CStringArrayCStringList。如果 bLeftTRUE,则项目将被添加到左侧列表,否则它们将被添加到右侧列表。这些函数返回添加到列表中的项目数。无法使用这些函数添加数据。

int GetListItems(BOOL bLeft, CStringArray& saItems);
int GetListItems(BOOL bLeft, CStringList& slistItems);
与上述函数类似,这将从列表中检索项目到 CStringArrayCStringList。同样,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 日

版本 1 - 2002 年 7 月 31 日

  • 第一版
© . All rights reserved.