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

07-16 352阅读

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> 链接点击跳转博客主页

    目录

    Windows图形界面(GUI)-SDK-C/C++ - 列表框(List)
    (图片来源网络,侵删)

    列表框(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 
            #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);
            	}
            }
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]