首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Win32 API 創建 ListBox 並關聯變量:使用句柄而非 DDX

     編輯:程式設計綜合問答

Win32 原生 API (非 MFC) 中,CreateWindow 創建 ListBox 返回 HWND 句柄,無需也不存在「關聯變量」概念。所有操作均通過發送消息 (SendMessage) 完成。

核心原理

  • Windows 中「一切皆窗口」,ListBox 是預定義窗口類 ("LISTBOX")。
  • CreateWindow 返回 HWND,即該控件的唯一標識。
  • 操作 API: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);
}

常用消息速查

操作消息wParamlParam
添加字符串LB_ADDSTRING0(LPARAM)字符串指針
插入字符串LB_INSERTSTRING索引(LPARAM)字符串指針
刪除字符串LB_DELETESTRING索引0
獲取項目數LB_GETCOUNT00
獲取選中索引LB_GETCURSEL00
設置選中索引LB_SETCURSEL索引0
獲取項目文本LB_GETTEXT索引(LPARAM)緩衝區指針
獲取項目文本長度LB_GETTEXTLEN索引0
清空列表LB_RESETCONTENT00

MFC 對比

MFC 的 CListBox 封裝了上述消息,並通過 DDX_Control 實現「控件關聯變量」。純 Win32 直接用 HWND 即可,更輕量、更透明。

牢記:句柄即變量,消息即方法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved