- 公開視頻 ->?鏈接點擊跳轉公開課程
- 博客首頁 ->?鏈接點擊跳轉博客主頁
目錄
列表框(List)
控件樣式
創建控件
初始控件
消息處理
示例代碼
列表框(List)
控件樣式
- 列表框(ListBox)是Windows圖形界面開發中常用的控件,允許用戶從一個列表中選擇一項或多項內容。列表框可以是單選、多選或擴展多選類型。
創建控件
- 創建一個列表框控件,可以使用
CreateWindow
或CreateWindowEx
函數。
初始控件
- 添加和刪除列表項
- LB_ADDSTRING:添加字符串到列表框。
- LB_INSERTSTRING:在指定位置插入字符串。
- LB_DELETESTRING:刪除指定位置的字符串。
- LB_RESETCONTENT:刪除所有列表項。
- 獲取和設置選中項
- LB_GETCURSEL:獲取單選列表框的當前選擇項索引。
- LB_SETCURSEL:設置單選列表框的當前選擇項。
- LB_GETSELCOUNT:獲取多選列表框中選中的項數。
- LB_GETSELITEMS:獲取多選列表框中選中的項索引。
- LB_SETSEL:設置指定項為選中狀態。
- 獲取和設置項文本
- LB_GETTEXT:獲取指定索引的列表項文本。
- LB_GETTEXTLEN:獲取指定索引的列表項文本長度。
消息處理
- LBN_SELCHANGE:列表框的選擇發生改變。
- LBN_DBLCLK:列表框中的項被雙擊。
示例代碼
// 獲取單選列表框的當前選擇項索引
int index = SendMessage(hListBoxSingle, LB_GETCURSEL, 0, 0);// 設置單選列表框的當前選擇項為第一個項
SendMessage(hListBoxSingle, LB_SETCURSEL, 0, 0);// 獲取多選列表框中選中的項數
int count = SendMessage(hListBoxMulti, LB_GETSELCOUNT, 0, 0);// 獲取多選列表框中選中的項索引
int* selections = (int*)malloc(count * sizeof(int));
SendMessage(hListBoxMulti, LB_GETSELITEMS, (WPARAM)count, (LPARAM)selections);// 獲取列表項文本長度
int textLength = SendMessage(hListBoxSingle, LB_GETTEXTLEN, index, 0);// 獲取列表項文本
TCHAR szItemText[256];
SendMessage(hListBoxSingle, LB_GETTEXT, index, (LPARAM)szItemText);#include <Windows.h>
#include "resource.h"#define ID_BUTTON_PUSH1 11
#define ID_LB_LIST1 1
#define ID_LB_LIST2 2HINSTANCE ghInstance = 0;LRESULT CALLBACK MainWindowProc (HWND, UINT, WPARAM, LPARAM);INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ghInstance = hInstance;// 注冊窗口WNDCLASSEX wndclass = { 0 };wndclass.cbSize = sizeof(WNDCLASSEX);wndclass.style = NULL;wndclass.lpfnWndProc = MainWindowProc;wndclass.cbClsExtra = NULL;wndclass.cbWndExtra = NULL;wndclass.hInstance = hInstance;wndclass.hIcon = NULL;wndclass.hCursor = NULL;wndclass.hbrBackground = (HBRUSH)COLOR_WINDOW;wndclass.lpszMenuName = NULL;wndclass.lpszClassName = TEXT("0xCC");wndclass.hIconSm = NULL;if (!RegisterClassEx(&wndclass)){MessageBox(NULL, TEXT("RegisterClassEx Failed"), TEXT("Error"), MB_OK);return 1;}// 創建窗口HWND hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("0xCC"),TEXT("CreateWindowEx"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,960,540,NULL,NULL,hInstance,NULL);if (hwnd == NULL){MessageBox(NULL, TEXT("CreateWindowEx Failed"), TEXT("Error"), MB_OK);return 1;}// 顯示窗口ShowWindow(hwnd, SW_SHOWDEFAULT);// 更新窗口UpdateWindow(hwnd);// 消息處理MSG msg = { 0 };while (GetMessage(&msg, 0, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0;
}// 窗口過程
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{switch (uMsg){case WM_CREATE:{// 創建控件HWND hButton1 = CreateWindow(TEXT("BUTTON"),TEXT("BS_PUSHBUTTON1"),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,10, 120,200, 40,hwnd,(HMENU)ID_BUTTON_PUSH1,ghInstance,NULL);HWND hListBoxSingle = CreateWindow(TEXT("LISTBOX"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_STANDARD,10, 10, 200, 100,hwnd,(HMENU)ID_LB_LIST1,ghInstance,NULL);HWND hListBoxMulpit = CreateWindow(TEXT("LISTBOX"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_STANDARD | LBS_MULTIPLESEL,220, 10, 200, 100,hwnd,(HMENU)ID_LB_LIST2,ghInstance,NULL);// 初始控件// 添加表項SendMessage(hListBoxSingle, LB_ADDSTRING, 0, (LPARAM)TEXT("單選列表1"));SendMessage(hListBoxSingle, LB_ADDSTRING, 0, (LPARAM)TEXT("單選列表2"));SendMessage(hListBoxSingle, LB_ADDSTRING, 0, (LPARAM)TEXT("單選列表3"));SendMessage(hListBoxMulpit, LB_ADDSTRING, 0, (LPARAM)TEXT("多選列表1"));SendMessage(hListBoxMulpit, LB_ADDSTRING, 0, (LPARAM)TEXT("多選列表2"));SendMessage(hListBoxMulpit, LB_ADDSTRING, 0, (LPARAM)TEXT("多選列表3"));// 插入表項LB_INSERTSTRING;// 刪除表項LB_DELETESTRING;// 清空表項LB_RESETCONTENT;break;}case WM_COMMAND:{switch (HIWORD(wParam)){case LBN_SELCHANGE:// 選中表項break;case LBN_DBLCLK:// 表項雙擊break;}switch (LOWORD(wParam)){case ID_BUTTON_PUSH1:// 獲取索引DWORD dwIndex = SendMessage(GetDlgItem(hwnd, ID_LB_LIST1), LB_GETSEL, 0, 0);OutputDebugString(L"1");// 多選處理LB_GETSELITEMS;// 獲取文本LB_GETTEXT;break; }switch (HIWORD(wParam)){case LBN_SELCHANGE:// 處理列表框選擇改變事件if (LOWORD(wParam) == ID_LISTBOX_SINGLE){int selIndex = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);TCHAR selText[256];SendMessage((HWND)lParam, LB_GETTEXT, selIndex, (LPARAM)selText);MessageBox(hwnd, selText, TEXT("Selection Changed"), MB_OK);}break;case LBN_DBLCLK:// 處理列表框雙擊事件if (LOWORD(wParam) == ID_LISTBOX_SINGLE){int selIndex = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);TCHAR selText[256];SendMessage((HWND)lParam, LB_GETTEXT, selIndex, (LPARAM)selText);MessageBox(hwnd, selText, TEXT("Item Double Clicked"), MB_OK);}break;}break;}case WM_DESTROY:{PostQuitMessage(0);break;}default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}}