Win32 原生 API (非 MFC) 中,CreateWindow 創建 ListBox 返回 HWND 句柄,無需也不存在「關聯變量」概念。所有操作均通過發送消息 (SendMessage) 完成。
"LISTBOX")。CreateWindow 返回 HWND,即該控件的唯一標識。SendMessage(hwnd, LB_ADDSTRING, 0, (LPARAM)text) 等。#include <windows.h>
HWND hListBox;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CREATE:
hListBox = CreateWindow(
TEXT("LISTBOX"), NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_NOTIFY,
10, 10, 200, 150,
hwnd, (HMENU)IDC_MYLIST, GetModuleHandle(NULL), NULL
);
// 添加初始項目
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("Item 1"));
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("Item 2"));
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("Item 3"));
break;
case WM_COMMAND:
if (LOWORD(wParam) == IDC_MYLIST && HIWORD(wParam) == LBN_SELCHANGE) {
int idx = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
TCHAR buf[256];
SendMessage(hListBox, LB_GETTEXT, idx, (LPARAM)buf);
MessageBox(hwnd, buf, TEXT("Selected"), MB_OK);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
| 操作 | 消息 | wParam | lParam |
|---|---|---|---|
| 添加字符串 | LB_ADDSTRING | 0 | (LPARAM)字符串指針 |
| 插入字符串 | LB_INSERTSTRING | 索引 | (LPARAM)字符串指針 |
| 刪除字符串 | LB_DELETESTRING | 索引 | 0 |
| 獲取項目數 | LB_GETCOUNT | 0 | 0 |
| 獲取選中索引 | LB_GETCURSEL | 0 | 0 |
| 設置選中索引 | LB_SETCURSEL | 索引 | 0 |
| 獲取項目文本 | LB_GETTEXT | 索引 | (LPARAM)緩衝區指針 |
| 獲取項目文本長度 | LB_GETTEXTLEN | 索引 | 0 |
| 清空列表 | LB_RESETCONTENT | 0 | 0 |
MFC 的 CListBox 封裝了上述消息,並通過 DDX_Control 實現「控件關聯變量」。純 Win32 直接用 HWND 即可,更輕量、更透明。
牢記:句柄即變量,消息即方法。