Windows图形界面(GUI)-SDK-C/C++ - 列表框(List)

目录

列表框(List)

控件样式

创建控件

初始控件

消息处理

示例代码


列表框(List)

控件样式
  • 列表框(ListBox)是Windows图形界面开发中常用的控件,允许用户从一个列表中选择一项或多项内容。列表框可以是单选、多选或扩展多选类型。
创建控件
  • 创建一个列表框控件,可以使用CreateWindowCreateWindowEx函数。
初始控件
  • 添加和删除列表项
    • 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			2

HINSTANCE 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);
	}

}

相关推荐

  1. Windows图形界面(GUI)-SDK-C/C++ - 列表(List)

    2024-07-13 07:24:02       25 阅读
  2. Windows图形界面(GUI)-SDK-C/C++ - 编辑(edit)

    2024-07-13 07:24:02       21 阅读
  3. Windows图形界面(GUI)-SDK-C/C++ - 组合(ComboBox)

    2024-07-13 07:24:02       21 阅读
  4. Windows图形界面(GUI)-SDK-C/C++ - 应用程序结构

    2024-07-13 07:24:02       29 阅读
  5. Windows图形界面(GUI)-SDK-C/C++ - 按钮(button)

    2024-07-13 07:24:02       22 阅读
  6. Windows图形界面(GUI)-DLG-C/C++ - 列表视图(ListView)

    2024-07-13 07:24:02       19 阅读
  7. Windows图形界面(GUI)-SDK-C/C++ - 窗口类注册和管理

    2024-07-13 07:24:02       19 阅读
  8. Windows图形界面(GUI)-DLG-C/C++ - 树形视图(TreeView)

    2024-07-13 07:24:02       22 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 07:24:02       51 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 07:24:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 07:24:02       44 阅读
  4. Python语言-面向对象

    2024-07-13 07:24:02       55 阅读

热门阅读

  1. string知识点

    2024-07-13 07:24:02       26 阅读
  2. 华为OD机考题(HJ90 合法IP)

    2024-07-13 07:24:02       21 阅读
  3. Spring Boot Vue 毕设系统讲解 9 【Spark】

    2024-07-13 07:24:02       16 阅读
  4. GetX 踩坑之移除路由栈中的某个页面

    2024-07-13 07:24:02       22 阅读
  5. (C++01 栈与队列) 栈与队列的实现,栈的应用

    2024-07-13 07:24:02       14 阅读
  6. openresty+lua遍历 redis set

    2024-07-13 07:24:02       26 阅读
  7. Xcode持续集成之道:自动化构建与部署的精粹

    2024-07-13 07:24:02       24 阅读
  8. 把Docker的虚拟磁盘文件移动到别的盘符

    2024-07-13 07:24:02       21 阅读
  9. Linux C++ 060-设计模式之中介者模式

    2024-07-13 07:24:02       19 阅读