Win32 学习笔记_列表控件(ListBox)

ListBox控件

1. 创建控件

// 创建ListBox控件

         HWND hListBox = CreateWindowEx(0, TEXT("ListBox"), NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | LBS_HASSTRINGS,

                   10, 10, 200, 200, hWnd, (HMENU)1001, hInstance, 0);

         const TCHAR* strArray[] = { TEXT("string1"),TEXT("string2"),TEXT("string3"),TEXT("string4"),TEXT("string5") };

         for (int i = 0; i < 5; i++)

         {

                   SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)strArray[i]);

         }

2. 效果展示

Win32 学习笔记_列表控件(ListBox)_第1张图片

 

3. 控件样式

LBS_COMBOBOX

通知列表框它是组合框的一部分。 这允许两个控件之间的协调,以便它们呈现统一的 UI 组合框本身必须设置此样式。 如果样式由组合框之外的任何内容设置,则列表框将错误地视为组合框的子级,并且失败将导致失败。

LBS_DISABLENOSCROLL

当列表框不包含足够的项目滚动时,显示禁用的水平或垂直滚动条。 如果未指定此样式,则当列表框不包含足够的项目时,滚动条将隐藏。 此样式必须与 WS_VSCROLL  WS_HSCROLL 样式一起使用。

LBS_EXTENDEDSEL

允许使用 SHIFT 键和鼠标或特殊键组合选择多个项。

LBS_HASSTRINGS

指定列表框包含由字符串组成的项。 列表框维护字符串的内存和地址,以便应用程序可以使用 LB_GETTEXT 消息检索特定项的文本。 默认情况下,除所有者绘制的列表框之外的所有列表框都具有此样式。 可以创建具有或不带此样式的所有者绘制列表框。
对于没有此样式的所有者绘制列表框, LB_GETTEXT 消息检索与项关联的值, (项数据)

LBS_MULTICOLUMN

指定水平滚动的多列列表框。 列表框自动计算列的宽度,或者应用程序可以使用 LB_SETCOLUMNWIDTH 消息设置宽度。 如果列表框具有 LBS_OWNERDRAWFIXED 样式,则当列表框发送 WM_MEASUREITEM 消息时,应用程序可以设置宽度。
具有 LBS_MULTICOLUMN 样式的列表框不能垂直滚动它忽略它接收的任何 WM_VSCROLL 消息。
不能组合 LBS_MULTICOLUMN  LBS_OWNERDRAWVARIABLE 样式。 如果同时指定了两者, 则忽略LBS_OWNERDRAWVARIABLE 

LBS_MULTIPLESEL

每次用户单击或双击列表框中的字符串时,都会打开或关闭字符串选择。 用户可以选择任意数量的字符串。

LBS_NODATA

指定无数据列表框。 当列表框中的项数超出一千时,请指定此样式。 无数据列表框还必须具有 LBS_OWNERDRAWFIXED 样式,但不得具有 LBS_SORT  LBS_HASSTRINGS 样式。
无数据列表框类似于所有者描述的列表框,但它不包含项的字符串或位图数据。 用于添加、插入或删除项的命令始终忽略任何指定的项数据;在列表框中查找字符串的请求始终失败。 系统在必须绘制项时将 WM_DRAWITEM 消息发送到所有者窗口。 使用WM_DRAWITEM消息传递的 DRAWITEMSTRUCT 结构的 itemID 成员指定要绘制的项的行号。 无数据列表框不发送 WM_DELETEITEM 消息。

LBS_NOINTEGRALHEIGHT

指定列表框的大小正好是应用程序在创建列表框时指定的大小。 通常,系统调整列表框的大小,以便列表框不显示部分项。
对于 具有LBS_OWNERDRAWVARIABLE 样式的列表框,始终强制实施 LBS_NOINTEGRALHEIGHT 样式。

LBS_NOREDRAW

指定在进行更改时列表框的外观不会更新。
若要更改控件的重绘状态,请使用 WM_SETREDRAW 消息。

LBS_NOSEL

指定列表框包含可查看但未选中的项目。

LBS_NOTIFY

每当用户单击列表框项 (LBN_SELCHANGE) 时,列表框将通知代码发送到父窗口,双击 (LBN_DBLCLK) 的项目,或取消所选内容 (LBN_SELCANCEL)

LBS_OWNERDRAWFIXED

指定列表框的所有者负责绘制其内容,并且列表框中的项目高度相同。 创建列表框时,所有者窗口会收到 WM_MEASUREITEM 消息,当列表框的可视方面发生更改时收到 WM_DRAWITEM 消息。

LBS_OWNERDRAWVARIABLE

指定列表框的所有者负责绘制其内容,并且列表框中的项目高度可变。 创建列表框时,所有者窗口将接收框中每个项目的 WM_MEASUREITEM 消息,当列表框的视觉方面发生更改时,会收到 WM_DRAWITEM 消息。
此样式会导致启用 LBS_NOINTEGRALHEIGHT 样式。
如果指定 LBS_MULTICOLUMN 样式,则忽略此样式。

LBS_SORT

按字母顺序对列表框中的字符串进行排序。

LBS_STANDARD

按字母顺序对列表框中的字符串进行排序。 每当用户单击列表框项、双击项目或取消所选内容时,父窗口都会收到通知代码。 列表框具有垂直滚动条,其边框位于所有侧。 此样式结合了 LBS_NOTIFY LBS_SORT WS_VSCROLL WS_BORDER 样式。

LBS_USETABSTOPS

允许列表框在绘制其字符串时识别和展开制表符。 可以使用 LB_SETTABSTOPS 消息指定制表位位置。 默认选项卡位置相隔 32 个对话框模板单位。 对话框模板单元是对话框模板中使用的与设备无关的单位。 若要将度量值从对话框模板单位转换为屏幕单位 (像素) ,请使用 MapDialogRect 函数。

LBS_WANTKEYBOARDINPUT

指定每当用户按下键且列表框具有输入焦点时,列表框的所有者将接收 WM_VKEYTOITEM 消息。 这使应用程序能够在键盘输入上执行特殊处理。

4. 控件消息

消息码

说明

WPARAM

LPARAM

返回值

LB_ADDSTRING

添加字符串到列表项中

0

LPCTSTR

Int

LB_DELETESTRING

删除指定字符串项

nIndex

0

Int

LB_GETCOUNT

获得列表项的部数

0

0

Int

LB_GETCURSEL

获得当前选中项的索引

0

0

Int

LB_GETITEMDATA

获得指定项的附加数据

nIndex

0

DWORD_PTR

LB_GETSEL

获得指定项的选中状态

nIndex

0

int

LB_GETSELCOUNT

获得多选项的总数

0

0

Int

LB_GETSELITEMS

获得选中项的索引数组

nMaxArray(数组大小)

lpArray(数组)

Int

LB_GETTEXT

获得指定项的字符串

nIndex

LPTSTR

Int

LB_GETTEXTLEN

获得指定项字符串长度

nIndex

0

Int

LB_GETTOPINDEX

获得第一个可见项的索引

0

0

Int

LB_INSERTSTRING

插入字符串项

nIndex

LPCTSTR

Int

LB_RESETCONTENT

删除所有的项

0

0

Void

LB_SELITEMRANGE

范围选择项或取消范围选择

BOOL(选择=TRUE,取消=FALSE)

DWORD  (L=开始选择项的索引,

H=结束项的索引)

Int

LB_SETCARETINDEX

设置指定项获得焦点,并可见

nIndex

BOOL(FALSE为完全可见,TRUE为部分可见)

Int

LB_SETCURSEL

设置当前选中的字符串项

nIndex

0

Int

LB_SETITEMDATA

设置指定项的附加数据

nIndex

DWORD_PTR

Int

LB_SETSEL

设置指定项的选中状态,并获得焦点和可见

BOOL 为真突出显示,为FALSE取水突出显示

nIndex

Int

LB_SETTOPINDEX

设置指定项为可见项

nIndex

0

Int

5. 控件通知消息

ComboBox控件发送WM_COMMAND消息到父窗口

        

消息ID

说明

LBN_DBLCLK

双击列表框中的字符串消息

LBN_ERSPACE

组合框无法分配内存消息

LBN_KILLFOCUS

失去焦点消息

LBN_SELCHANGE

选中项改变消息

LBN_SELCHANCEL

取消选择项消息

LBN_SETFOCUS

获得焦点消息

WM_CTLCOLORLISTBOX

设置控件背景色和文本颜色

WM_VKEYTOITEM

具有 LBS_WANTKEYBOARDINPUT 样式,发送父窗口可接收WM_KEYDOWN消息

6. 实例

1. 添加数据到列表中

// 添加测试数据到列表控件中

         const TCHAR* strArray[] = { TEXT("string1"),TEXT("string2"),TEXT("string3"),TEXT("string4"),TEXT("string5") };

         for (int i = 0; i < 5; i++)

         {

                   SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)strArray[i]);

         }

2. 在列表控件按回车键获得选中项的字符串数据

  1. 控件要有LBS_WANTKEYBOARDINPUT样式才有效
  2. 在控件父窗口上捕获WM_VKEYTOITEM消息,

wParam参数:LOWORD 指定用户按下的键的虚拟键代码。 HIWORD 指定插入点的当前位置。

lParam参数:控件句柄

int MyWnd::OnVKeyToItem(WPARAM wParam, LPARAM lParam)

{

         // 添加消息响应代码

         if (LOWORD(wParam) == VK_RETURN)

         {

                   HWND hListBox = (HWND)lParam;

                   int nSel = SendMessage(hListBox, LB_GETCURSEL, 0, 0);

                   TCHAR tem[10] = { 0 };

                   SendMessage(hListBox, LB_GETTEXT, nSel, (LPARAM)tem);

                   MessageBox(m_hWnd, tem, TEXT("提示"), MB_OK);

         }

         return 0;

}

Win32 学习笔记_列表控件(ListBox)_第2张图片

 

你可能感兴趣的:(Win32,SDK,学习笔记,学习,开发语言)