- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
列表框(List)
控件样式
- 列表框(ListBox)是Windows图形界面开发中常用的控件,允许用户从一个列表中选择一项或多项内容。列表框可以是单选、多选或扩展多选类型。
创建控件
- 创建一个列表框控件,可以使用
CreateWindow
或CreateWindowEx
函数。
初始控件
- 添加和删除列表项
- LB_ADDSTRING:添加字符串到列表框。
- LB_INSERTSTRING:在指定位置插入字符串。
- LB_DELETESTRING:删除指定位置的字符串。
- LB_RESETCONTENT:删除所有列表项。
- 获取和设置选中项
- LB_GETCURSEL:获取单选列表框的当前选择项索引。
- LB_SETCURSEL:设置单选列表框的当前选择项。
- LB_GETSELCOUNT:获取多选列表框中选中的项数。
- LB_GETSELITEMS:获取多选列表框中选中的项索引。
- LB_SETSEL:设置指定项为选中状态。
- 获取和设置项文本
- LB_GETTEXT:获取指定索引的列表项文本。
- LB_GETTEXTLEN:获取指定索引的列表项文本长度。
消息处理
- LBN_SELCHANGE:列表框的选择发生改变。
- LBN_DBLCLK:列表框中的项被双击。
示例代码
cpp
// 获取单选列表框的当前选择项索引
int index = SendMessage(hListBoxSingle, LB_GETCURSEL, 0, 0);
// 设置单选列表框的当前选择项为第一个项
SendMessage(hListBoxSingle, LB_SETCURSEL, 0, 0);
// 获取多选列表框中选中的项数
int count = SendMessage(hListBoxMulti, LB_GETSELCOUNT, 0, 0);
// 获取多选列表框中选中的项索引
int* selections = (int*)malloc(count * sizeof(int));
SendMessage(hListBoxMulti, LB_GETSELITEMS, (WPARAM)count, (LPARAM)selections);
// 获取列表项文本长度
int textLength = SendMessage(hListBoxSingle, LB_GETTEXTLEN, index, 0);
// 获取列表项文本
TCHAR szItemText[256];
SendMessage(hListBoxSingle, LB_GETTEXT, index, (LPARAM)szItemText);
#include <Windows.h>
#include "resource.h"
#define ID_BUTTON_PUSH1 11
#define ID_LB_LIST1 1
#define ID_LB_LIST2 2
HINSTANCE ghInstance = 0;
LRESULT CALLBACK MainWindowProc (HWND, UINT, WPARAM, LPARAM);
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ghInstance = hInstance;
// 注册窗口
WNDCLASSEX wndclass = { 0 };
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.style = NULL;
wndclass.lpfnWndProc = MainWindowProc;
wndclass.cbClsExtra = NULL;
wndclass.cbWndExtra = NULL;
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL;
wndclass.hCursor = NULL;
wndclass.hbrBackground = (HBRUSH)COLOR_WINDOW;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = TEXT("0xCC");
wndclass.hIconSm = NULL;
if (!RegisterClassEx(&wndclass))
{
MessageBox(NULL, TEXT("RegisterClassEx Failed"), TEXT("Error"), MB_OK);
return 1;
}
// 创建窗口
HWND hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
TEXT("0xCC"),
TEXT("CreateWindowEx"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
960,
540,
NULL,
NULL,
hInstance,
NULL
);
if (hwnd == NULL)
{
MessageBox(NULL, TEXT("CreateWindowEx Failed"), TEXT("Error"), MB_OK);
return 1;
}
// 显示窗口
ShowWindow(hwnd, SW_SHOWDEFAULT);
// 更新窗口
UpdateWindow(hwnd);
// 消息处理
MSG msg = { 0 };
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
// 窗口过程
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
{
// 创建控件
HWND hButton1 = CreateWindow(
TEXT("BUTTON"),
TEXT("BS_PUSHBUTTON1"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 120,
200, 40,
hwnd,
(HMENU)ID_BUTTON_PUSH1,
ghInstance,
NULL);
HWND hListBoxSingle = CreateWindow(
TEXT("LISTBOX"),
NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_STANDARD,
10, 10, 200, 100,
hwnd,
(HMENU)ID_LB_LIST1,
ghInstance,
NULL
);
HWND hListBoxMulpit = CreateWindow(
TEXT("LISTBOX"),
NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_STANDARD | LBS_MULTIPLESEL,
220, 10, 200, 100,
hwnd,
(HMENU)ID_LB_LIST2,
ghInstance,
NULL
);
// 初始控件
// 添加表项
SendMessage(hListBoxSingle, LB_ADDSTRING, 0, (LPARAM)TEXT("单选列表1"));
SendMessage(hListBoxSingle, LB_ADDSTRING, 0, (LPARAM)TEXT("单选列表2"));
SendMessage(hListBoxSingle, LB_ADDSTRING, 0, (LPARAM)TEXT("单选列表3"));
SendMessage(hListBoxMulpit, LB_ADDSTRING, 0, (LPARAM)TEXT("多选列表1"));
SendMessage(hListBoxMulpit, LB_ADDSTRING, 0, (LPARAM)TEXT("多选列表2"));
SendMessage(hListBoxMulpit, LB_ADDSTRING, 0, (LPARAM)TEXT("多选列表3"));
// 插入表项
LB_INSERTSTRING;
// 删除表项
LB_DELETESTRING;
// 清空表项
LB_RESETCONTENT;
break;
}
case WM_COMMAND:
{
switch (HIWORD(wParam))
{
case LBN_SELCHANGE:
// 选中表项
break;
case LBN_DBLCLK:
// 表项双击
break;
}
switch (LOWORD(wParam))
{
case ID_BUTTON_PUSH1:
// 获取索引
DWORD dwIndex = SendMessage(GetDlgItem(hwnd, ID_LB_LIST1), LB_GETSEL, 0, 0);
OutputDebugString(L"1");
// 多选处理
LB_GETSELITEMS;
// 获取文本
LB_GETTEXT;
break;
}
switch (HIWORD(wParam))
{
case LBN_SELCHANGE:
// 处理列表框选择改变事件
if (LOWORD(wParam) == ID_LISTBOX_SINGLE)
{
int selIndex = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);
TCHAR selText[256];
SendMessage((HWND)lParam, LB_GETTEXT, selIndex, (LPARAM)selText);
MessageBox(hwnd, selText, TEXT("Selection Changed"), MB_OK);
}
break;
case LBN_DBLCLK:
// 处理列表框双击事件
if (LOWORD(wParam) == ID_LISTBOX_SINGLE)
{
int selIndex = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);
TCHAR selText[256];
SendMessage((HWND)lParam, LB_GETTEXT, selIndex, (LPARAM)selText);
MessageBox(hwnd, selText, TEXT("Item Double Clicked"), MB_OK);
}
break;
}
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}