Windows API 编程,列表框控件
什么是列表框
列表框就是给用户提供选项列表进行选择,既是 Windows 标准控件,也是子窗口,类名是 listBox。
使用列表框时,首先复制前面学习的 Windows 基础窗口程序框架:
#include <Windows.h>
#include <cstdio>
// 自定义窗口过程回调函数
LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
switch (Msg) {
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProcA(hwnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
// 注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wnd.lpfnWndProc = MyWindowProc;
wnd.lpszClassName = TEXT("blackcat");
wnd.lpszMenuName = NULL;
wnd.style = CS_HREDRAW;
wnd.hInstance = hInstance;
RegisterClassA(&wnd);
// 创建窗口 返回之前发送 WM_CREATE
HWND hwnd = CreateWindowA(
TEXT("blackcat"),
TEXT("黑猫编程"),
WS_OVERLAPPEDWINDOW,
100, 100, 300, 300, NULL, NULL, hInstance, NULL
);
// 显示窗口
ShowWindow(hwnd, nShowCmd);
// 更新窗口
UpdateWindow(hwnd);
// 消息循环 收到 WM_QUIT 退出
MSG msg;
while (GetMessageA(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
return 0;
}
弹出如下窗口:
创建列表框控件
LB_ADDSTRING:在末尾添加字符串
LB_INSERTSTRING:在指定索引处添加字符串
LBS_SORT:按照字典序进行排序,但是插入的字符串不参与排序。如果未指定该选项,则按照添加字符串的默认顺序。
case WM_CREATE: {
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
HWND hListBox = CreateWindowA("listbox", "列表控件",
WS_CHILD | WS_VISIBLE | LBS_SORT | LBS_NOTIFY,
30, 60,
200, 100,
hwnd,
(HMENU)111,
pcs->hInstance,
NULL
);
SendMessageA(hListBox, LB_ADDSTRING, 0, (LPARAM)"B黑猫");
SendMessageA(hListBox, LB_ADDSTRING, 0, (LPARAM)"A蓝猫");
SendMessageA(hListBox, LB_ADDSTRING, 0, (LPARAM)"C花猫");
SendMessageA(hListBox, LB_INSERTSTRING, 1, (LPARAM)"D龙猫");
SendMessageA(hListBox, LB_SETCURSEL, 2, 0);
}
选择触发事件
case WM_COMMAND: {
WORD id = LOWORD(wParam);
WORD code = HIWORD(wParam);
HWND hCtrl = (HWND)lParam;
if (id == 111 && code == LBN_SELCHANGE) {
int idx = SendMessageA(hCtrl, LB_GETCURSEL, 0, 0);
TCHAR buf[64] = {};
SendMessageA(hCtrl, LB_GETTEXT, idx, (LPARAM)buf);
MessageBoxA(NULL, buf, "提示", MB_OK);
}
}
列表框美化
当控件即将绘制时,会发送 WM_CTLCOLORLISTBOX 消息到其父窗口。父窗口会对此消息响应,使用指定设备的上下文句柄来设置控件的文本和背景颜色。
case WM_CTLCOLORLISTBOX: {
HDC hdc = (HDC)wParam;
HWND hCtrl = (HWND)lParam;
UINT ctrl_id = GetWindowLongA(hCtrl, GWL_ID);
if (ctrl_id == 111) {
SetTextColor(hdc, RGB(255, 255, 255));
SetBkMode(hdc, TRANSPARENT);
HBRUSH bsh = CreateSolidBrush(RGB(0, 0, 0));
return (LRESULT)bsh;
}
}
下一篇:Ollama:函数即工具