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

news2024/10/7 19:28:14

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

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

在进行组合框与列表框的讲解前,我们首先在程序中定义几个宏作为我们在编写程序时的控件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.coloradmin.cn/o/1574726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言:顺序表专题

目录 一、数据结构之顺序表/链表1.数据结构相关概念1.1什么是数据结构1.2为什么需要数据结构 二、顺序表1.顺序表的概念及结构2.顺序表分类3.动态顺序表的实现 一、数据结构之顺序表/链表 1.数据结构相关概念 1.1什么是数据结构 数据结构是由“数据”和“结构”两词组合而来…

【优选算法专栏】专题十六:BFS解决最短路问题(一)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

云his系统源码 java源码saas模式 二甲医院his系统全套源码 数据库MySQL + MyCat

基层医院云HIS系统源码 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规功能&#xff0c;还能与公卫、PACS等各类外部系统融合&…

0基础学习python

0基础如何进入IT行业&#xff1f; 建议先掌握以下&#xff1a; 编程环境的安装和使用输出输入语句、变量、表达式的理解和使用选择结构、循环结构的理解和使用列表的使用文件的操作函数的调用库的安装和使用 编程&#xff0c;其实就是利用特定的语言控制计算机、或者就是与计算…

如何把音乐播放速度慢下来?享受慢音乐的两个方法

一&#xff0c;前言 在现代社会&#xff0c;我们生活在一个快节奏的环境中&#xff0c;时间仿佛被压缩成了碎片&#xff0c;每个人都在匆匆忙忙地追求着速度和效率。然而&#xff0c;有时放慢脚步&#xff0c;让心灵回归宁静&#xff0c;成为了一种难得的奢侈。 音乐&#xf…

民航电子数据库:在有分组统计的语句中,输出表达式含有非分组统计项

目录 一、场景二、报错信息三、排查四、原因五、解决 一、场景 1、对接民航电子数据库 2、执行SQL语句报错 二、报错信息 三、排查 查看数据库def_group_by_mode配置 show def_group_by_mode四、原因 def_group_by_mode设置为0导致&#xff0c;相当于mysql的sql_modeonly_…

NatCross实现NASCAB云可云内网穿透指南

一、简介 1、NAS_CAB介绍 跨平台NAS软件,远程管理照片,影音和文件&#xff0c;无需专用设备,个人版永久免费。官网地址&#xff1a;https://www.nascab.cn/。 2、NatCross介绍 NatCross是内网穿透工具,也是免费的端口映射和DDNS动态域名解析软件。软件从2021年上线以来&…

51单片机实验03-定时器T0来实现流水灯从左到右再从右到左

目录 一、实验目的 二、实验说明 1、51单片机有两个16位内部计数器/定时器&#xff08;C/T&#xff0c; Counter/Timer&#xff09;。 2、模式寄存器TMOD 1) M1M0工作模式控制位&#xff1b; 2) C/T定时器或计数器选择位&#xff1a; 3&#xff09;GATE定时器/计数器运行…

淘宝扭蛋机小程序源码搭建:打造专属电商娱乐新平台

在数字化浪潮的推动下&#xff0c;电商平台不断创新&#xff0c;以满足消费者日益多样化的需求。淘宝扭蛋机小程序作为一种创新的电商娱乐形式&#xff0c;受到了广大用户的热烈追捧。为了满足市场需求&#xff0c;许多企业和开发者开始关注淘宝扭蛋机小程序的源码搭建&#xf…

Centos7使用docker安装Jenkins(含pipeline脚本语句)

一、下载Jenkins docker pull jenkins/jenkins:lts 二、启动Jenkins docker run \-u root \--rm \-d \-p 8081:8080 \-p 50000:50000 \-v /root/docker/jenkins/var/jenkins_home:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/bin/docker:/usr…

渲染一帧特效需要多少钱?云渲染特效每帧成本

特效渲染的成本受到诸多因素的影响&#xff0c;每帧的渲染费用是评估整个项目预算的重要依据。随着云渲染技术的发展&#xff0c;其高效率和可伸缩性赢得了业界的广泛关注。对于影视制作公司和独立创作者而言&#xff0c;掌握云渲染特效的单帧成本是管理和优化预算分配的关键。…

Datacom HCIP笔记-路由策略与路由控制 之二

路由策略和策略的区别&#xff1f; 路由策略&#xff1a; 操作的对象是路由表条目&#xff0c; 实现路由过滤&#xff0c;从而实现访问控制&#xff0c;引入时过滤&#xff0c;发送和接收路由时过滤。 通过配置cost&#xff0c;来实现路径的控制。 策略路由&#xff1a; 对…

Redis数据库③主从复制+哨兵模式+集群模式

一.Redis主从复制 1.概念 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(Master)&#xff0c;后者称为从节点(Slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台…

国内ChatGPT大数据模型

在中国&#xff0c;随着人工智能技术的迅猛发展&#xff0c;多个科技公司和研究机构已经开发出了与OpenAI的ChatGPT类似的大型语言模型。这些模型通常基于深度学习技术&#xff0c;尤其是Transformer架构&#xff0c;它们在大量的文本数据上进行训练&#xff0c;以理解和生成自…

若依 ruoyi-vue 接口挂载获取Resources静态资源文件权限校验

解决小程序图片打包过大&#xff0c;放置后端&#xff0c;不引用ngnix、minio等组件&#xff0c;还能进行权限校验 package com.huida.web.controller.common.app;import com.huida.common.core.controller.BaseController; import com.huida.common.utils.file.FileUtils; imp…

c++的学习之路:14、list(1)

本章讲一下如何使用list&#xff0c;代码在文章末 目录 一、list介绍 二、增 三、删 四、查和改 五、交换 六、代码 一、list介绍 首先还是看一看官方文档的介绍如下图&#xff0c;如下方五点&#xff1a; 1. list是可以在常数范围内在任意位置进行插入和删除的序列式…

线程、多线程 、线程安全、线程通信、线程池 --java学习笔记

目录 什么是线程? 什么是进程&#xff1f; 线程的生命周期 线程的6种状态互相转换 什么是多线程? 如何在程序中创建出多条线程? 多线程的注意事项 多线程的创建方式一:继承Thread类 方式一优缺点: 代码演示&#xff1a; 多线程的创建方式二:实现Runnable接口 方…

n3.队列

1.队列 和堆栈一样&#xff0c;队列也属于受限制的线性表。 和堆栈不同的是&#xff0c;堆栈只能在一端进行出栈和入栈 &#xff08;先进后出&#xff09;&#xff0c;而队列只能在尾部插入&#xff0c;在头部删除&#xff08;先进先出&#xff09;**。 队列的操作 ——入…

8个免费视频素材网站,让你永久告别资源付费!

视频剪辑&#xff0c;需要用到各种类型的视频素材&#xff0c;一定要收藏好这8个网站&#xff0c;免费下载&#xff0c;让你永久告别资源付费&#xff0c;白嫖真爽。 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但…

【编译原理】手工打造语法分析器

重点&#xff1a; 语法分析的原理递归下降算法&#xff08;Recursive Descent Parsing&#xff09;上下文无关文法&#xff08;Context-free Grammar&#xff0c;CFG&#xff09; 关键点&#xff1a; 左递归问题深度遍历求值 - 后续遍历 上一篇「词法分析器」将字符串拆分为…