阅读量:2
- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
列表框(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:列表框中的项被双击。
示例代码
// 获取单选列表框的当前选择项索引 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); } }