ListBox 是一种在 GUI 应用程序中经常使用的控件。 ListBox 允许用户从给定的一组项目中选择一个或多个项目。ListBox 也可以显示文本或图像列表。在 C 语言中,我们可以使用 Windows API 或第三方 GUI 工具包来创建 ListBox 控件。在这篇文章中,我们将介绍如何使用 Windows API 来创建 ListBox 控件。
创建 ListBox
要创建 ListBox 控件,我们需要先获取 ListBox 类别的窗口句柄。可以使用以下代码:
HWND hListBox = CreateWindow("LISTBOX", "", WS_VISIBLE | WS_CHILD | LBS_STANDARD,
10, 10, 200, 200, hWndParent, (HMENU)ID_LISTBOX, hInstance, NULL);
在此代码中,我们使用 CreateWindow 函数创建 ListBox 控件。参数如下:
- "LISTBOX" - 窗口类别名称,表示我们要创建一个 ListBox 控件。
- "" - 控件名称,可以为空。
- WS_VISIBLE | WS_CHILD | LBS_STANDARD - 控件的风格和类型。这里 WS_VISIBLE 和 WS_CHILD 表示我们要将 ListBox 控件放在父窗口中,并使其可见。LBS_STANDARD 表示我们要创建一个基本的 ListBox 控件。这是一个最常用的 ListBox 类型。
- 10, 10, 200, 200 - 控件的位置和大小。
- hWndParent - 父窗口的句柄。
- (HMENU)ID_LISTBOX - 控件的标识符。标识符必须是唯一的,并且是正整数。
- hInstance - 程序实例句柄。
- NULL - 指向 CREATESTRUCT 的指针,该结构包含有关创建窗口的其他信息。
添加项目
在创建 ListBox 控件后,我们需要向 ListBox 中添加项目。我们可以使用 SendMessage 函数向 ListBox 发送 LB_ADDSTRING、LB_INSERTSTRING、LB_DIR 或 LB_RESETCONTENT 消息来添加项目。下面是一个示例代码,演示如何使用 LB_ADDSTRING 消息向 ListBox 添加项目:
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Item 1");SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Item 2");SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Item 3");
在此代码中,我们使用 SendMessage 函数向 ListBox 控件发送 LB_ADDSTRING 消息。消息参数如下:
- hListBox - ListBox 控件的句柄。
- LB_ADDSTRING - 指定我们要发送的消息类型。LB_ADDSTRING 表示我们要向 ListBox 中添加一个新项目。
- 0 - 不使用 wParam 参数。
- (LPARAM)"Item 1" - 指定我们要添加的字符串。LPARAM 是一个整数型参数,因此我们将字符串类型强制转换为 LPARAM。
选择项目
使用 ListBox 控件时,我们通常需要处理用户选择的项目。可以使用 SendMessage 函数向 ListBox 发送 LB_GETCURSEL 或 LB_GETSELITEMS 消息来获取所选项目的信息。下面是一些示例代码,演示如何获取 ListBox 中所选项目的信息:
// 获取所选项目的索引int nCurSel = SendMessage(hListBox, LB_GETCURSEL, 0, 0);// 获取所选项目的数量int nCount = SendMessage(hListBox, LB_GETSELCOUNT, 0, 0);// 获取所选项目的索引数组int* pIndexArray = new int[nCount];SendMessage(hListBox, LB_GETSELITEMS, nCount, (LPARAM)pIndexArray);
在此代码中,我们使用 SendMessage 函数向 ListBox 控件发送 LB_GETCURSEL、LB_GETSELCOUNT 和 LB_GETSELITEMS 消息。消息参数如下:
- hListBox - ListBox 控件的句柄。
- LB_GETCURSEL - 指定我们要发送的消息类型。LB_GETCURSEL 表示我们要获取 ListBox 中当前所选项目的索引。
- LB_GETSELCOUNT - 指定我们要发送的消息类型。LB_GETSELCOUNT 表示我们要获取 ListBox 中所选项目的数量。
- LB_GETSELITEMS - 指定我们要发送的消息类型。LB_GETSELITEMS 表示我们要获取 ListBox 中所选项目的索引数组。
- 0 - 不使用 wParam 参数。
- (LPARAM)pIndexArray - 指定一个指向整数数组的指针来存储所选项目的索引。因此,我们必须将 pIndexArray 转换为 LPARAM 类型。
移除项目
我们可以使用 SendMessage 函数向 ListBox 发送 LB_DELETESTRING 或 LB_RESETCONTENT 消息来移除项目。以下是示例代码,演示如何使用 LB_DELETESTRING 和 LB_RESETCONTENT 消息来移除 ListBox 中的项目:
// 移除选中的项目int nIndex = SendMessage(hListBox, LB_GETCURSEL, 0, 0);SendMessage(hListBox, LB_DELETESTRING, nIndex, 0);// 移除所有项目SendMessage(hListBox, LB_RESETCONTENT, 0, 0);
在此代码中,我们使用 SendMessage 函数向 ListBox 控件发送 LB_DELETESTRING 和 LB_RESETCONTENT 消息。消息参数如下:
- hListBox - ListBox 控件的句柄。
- LB_DELETESTRING - 指定我们要发送的消息类型。LB_DELETESTRING 表示我们要从 ListBox 中移除一个指定索引的项目。
- LB_RESETCONTENT - 指定我们要发送的消息类型。LB_RESETCONTENT 表示我们要从 ListBox 中移除所有项目。
- nIndex - 我们要删除的项目的索引。
- 0 - 不使用 wParam 参数。
案例说明
以下是一个完整的 C 语言程序,演示了如何创建 ListBox 控件并向其中添加、选择和移除项目:
#include #define ID_LISTBOX 1 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { WNDCLASSEX wcex; HWND hWnd; MSG msg; ZeroMemory(&wcex, sizeof(wcex)); wcex.cbSize = sizeof(wcex); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.hInstance = hInstance; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszClassName = "ListBoxDemo"; if (!RegisterClassEx(&wcex)) return 0; hWnd = CreateWindow("ListBoxDemo", "ListBoxDemo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, NULL, NULL, hInstance, NULL); if (!hWnd) return 0; ShowWindow(hWnd, nShowCmd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hListBox; switch (message) { case WM_CREATE: hListBox = CreateWindow("LISTBOX", "", WS_VISIBLE | WS_CHILD | LBS_STANDARD, 10, 10, 200, 200, hWnd, (HMENU)ID_LISTBOX, ((LPCREATESTRUCT)lParam)->hInstance, NULL); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Item 1"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Item 2"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"Item 3"); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_LISTBOX: if (HIWORD(wParam) == LBN_SELCHANGE) { int nCurSel = SendMessage(hListBox, LB_GETCURSEL, 0, 0); if (nCurSel != LB_ERR) { char szBuffer[256]; SendMessage(hListBox, LB_GETTEXT, nCurSel, (LPARAM)szBuffer); MessageBox(hWnd, szBuffer, "Selection", MB_OK); } } break; case IDM_REMOVE: int nCount = SendMessage(hListBox, LB_GETSELCOUNT, 0, 0); if (nCount > 0) { int *pIndexArray = new int[nCount]; SendMessage(hListBox, LB_GETSELITEMS, nCount, (LPARAM)pIndexArray); for (int i = nCount - 1; i >= 0; i--) SendMessage(hListBox, LB_DELETESTRING, pIndexArray[i], 0); delete[] pIndexArray; } break; } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, message, wParam, lParam); } 该程序创建了一个带有 ListBox 控件的窗口,并向 ListBox 控件中添加了几个项目。当用户选择 ListBox 中的项目时,该程序将显示所选项目的名称。还可以使用“Remove”菜单项从 ListBox 中移除所选项目。 结论 ListBox 控件是一种常用的 GUI 控件,非常适合用于在 C 语言中创建用户界面。可以通过 Windows API 来创建并操作 ListBox 控件。本文介绍了如何使用 SendMessage 函数向 ListBox 控件发送不同的消息来添加、选择和移除项目。我们还提供了一个完整的示例程序,演示了如何使用 ListBox 控件创建基本的用户界面。 壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。 我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复