Windows SDK(六)组合框与列表框控件

组合框和列表框同样也是控件,所以我们在应用组合框和列表框时同样也需要父窗口,现在我们以

创建项目时程序自行创建的窗口作为父窗口展开如下的控件创建与应用

在进行组合框与列表框的讲解前,我们首先在程序中定义几个宏作为我们在编写程序时的控件ID:

#define IDC_BUTTON_CHECK_1 0

#define IDC_BUTTON_CHECK_2 1

#define IDC_BUTTON_CHECK_3 2

#define IDC_COMBOBOX_CITY 0x8001

#define IDC_LIST_COMM 0x9001

组合框的创建

组合框(COMBOBOX):也叫下拉框,用于指定由列表框和类似于编辑控件的选择字段组成的控件。

 如图便是一个组合框

此时我们于消息循环的WM_CREATE消息下创建一个简单组合框:

HWND hWndCombobox = CreateWindow(L"Combobox", L"", WS_CHILD | WS_VISIBLE |

WS_OVERLAPPED | CBS_DROPDOWN | CBS_HASSTRINGS, 100, 100, 200,200,hWnd,

(HMENU)IDC_COMBOBOX_CITY, ((LPCREATESTRUCT)lParam)->hInstance, NULL);

如图便是我们创建的组合框

组合框内容的填充

const WCHAR * szCity[5] = { L"北京",L"上海", L"深圳", L"广州", L"曹县" }; 此时我们创建了一个数

组用于保存我们要填充的消息

for (size_t i = 0; i < 5; i++)

{

    SendMessage(hWndCombobox,CB_ADDSTRING,NULL,(LPARAM)szCity[i]); 给下拉框发送添

加字符串的消息

}

如图便是我们此时创建的下拉框

SendMessage(hWndCombobox, CB_SETCURSEL, 0, NULL); 设置默认选中的字符串,此处设置

的是北京作为默认字符串

如图,此时下拉框便有了默认值

组合柜的应用

组合框的消息处理在WM_COMMAND中进行获取对于应用的消息

case WM_COMMAND:

{

    if (HIWORD(wParam) == CBN_SELCHANGE) 判断是不是下拉框的选择消息,

    CBN_SELCHANGE:当用户更改组合框列表框中的当前选择时发送的通知代码

    {

         if (LOWORD(wParam) == IDC_COMBOBOX_CITY) 判断是不是我们想要的下拉框

        {

            int ItemIndex = SendMessage((HWND)lParam, CB_GETCURSEL, NULL, NULL); 发送

消息获取当前选择的索引

            WCHAR *szCityName = new WCHAR[50];

            SendMessage((HWND)lParam, CB_GETLBTEXT, ItemIndex, (LPARAM)szCityName);

发送消息,获取指定索引的值

            MessageBox(hWnd, szCityName, L"Msg", MB_OK); 对获取的值进行显示

        }

    }

    }

完成以上代码后,我们在下拉框列表中选择相应的值时,会弹出相应的窗口

如图我们选择了深圳的值以后,会弹出窗口,点击确认以后,下拉框的值会变成深圳

列表的创建

此控件需要包含头文件#include <commctrl.h>

    HWND hWndListView = CreateWindow(L"SysListView32", L"", LVS_REPORT | WS_CHILD |

WS_VISIBLE | WS_BORDER, 10, 10, 400, 300, hWnd, (HMENU)IDC_LIST_COMM,

((LPCREATESTRUCT)lParam)->hInstance, NULL);

此时生成了一个空白列表

列表风格的设置

首先我们要设置列表的风格

LRESULT lStyle = SendMessage(hWndListView, LVM_GETEXTENDEDLISTVIEWSTYLE,

NULL, NULL); 获取原有风格

lStyle |= (LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

SendMessage(hWndListView, LVM_SETEXTENDEDLISTVIEWSTYLE, NULL, lStyle); 设置风

此时我们已经设置好了列表的风格

列表表头的填写

通常我们有2种方式对表头的填写:1.消息,2.宏

LV_COLUMN lvc = { 0 }; 初始化LV_COLUMN表头结构

lvc.mask |= (LVCF_TEXT | LVCF_WIDTH); mask设置标记,填充文本类型 也可以填充图标

lvc.pszText = new WCHAR[50]; 填充文本需要开辟空间

lvc.cx = 100; 设置列宽,即单个表头所占长度

memset(lvc.pszText, 0, 50); 清空文本空间

memcpy(lvc.pszText, L"List1", 12);

SendMessage(hWndListView, LVM_INSERTCOLUMN, 0, (LPARAM)&lvc); 利用消息的方式填

充表头,发送插入列消息,WParam是列下标,最后一个参数是结构

此时便有了一个表头,我们接下来依如上的方式多次填充文本:

memset(lvc.pszText, 0, 50);

memcpy(lvc.pszText, L"List2", 12);

SendMessage(hWndListView, LVM_INSERTCOLUMN, 1, (LPARAM)&lvc);

memset(lvc.pszText, 0, 50);

memcpy(lvc.pszText, L"List3", 12);

SendMessage(hWndListView, LVM_INSERTCOLUMN, 2, (LPARAM)&lvc);

memset(lvc.pszText, 0, 50);

memcpy(lvc.pszText, L"List4", 12);

ListView_InsertColumn(hWndListView, 3, &lvc); 利用宏的方式填充表头

此时便有了四个表头

列表内容的填充

LVITEM vItem = { 0 }; 初始化LVITEM值结构

vItem.mask = LVIF_TEXT; 对mask进行填充文本

vItem.pszText = new WCHAR[50]; 开辟填充值的空间

for (size_t i = 0; i < 10; i++)

{

   vItem.iItem = i; 表示第几行进行插入值内容

   vItem.iSubItem = 0; 表示从第0列进行插入值内容

   memset(vItem.pszText, 0, 50); 初始化值内容空间

   swprintf(vItem.pszText, L"List1Value%d", i); 在指定的缓冲区填充数据

   ListView_InsertItem(hWndListView, &vItem); 将值内容插到指定窗口,第一次添加值叫做插入

   vItem.iItem = i;

   vItem.iSubItem = 1;

   memset(vItem.pszText, 0, 50);

   swprintf(vItem.pszText, L"List2Value%d", i);

   ListView_SetItem(hWndListView, &vItem); 注:除了第一次使用ListView_InsertItem进行插入以

后,都需要使用ListView_SetItem进行色织

   vItem.iItem = i;

   vItem.iSubItem = 2;

   memset(vItem.pszText, 0, 50);

   swprintf(vItem.pszText, L"List3Value%d", i);

   ListView_SetItem(hWndListView, &vItem);

   vItem.iItem = i;

  vItem.iSubItem = 3;

   memset(vItem.pszText, 0, 50);

   wprintf(vItem.pszText, L"List4Value%d", i);

   ListView_SetItem(hWndListView, &vItem);

}

如图便是我们填充的结果

列表消息应用

列表中的消息处理在WM_NOTIFY中,是一个独立的消息

case WM_NOTIFY:

{

    switch (((LPNMHDR)lParam)->code)

    {

    case NM_CLICK: 左键点击列表弹窗内容

    {

        HWND hSWnd = GetDlgItem(hWnd, IDC_LIST_COMM); 获取当前点击的位置,行数索引

        DWORD dwItemIndex = ListView_GetSelectionMark(hSWnd); 获取文本

        CHAR * szBuffer = new WCHAR[50]; 设置文本缓冲区

        ListView_GetItemText(hSWnd, dwItemIndex, 2, szBuffer, 50); 将获取文本填充到缓冲区中,

仅限于第二列的内容

        MessageBox(hWnd, szBuffer, L"Msg", MB_OK);弹窗显示获取到的文本

        break;

        }

    case NM_RCLICK: 右键点击列表删除选择行

    {

        HWND hSWnd = GetDlgItem(hWnd, IDC_LIST_COMM); 获取当前点击的位置,行数索引

        DWORD dwItemIndex = ListView_GetSelectionMark(hSWnd);

        SendMessage(hSWnd, LVM_DELETEITEM  , dwItemIndex, NULL); 删除选择行

        break;

    }

    default:

        break;

    }

       break;

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/597770.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++可变参数模板

可变参数模板 一个可变参数模板就是一个接受可变数目参数的模板函数或模板类。 可变数目的参数被称为参数包。 存在两种参数包&#xff1a; 模板参数类&#xff0c;表示零个或多个模板参数&#xff1b;函数参数包&#xff0c;表示零个或多个函数参数。 我们用一个省略号来…

CVE漏洞是什么,如何对其进行针对性的防护

CVE&#xff08;Common Vulnerabilities and Exposures&#xff09;漏洞是一个网安技术术语&#xff0c;用于描述和标识信息安全领域的已知漏洞和安全风险。CVE是一个公开的列表或数据库&#xff0c;它为各种公开知晓的信息安全漏洞和风险提供了标准化的名称。 每个CVE标识符都…

监控员工电脑的方法有哪些,七种有效的措施

堡垒往往是从内部攻破的&#xff0c;很多企业信息的泄密就是内部员工泄露的&#xff0c;内部泄密占到了企业泄密的八成因素&#xff0c;那么企业能不能监控员工的电脑呢&#xff1f;有什么有效的办法呢&#xff1f; 1. 安装监控软件 屏幕监控软件&#xff1a;此类软件可以实时捕…

Redis群集模式

目录 一、集群的作用 二、Redis集群的数据分片 三、集群的工作原理​编辑 四、搭建Redis群集模式 1.准备环境 1.1 首先安装redis 1.2 在etc下创建redis 1.3再在redis中创建redis-cluster/redis600{1..6}文件 1.4 做个for循环 1.5 开启群集功能 1.6启动redis节点 1.…

汇编语言:寻址方式在结构化数据访问中的应用——计算人均收入

有一年多没有在CSDN上发博文了。人的工作重心总是有转移的&#xff0c;庆幸一直在做着有意义的事。   今天的内容&#xff0c;是为汇编语言课程更新一个实验项目。      本方案修改自王爽编《汇编语言》第&#xff14;版P172“实验7寻址方式在结构化数据访问中的应用” …

【御控物联】JavaScript JSON结构转换(22):小结

文章目录 一、结语二、接下来……三、在线转换工具四、技术资料 一、结语 《JavaScript JSON结构转换》主题自24.03.25至24.XX.XX历时XX天&#xff0c;共计编写 XX篇(XX篇功能说明XX篇场景)。 在此我们对《JavaScript JSON结构转换》功能做一下总结&#xff01; 在JSON结构转…

文件上传【1】

1.文件上传更改上传类型 上传文件时存在上传类型固定&#xff08;jpg、png、gif&#xff09;如果是前端确定&#xff08;弹窗&#xff0c;后端未出现请求确定是前端&#xff09;只需要在设置中禁用js代码或抓包更改文件后缀名就可以上传其他类型的文件&#xff08;亦可用于复制…

使用在对讲机上的国产芯片D4890介绍

1、D4890 目前客户主要使用在对讲机上 2、推荐的应用线路图如下&#xff1a; 3、实际测试输出波形如下&#xff08;VCC4.5V&#xff0c;RL&#xff1d;8Ω&#xff09;&#xff1a; 4、结论&#xff1a;我司推荐的 D4890 可满足客户的使用要求。

从300亿分子中筛出6款,结构新且易合成,斯坦福抗生素设计AI模型登Nature子刊

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 全球每年有近 500 万人死于抗生素耐药性&#xff0c;因此迫切需要新的方法来对抗耐药菌株。 …

基于巴法云物联网云平台构建可视化控制网页(以控制LED为例)

0 前言 如今大大小小的物联网云平台非常多&#xff0c;但大部分要收取费用&#xff0c;免费的物联网云平台功能则有很多限制使用起来非常不方便。以百度云物联网云平台为例&#xff0c;它的物可视不支持发布主题&#xff0c;等于可视化界面只能作为数据监控而不具备双向通信的…

练习题(2024/4/6)

1最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], target …

cJSON(API的详细使用教程)

我们今天来学习一般嵌入式的必备库&#xff0c;JSON库 1&#xff0c;json和cJSON 那什么是JSON什么是cJSON&#xff0c;他们之间有什么样的关联呢&#xff0c;让我们一起来探究一下吧。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&…