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

可以发现,调用的代码量大大缩减,当然我们没有为其样式做形参,如果你有需求的话,也可以修改函数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter Notebook还有魔术命令?太好使了

在Jupyter Notebooks中,Magic commands(以下简称魔术命令)是一组便捷的功能,旨在解决数据分析中的一些常见问题,可以使用%lsmagic 命令查看所有可用的魔术命令 插播,更多文字总结指南实用工具科技前沿动态…

【鸿蒙软件开发】Stage模型开发概述应用/组件级配置

文章目录 前言一、基本概念1.1 UIAbility 组件1.2 ExtensionAbility 组件1.3 Context1.4 AbilityStage1.5 Stage模型开发流程应用组件开发了解进程模型了解线程模型应用配置文件 二、Stage模型应用/组件级配置2.1 为什么需要这个操作2.2 应用包名配置2.3 应用图标和标签配置2.4…

[NSSCTF 2nd] web刷题记录

文章目录 php签到MyBox非预期解预期解 php签到 源代码 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, …

第三章 SysML入门|系统建模语言SysML实用指南学习

仅供个人学习记录 UML与SysML的联系 可以稍微参考UML与SysML的联系 UML&#xff08;统一建模语言&#xff09;和SysML&#xff08;系统建模语言&#xff09;是两种与建模相关的语言&#xff0c;它们之间存在联系和区别。 SysML的图分类如下图所示。 SysML 图概述 这里只…

施耐德Lexium23A运行JOG停止时无减速过程解决方案

在现场调试时发现&#xff0c;如果Lexium23A工作在Pr模式下&#xff0c;无论是通过CANopen总线控制软件DI接通&#xff08;相应DI点设置为JOG运行&#xff09;还是实际的物理点接通&#xff0c;在JOG停止时&#xff0c;伺服电机会瞬间停止&#xff0c;造成机械冲击&#xff0c;…

C语言char的取值范围以及溢出情况

char 的取值范围 有符号&#xff1a; 1111 1111 ~ 1000 0000 — 0000 0000 ~ 0111 1111 -127 ~ -0 0 ~ 127 -128 ~ 127&#xff08;因为不需要两个 0 所以给负值增加了一位&#xff09; char 的溢出情况

VScode 自定义主题各参数解析

参考链接&#xff1a; vscode自定义颜色时各个参数的作用(史上最全)vscode编辑器&#xff0c;自己喜欢的颜色 由于 VScode 搜索高亮是在是太不起眼了&#xff0c;根本看不到此时选中到哪个搜索匹配了&#xff0c;所以对此进行了配置&#xff0c;具体想增加更多可配置项可参考…

python随手小练8(南农作业题)

题目1: 输入3 门课程 a,b,c 的成绩,求 3 门成绩的总和平均值(整数,四舍五人)以及最高和最低值。如果3门课程考试成绩分别以权重 0.50.3 和0.2计人总评成绩(整数先求总和再四舍五入),则最终总评成绩是多少? 具体操作&#xff1a; a float(input("a:")) b float(in…

Python 算法高级篇:图的表示与存储优化

Python 算法高级篇&#xff1a;图的表示与存储优化 引言 1. 什么是图&#xff1f;2. 图的基本概念3. 图的表示方法3.1. 临接矩阵表示临接矩阵的优点&#xff1a;临接矩阵的缺点&#xff1a; 3.2. 邻接表表示邻接表的优点&#xff1a;邻接表的缺点&#xff1a; 4. 优化的存储方法…

[python 刷题] 974 Subarray Sums Divisible by K

[python 刷题] 974 Subarray Sums Divisible by K 题目如下&#xff1a; Given an integer array nums and an integer k, return the number of non-empty subarrays that have a sum divisible by k. A subarray is a contiguous part of an array. 依旧是 prefix sum 的变种…

Hadoop3.0大数据处理学习3(MapReduce原理分析、日志归集、序列化机制、Yarn资源调度器)

MapReduce原理分析 什么是MapReduce 前言&#xff1a;如果想知道一堆牌中有多少张红桃&#xff0c;直接的方式是一张张的检查&#xff0c;并数出有多少张红桃。 而MapReduce的方法是&#xff0c;给所有的节点分配这堆牌&#xff0c;让每个节点计算自己手中有几张是红桃&#…

IOC课程整理-20 Spring 应用上下文生命周期

0.目录 1. Spring 应用上下文启动准备阶段 2. BeanFactory 创建阶段 3. BeanFactory 准备阶段 4. BeanFactory 后置处理阶段 5. BeanFactory 注册 BeanPostProcessor 阶段 6. 初始化內建 Bean&#xff1a;MessageSource 7. 初始化內建 Bean&#xff1a;Spring 事件广播器…

【LeetCode每日一题合集】2023.10.23-2023.10.29(简单的一周)

文章目录 2678. 老人的数目&#xff08;简单遍历模拟&#xff09;1155. 掷骰子等于目标和的方法数&#xff08;动态规划&#xff09;2698. 求一个整数的惩罚数&#xff08;预处理dfs回溯&#xff09;2520. 统计能整除数字的位数&#xff08;简单模拟&#xff09;1465. 切割后面…

【面试经典150 | 栈】简化路径

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;字符串数组模拟栈 其他语言python3 写在最后 Tag 【栈】【字符串】 题目来源 71. 简化路径 题目解读 将 Unix 风格的绝对路径转化成更加简洁的规范路径。字符串中会出现 字母、数字、/、_、. 和 .. 这几种字符&#…

关于FTP的一些往事

公司每天都要从美国的服务器下载大量的语音文件。然后根据语音的内容完成相关的医疗报告。不同语音的实时性要求是不一样的&#xff0c;有些要求6小时内完成&#xff08;TAT6&#xff09; &#xff0c;有些则是12小时。中美之间的网速又特别慢&#xff0c;所以&#xff0c;如何…

shell脚本变量

目录 1.变量的定义 2.shell脚本中变量的定义方法 3.变量的转译 4.Linux中命令的别名设定 5.用户环境变量的更改 6.利用命令的执行结果设定变量 7.脚本函数 1.变量的定义 1&#xff09;定义本身 变量就是内存一片区域的地址 2)变量存在的意义 命令无法操作一直变化的目…

14. 机器学习 - KNN 贝叶斯

Hi&#xff0c;你好。我是茶桁。 咱们之前几节课的内容&#xff0c;从线性回归开始到最后讲到了数据集的处理。还有最后补充了SOFTMAX。 这些东西&#xff0c;都挺零碎的&#xff0c;但是又有着相互之间的关系&#xff0c;并且也都蛮重要的。并且是在学习机器学习过程当中比较…

【赠书活动】从瀑布模式到水母模式:ChatGPT如何赋能软件研发全流程

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

测开 (性能测试)

目录 前言 1、性能测试和功能测试的区别 2、性能好与不好的表现 3、性能测试衡量指标 && 名称解释 指标一&#xff1a;并发用户数 指标二&#xff1a;响应时间 / 平均响应时间 指标三&#xff1a;事务 指标四&#xff1a;点击率&#xff08;Hit Per Second&…

【C++笔记】C++继承

【C笔记】C继承 一、继承的概念二、继承的语法和权限三、父类和子类成员之间的关系3.1、子类赋值给父类(切片)3.2、同名成员 四、子类中的默认成员函数4.1、构造函数4.2、拷贝构造4.3、析构函数 五、C继承大坑之“菱形继承”5.1、什么是“菱形继承”5.2、解决方法 一、继承的概…