C语言编写图形化界面-创建按钮-为其指定样式
文章目录
- 前置章节
- 指定窗口样式
- 给按钮加边框
- 扁平化按钮
- 复选框样式按钮
- 自动复选框
- 单选按钮
- 三态按钮
- 自动三态按钮
- 默认按钮样式(对话框Enter键)
- 设置按钮位置和大小
- 封装函数
前置章节
开始之前,需要学习以下章节:
创建窗口
窗口过程函数
创建按钮
指定窗口样式
CreateWindow函数的第三个参数是窗口样式,它是一个用于指定窗口的外观和行为的标志的组合。
这里我们需要使用一些预定义的符号常量,通过位掩码的形式将这些符号常量进行一个组合。
在上面的示例中,我们使用了如下的定义:
WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON
WS_VISIBLE (0x10000000):表示创建后控件可见。如果不设置此标志,控件将在创建后不可见。
WS_CHILD (0x40000000):表示创建为父窗口的子窗口。子窗口是在父窗口的客户区内显示的独立窗口。如果没有设置此标志,那么按钮将会独立弹出一个窗口,也就是自己单独成个家,与父窗口分家了。
BS_PUSHBUTTON (0x00000000):表示创建一个普通按钮样式。此样式用于创建一个可以按下和释放的按钮。看到其符号常量的十六进制值,想必我不说你也能看出来,这就是默认值,也就是说,就算我们不使用此标志,也是没有关系的,默认创建的就是这个。
如上所述,我们通过按位或操作符 | 将这些常量组合在一起,并且可以同时设置多个样式。
给按钮加边框
我们可以使用WS_BORDER (0x00800000)来为窗口创建一个边框。边框样式可以根据操作系统的外观进行绘制。
代码如下所示:
HWND hButton = CreateWindow("BUTTON", "确认", WS_VISIBLE | WS_CHILD | WS_BORDER,50, 50, 100, 30,hWnd, NULL, NULL, NULL);
扁平化按钮
使用BS_FLAT (0x8000)可以创建一个扁平的按钮,也就是没有凸起的边框。这个样式的按钮更趋近于我们现代的程序样式。
代码如下所示:
HWND hButton = CreateWindow("BUTTON", "确认", WS_VISIBLE | WS_CHILD | BS_FLAT,50, 50, 100, 30,hWnd, NULL, NULL, NULL);
复选框样式按钮
使用BS_CHECKBOX (0x00000002)创建一个复选框样式的按钮。
代码如下:
HWND hButton = CreateWindow("BUTTON", "确认", WS_VISIBLE | WS_CHILD | BS_CHECKBOX,50, 50, 100, 30,hWnd, NULL, NULL, NULL);
自动复选框
前面那个复选框,你可以发现,他点击后并没有勾选,使用BS_AUTOCHECKBOX (0x00000003)可以创建一个自动复选框样式的按钮。当用户单击按钮时,按钮的选中状态将自动切换。
代码如下:
HWND hButton = CreateWindow("BUTTON", "确认", WS_VISIBLE | WS_CHILD |BS_AUTOCHECKBOX,50, 50, 100, 30,hWnd, NULL, NULL, NULL);
单选按钮
有了复选按钮,自然少不了单选按钮。使用BS_RADIOBUTTON (0x00000004)创建一个单选按钮样式的按钮。
代码如下:
HWND hButton = CreateWindow("BUTTON", "确认", WS_VISIBLE | WS_CHILD |BS_RADIOBUTTON,50, 50, 100, 30,hWnd, NULL, NULL, NULL);
三态按钮
使用BS_3STATE (0x00000005)创建一个三态按钮。按钮可以处于选中、未选中和半选中三种状态之一。
代码如下:
HWND hButton = CreateWindow("BUTTON", "确认", WS_VISIBLE | WS_CHILD |BS_3STATE,50, 50, 100, 30,hWnd, NULL, NULL, NULL);
自动三态按钮
显然,上面的三态按钮点击并不会有反应,我们可以使用BS_AUTO3STATE (0x00000006)创建一个自动三态按钮。按钮的状态会自动切换。
代码如下:
HWND hButton = CreateWindow("BUTTON", "确认", WS_VISIBLE | WS_CHILD |BS_AUTO3STATE,50, 50, 100, 30,hWnd, NULL, NULL, NULL);
默认按钮样式(对话框Enter键)
使用BS_DEFPUSHBUTTON (0x00000001)创建一个默认的按钮,通常是对话框中的 Enter 键默认按钮。
设置按钮位置和大小
CreateWindow 函数的第四个参数是按钮控件的位置和大小。
代码如下:
HWND hButton = CreateWindow("BUTTON", text, WS_VISIBLE | WS_CHILD |BS_FLAT,20, 50, 100, 40,hWnd, NULL, NULL, NULL);
如上所示,20, 50 是按钮的左上角位置的 x 和 y 坐标,而 100, 40 是按钮的宽度和高度。
封装函数
可以发现CreateWindow 函数的自由度还是比较高的,但创建的时候需要填写的内容太多了,我们之前只是简单的进行了一个封装,使其完全丧失了自由度,接下来我们进行新一轮的封装,让其为我们后续的开发提供更大的便利。
代码如下:
typedef struct _Vector2
{int x;int y;
}Vector2;
void CreateButton(HWND hWnd,char *text,Vector2 position,Vector2 size);
void CreateButton(HWND hWnd,char *text,Vector2 position,Vector2 size)
{HWND hButton = CreateWindow("BUTTON", text, WS_VISIBLE | WS_CHILD |BS_FLAT,position.x, position.y, size.x, size.y,hWnd, NULL, NULL, NULL);
}
我们声明了一个Vector2类型,用于表示我们的二维坐标,用其修改我们的位置和大小。
然后弄一个字符指针,指向一个常量字符串,用于指定我们按钮上的文字。
最后的调用示例如下:
CreateButton(hWnd,"按钮",(Vector2){10,30},(Vector2){100,20});
可以发现,调用的代码量大大缩减,当然我们没有为其样式做形参,如果你有需求的话,也可以修改函数。
相关文章:

C语言编写图形化界面-创建按钮-为其指定样式
文章目录 前置章节指定窗口样式给按钮加边框扁平化按钮复选框样式按钮自动复选框 单选按钮三态按钮自动三态按钮 默认按钮样式(对话框Enter键) 设置按钮位置和大小封装函数 前置章节 开始之前,需要学习以下章节: 创建窗口 窗口过…...
C++并发与多线程(7) | 创建多个线程时数据共享的问题
一、创建和等待多个线程 借助vector存放多个线程thread对象,借助vector和它的迭代器实现创建和运行多个线程,代码如下: #include <iostream> #include <thread> #include <vector> using namespace std;void myprint(int inum) {cout << "mypr…...

进程间通信(匿名管道、命名管道、消息队列、共享内存、信号量、信号、Socket)
文章目录 一、什么是进程间通信二、管道1.匿名管道(pipe)a).创建匿名管道b).管道的读写规则c).匿名管道的特点 2.有名管道(FIFO)a).创建命名管道b).命名管道的特点c).基于命名管道的进程间通信(服务端/客户端) 三、消息队列四、共享内存1.什么是共享内存…...

浅谈中国汽车充电桩行业市场状况及充电桩选型的介绍
安科瑞虞佳豪 车桩比降低是完善新能源汽车行业配套的一大重要趋势,目前各国政府都在努力推进政策,通过税收减免、建设补贴等措施提升充电桩建设速度,以满足新能源汽车需求。 近年来,在需求和技术的驱动下,充电桩的平…...

Postgresql在jdbc处理bit字段的解决方案
问题: bit如果长度为1,则会默认为布尔型(1-true 0-false); bit如果长度大于1,则会默认为bit类型,但是代码中以前常用的两种set方式,会报错 第一种方式: ps.setObject(i1,…...
ESMapping字段
在 Elasticsearch 中,字段(field)是指用于表示数据的最小单元。每个文档(document)都由一个或多个字段组成,字段存储了文档的不同属性或数据。 字段可以包含不同的数据类型,如文本、数字、日期…...

基于LDA的隐式标签协同过滤推荐算法_文勇军
, 王全民等人[14]提出了一种交替奇异值分解算法 (ASVD),即结合协同过滤和隐语义分析的混合推荐 算法。唐泽坤等人[15]融合聚类算法和协同过滤推荐 算法,取得了一定效果。高娜等人[16⁃19]将标签因子 和协同过滤推荐算法结合研究缓解了数据稀疏问题,但这…...

在线设计数据库表用Itbuilder,极简易用真香!!!
“如果您想要一个具有快速搜索运行的高性能数据库,那么数据库设计是必不可少的,花时间设计数据库将帮助您避免效率低下和高冗余等问题”。 在线数据库设计软件itbuilder,界面清爽漂亮,功能简洁,没有多余设置很容易上手…...
onclick事件的用法
onclick 事件是一种在网页开发中用来处理用户点击操作的事件。它通常用于 HTML 元素(如按钮、链接、图像等),以便在用户单击该元素时触发 JavaScript 函数或执行一些特定的操作。以下是 onclick 事件的用法: HTML 元素上的 onclic…...

二叉排序树
二叉排序树定义及性质 二叉排序树(Binary Sort Tre)或者是一棵空树,或者是具有如下性质的二叉树: (1) 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2) 若它的右子树不空,则右子树上所有结点的值均…...

探秘Spring的设计精髓,深入解析架构原理
序员与平庸的程序员之间的区别,是在于认为自己的代码重要还是数据结构更加重要。平庸的程序员眼里只有代码,优秀的程序员则关注数据结构及之前的关系。” 1、spring的设计理念 spring提供了一个轻量级的开发框架,抽象了实际开发中的很多共…...
Python Wordcloud报错:Only supported for TrueType fonts,多种解决方案
Python Wordcloud报错:Only supported for TrueType fonts,多种解决方案。 报错内容如下: 2023-10-26T09:35:41.190459839Z Traceback (most recent call last): 2023-10-26T09:35:41.190502589Z File “lib/task/compute.py”, line 621, i…...

为虚拟网络提供敏捷负载均衡:Everoute LB 特性解读
为了保证应用系统的可用性,同时避免并发访问导致后端服务器出现性能瓶颈,不少用户都通过负载均衡技术优化流量分发。随着虚拟化平台下用户业务规模的持续扩大,虚拟化网络的数据访问量也不断增加,而传统负载均衡通常通过硬件负载均…...

Jmeter 接口测试,参数值为列表,如何参数化?
最近在我的教学过程中,我的一个学生问了我一个问题,他们公司的一个接口参数值是列表,列表中值的数量有多有少,问我在 jmeter 中如何让这个参数的值进行参数化? 看到这种问题,你的第一反应是什么?…...

DeepinV20实现使用CapsLock键切换输入法
概览 起因参考资料解决问题1. 删除CapsLock键映射关系2. 新建CapsLock键映射关系3. 建立配置文件4. **注销用户或者重启电脑**5. 修改切换输入法快捷键6. 测试输入 起因 看同事的MacBook可以使用CapsLock键切换输入法,而我作为Shift党CapsLock键几乎不使用…...

基于springboot实现校友社交平台管理系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现校友社交平台管理系统演示 摘要 校友社交系统提供给用户一个校友社交信息管理的网站,最新的校友社交信息让用户及时了解校友社交动向,完成校友社交的同时,还能通过论坛中心进行互动更方便。本系统采用了B/S体系的结构,使用了java技…...

WordPress主题模板 大前端D8 5.1版本完整开源版源码简洁大气多功能配置
源码测评:该模板官方已更新至5.2,但是这个5.1也是非常好用的,经测试所有页面均完好,推荐下载使用。 模板简介: 大前端D8 主题是一款非常牛逼的WordPress博客主题,响应式,功能齐全,支持手机,电脑,平板,非常适合做博客站…...

如何在Postman中使用静态HTTP
首先,打开 Postman 软件。在 Postman 的菜单栏中,点击 “Preferences”(偏好设置)。 亲身经验:我自己尝试了这个方法,发现它非常适用于需要使用HTTP的场景。 数据和引证:根据 Postman 官方文档…...
vscode 提升Vue开发效率的必备插件与工具
1,Vetur:提供了Vue语法高亮、智能提示、代码片段、错误检查和格式化等功能,是Vue开发中必不可少的插件。 2,ESLint:用于检查和修复JavaScript和Vue代码中的语法错误和潜在问题,提高代码质量。 3ÿ…...

mysql/java/springboot/javaweb请假系统,分为学生/辅导员/超级管理员
源码下载地址 支持:远程部署/安装/调试、讲解、二次开发/修改/定制 系统分为 学生/辅导员/超级管理员 学生 辅导员 超级管理员...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...