Windows API 编程,列表框控件

Windows API 编程,列表框控件

编码文章call10242024-12-12 11:03:4634A+A-

什么是列表框

列表框就是给用户提供选项列表进行选择,既是 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;
			}
		}
点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4