[SDK]-按钮静态文本与编辑框控件

news2024/11/13 15:01:49

前言

  • 各位师傅大家好,我是qmx_07,今天给大家讲解按钮控件和编辑框的相关知识
    在这里插入图片描述

控件

  • 概念:Windows Software Development Kit(SDK)提供的一组可重用的用户界面元素,在应用程序使用的可视化界面,比如:文本框,图片加载,按钮提交,菜单等元素信息
    在这里插入图片描述

按钮控件

  • 介绍:按钮通常用于触发某个操作或事件,如提交表单、启动任务或导航到其他界面,最常见的是:接收账号密码,将数据提交到后端处理文件
  • 按钮类型:单选按钮,复选框按钮,分组框
  • 用户单击一个按钮时会收到键盘焦点。 系统向按钮的父窗口发送包含 BN_CLICKED 通知代码的 WM_COMMAND 消息

单选按钮

创建按钮
  • 由常量 BS_PUSHBUTTON 和 BS_DEFPUSHBUTTON 定义
    语法:
HWND hwndButton = CreateWindow( 
    L"BUTTON",  // Predefined class; Unicode assumed 
    L"OK",      // Button text 
    WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles 
    10,         // x position 
    10,         // y position 
    100,        // Button width
    100,        // Button height
    m_hwnd,     // Parent window
    NULL,       // No menu.
    (HINSTANCE)GetWindowLongPtr(m_hwnd, GWLP_HINSTANCE), 
    NULL);      // Pointer not needed.
  • 演示:

VOID MyWindows(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND hwndButton = CreateWindow(
        L"BUTTON",  // Predefined class; Unicode assumed 
        L"OK",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles 
        10,         // x position 
        10,         // y position 
        80,        // Button width
        20,        // Button height
        hWnd,     // Parent window
        NULL,       // No menu.
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL);      // Pointer not needed.
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
    {
        MyWindows(hWnd, message, wParam, lParam);
        break;
    }

在这里插入图片描述

  • WM_CREATE 用于创建控件信息,用作窗口初始化的一些信息
通过控件ID 实现改变按钮文本内容
  • 定义按钮 全局控件ID
#define IDC_BUTTON_CHECK_1 0
HWND hwndButton = CreateWindow(
        L"BUTTON",  // Predefined class; Unicode assumed 
        L"OK",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles 
        10,         // x position 
        10,         // y position 
        80,        // Button width
        20,        // Button height
        hWnd,     // Parent window
        IDC_BUTTON_CHECK_1,       //  将控件ID加载在这里
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL); 
  • 当我们获取到控件ID的时候,就可以对这个控件进行修改操作
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
    {
        MyWindows(hWnd, message, wParam, lParam);
        break;
    }
    case WM_COMMAND:
        {
        if (LOWORD(wParam) == IDC_BUTTON_CHECK_1)
        {
            HWND change = GetDlgItem(hWnd, IDC_BUTTON_CHECK_1);
            SetWindowText(change, L"qmx_07");
        }
  • 用户点击按钮之后,会将消息发送到WM_COMMAND里面
  • wParam 的低位字(LOWORD)是按钮的 ID
  • 通过wparam判断按钮是否被点击
    画面演示:
    在这里插入图片描述
通过控件ID 显示隐藏按钮 ,启用 禁用按钮
  • 定义全局变量控件ID
#define IDC_BUTTON_CHECK_1 0
#define IDC_BUTTON_CHECK_2 1
HWND hwndButton = CreateWindow(
        L"BUTTON",  // Predefined class; Unicode assumed 
        L"隐藏",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles 
        10,         // x position 
        10,         // y position 
        80,        // Button width
        20,        // Button height
        hWnd,     // Parent window
        IDC_BUTTON_CHECK_1,       // No menu.
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL);      // Pointer not needed.

    CreateWindow(
        L"BUTTON",  // Predefined class; Unicode assumed 
        L"OK",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles 
        10,         // x position 
        50,         // y position 
        80,        // Button width
        20,        // Button height
        hWnd,     // Parent window
        (HMENU)IDC_BUTTON_CHECK_2,       // No menu.
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL);      // Pointer not needed.
  • 定义两个windows单选按钮,创建多个控件时 IDC需要(HMENU)强转
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
    {
        MyWindows(hWnd, message, wParam, lParam);
        break;
    }
    case WM_COMMAND:
        {
        if (LOWORD(wParam) == IDC_BUTTON_CHECK_1)
        {
            HWND change = GetDlgItem(hWnd, IDC_BUTTON_CHECK_2);

            if (IsWindowVisible(change))
            {
                ShowWindow(change, SW_HIDE);
            }
            else
            {
                ShowWindow(change, SW_SHOW);
            }
        }
  • IsWindowVisible API函数,用于检索一个窗口句柄是否要隐藏,如果已经隐藏则显示,如果显示则隐藏

  • SW_HIDE 隐藏

  • SW_SHOW 显示
    画面演示:
    在这里插入图片描述

  • 想要启用 禁用 按钮,调用WINDOW API就好

 case WM_COMMAND:
        {
        if (LOWORD(wParam) == IDC_BUTTON_CHECK_1)
        {
            HWND change = GetDlgItem(hWnd, IDC_BUTTON_CHECK_2);

            if (IsWindowEnabled(change))
            {
                EnableWindow(change, FALSE);
            }
            else
            {
                EnableWindow(change, TRUE);
            }
        }
  • IsWindowEnabled函数判断指定的窗口是否启用。当窗口启用时,用户可以与窗口进行交互;当窗口禁用时,用户无法与窗口进行交互
  • EnableWindow函数是Windows API中的一个函数,用于启用或禁用一个窗口
    画面演示:
    在这里插入图片描述
获取按钮文本信息
   case WM_COMMAND:
        {
        if (LOWORD(wParam) == IDC_BUTTON_CHECK_1)
        {
            HWND change = GetDlgItem(hWnd, IDC_BUTTON_CHECK_2);
            DWORD dwlength = GetWindowTextLength(change);
            WCHAR* szBuffer = new WCHAR[dwlength+1];
            GetWindowText(change, szBuffer, 256);
            SetWindowText((HWND)lParam, szBuffer);
         
        }
  • GetWindowTextLength 获取文本长度
  • GetWindowText 将按钮2的内容 复制到 szBuffer里面
  • SetWindowText 将szBuffer 改变按钮1的内容
  • lparam代表按钮本身
    画面演示:
    在这里插入图片描述

多选框按钮

  • 多选框按钮 分为 手动复选框 和 自动复选框
  • 分别由常量 BS_CHECKBOX、BS_AUTOCHECKBOX定义
    创建自动复选框:
  CreateWindow(
        L"BUTTON",  // Predefined class; Unicode assumed 
        L"OK",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,  //将这里改成BS_AUTOCHECKBOX就好
        10,         // x position 
        50,         // y position 
        80,        // Button width
        20,        // Button height
        hWnd,     // Parent window
        (HMENU)IDC_BUTTON_CHECK_1,       // No menu.
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL);      // Pointer not needed.

创建手动复选框:

 CreateWindow(
        L"BUTTON",  // Predefined class; Unicode assumed 
        L"改变",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_CHECKBOX,  // Styles 
        10,         // x position 
        10,         // y position 
        80,        // Button width
        20,        // Button height
        hWnd,     // Parent window
        IDC_BUTTON_CHECK_2,       // No menu.
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL);      // Pointer not needed.

画面效果:
在这里插入图片描述

  • 可以看到BS_AUTOCHECKBOX可以勾选,而BS_CHECKBOX点击无响应
  • 需要做以下操作:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
    {
        MyWindows(hWnd, message, wParam, lParam);
        break;
    }
    case WM_COMMAND:
        {
        switch (HIWORD(wParam))
        {
        case BN_CLICKED:
            SendMessage((HWND)lParam, BM_SETCHECK, !SendMessage((HWND)lParam, BM_GETCHECK, 0, 0), 0);
        }
  • switch (HIWORD(wParam)):获取与 WM_COMMAND 消息相关的控制标识符的高位字
  • case BN_CLICKED::表示按钮被点击
  • SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) 用于获取指定控件(由 lParam 表示的控件)的选中状态
  • SendMessage((HWND)lParam, BM_SETCHECK,!SendMessage((HWND)lParam, BM_GETCHECK, 0, 0), 0)就是将选中状态取反,如果按钮当前被选中,它会被设置为未选中
    在这里插入图片描述
  • 手动多选框按钮 和 自动多选框按钮 只能选择一种

分组框按钮

VOID MyWindows(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND hGroup = CreateWindow(
        L"BUTTON",  // Predefined class; Unicode assumed 
        L"BUTTON",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_GROUPBOX,  // Styles 
        50,         // x position 
        10,         // y position 
        200,        // Button width
        200,        // Button height
        hWnd,     // Parent window
        IDC_BUTTON_CHECK_1,       // No menu.
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL);      // Pointer not needed.

    CreateWindow(
        L"BUTTON",  // Predefined class; Unicode assumed 
        L"BUTTON1",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,  // Styles 
        50,         // x position 
        40,         // y position 
        100,        // Button width
        40,        // Button height
        hGroup,     // Parent window
        (HMENU)IDC_BUTTON_CHECK_2,       // No menu.
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL);      // Pointer not needed.

    CreateWindow(
        L"BUTTON",  // Predefined class; Unicode assumed 
        L"BUTTON2",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,  // Styles 
        50,         // x position 
        80,         // y position 
        100,        // Button width
        20,        // Button height
        hGroup,     // Parent window
        (HMENU)IDC_BUTTON_CHECK_2,       // No menu.
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL);      // Pointer not needed.
        }
  • 需要子按钮控件里面填入父亲窗口句柄
    画面演示:
    在这里插入图片描述

确认选中状态

VOID MyWindows(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND hwndButton = CreateWindow(
        L"BUTTON",  // Predefined class; Unicode assumed 
        L"OK",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,  // Styles 
        10,         // x position 
        10,         // y position 
        80,        // Button width
        20,        // Button height
        hWnd,     // Parent window
        IDC_BUTTON_CHECK_1,       //  将控件ID加载在这里
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL);

    CreateWindow(
        L"BUTTON",  // Predefined class; Unicode assumed 
        L"OK",      // Button text 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles 
        10,         // x position 
        80,         // y position 
        80,        // Button width
        20,        // Button height
        hWnd,     // Parent window
        (HMENU)IDC_BUTTON_CHECK_3,       //  将控件ID加载在这里
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL);
}
  • 生成一个自动多选框 和 单选按钮
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
    {
        MyWindows(hWnd, message, wParam, lParam);
        break;
    }
    case WM_COMMAND:
        {
        switch (HIWORD(wParam))
        {
        case BN_CLICKED:
        {
            if (LOWORD(wParam) == IDC_BUTTON_CHECK_3)
            {
                HWND hSWnd = GetDlgItem(hWnd, IDC_BUTTON_CHECK_1);
                if (SendMessage(hSWnd, BM_GETCHECK, 0, 0) == TRUE)
                {
                    MessageBox(NULL, L"选中", L"Msg", MB_OK);
                }
                else
                {
                    MessageBox(NULL, L"未选中", L"Msg", MB_OK);
                }
            }
        }
  • 当点击按钮的时候,SendMessage(hSWnd, BM_GETCHECK, 0, 0) 判断多选框的选中状态
    在这里插入图片描述

创建静态文本

CreateWindow(L"static", L"Hello, this is a static text.",
            WS_CHILD | WS_VISIBLE | SS_LEFT,
            10, 10, 200, 20,
            hWnd, NULL, NULL, NULL);
  • 左对齐,不换行
  • 左对齐并换行
  • 居中对齐
  • 右对齐
  • 简单
  • 分别由常量 SS_LEFTNOWORDWRAP、SS_LEFT、SS_CENTER、SS_RIGHT 和 SS_SIMPLE 定义
    画面演示:

在这里插入图片描述

创建编辑框

    CreateWindowEx(
        0, L"EDIT",   // predefined class 
        NULL,         // no window title 
        WS_CHILD | WS_VISIBLE | WS_VSCROLL |
        ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
        300, 20, 100, 200,   // set size in WM_SIZE message 
        hWnd,         // parent window 
        (HMENU)IDC_BUTTON_CHECK_1,   // edit control ID 
        (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
        NULL);
  • WS_VSCROLL(垂直滚动条)、ES_MULTILINE(多行模式)和ES_AUTOVSCROLL(自动垂直滚动)
    在这里插入图片描述

总结

  • 讲解了按钮、静态文本和编辑框控件,这些了解就好,后面 会有拖动版本

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

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

相关文章

ini文件中的节点如何删除?

1、在某些场合中,会将某些数据记录本地情况,会有“保存/加载”过程。 比如: 第一次Write节点信息(2个),如下节点 第二次Write节点信息(1个),如下节点。会发现本来想写入…

实战项目:俄罗斯方块(六)

文章目录 🍊自我介绍🍊图像界面绘制界面绘制界面显示代码运行结果 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我介绍 Hello,大家好,我是小珑也…

检测文件解析漏洞的工具

免责声明此文档仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担&…

000:VTK的安装(VTK 编译 + 运行第一个例子)

VTK 医学图像处理---VTK安装 简介: 主要包括四个部分: 安装前准备(需要下载和安装什么软件以及为什么);VTK编译与安装(编译过程中的一些选项到底是否勾选,已经为什么勾选)&#xff…

9.2-考试项目前端容器的高可用+java容器的高可用+使用docker-compose部署考试前端容器+使用docker-compose一次性创建多台容器

配置高可用的项目 基于部署考试系统的项目进行高可用 一、前端的高可用 1.先创建三个前端nginx容器,端口不能映射80 # 删除通用的前端容器 [roothaproxy ~]# docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS…

数论——拓展欧几里德算法复习

最近也是在备战比赛,所以也是来小小的复习了一下以前学的东西 最重要的是第一道题! 最重要的是第一道题! 最重要的是第一道题! 先放拓欧板子(不懂怎么推出了就发在评论区或者私聊) int exgcd(int a,i…

s3fs的使用

s3fs是一个将s3服务器上的桶映射为本地目录的程序。 项目源码位于: https://github.com/s3fs-fuse/s3fs-fuse 这是一个比较长期的项目了,现在在大数据领域S3协议基本上已经成为最通用的协议。 各大云平台,什么阿里云,某为云&am…

初识Linux · 有关makefile

目录 前言: 1 makefile的简单使用 2 makefile介绍 前言: 我们上文介绍了gcc和g的基本使用,带了许多的子指令,但是有的时候啊,一个一个敲指令确实有点麻烦了,此时,一个工具就能派上用场&…

DDD设计方法-3-仓储,封装持久化数据

前情提要:一共包含 如下六篇文章(篇幅精简,快速入门) 1、初识DDD 2、聚合、实体、值对象 3、仓储,封装持久化数据 4、端口和适配器 5、领域事件 6、领域服务,实现约定 DDD设计方法-3-仓储,封装…

计算机网络 第2章 物理层

文章目录 通信基础基本概念信道的极限容量编码与调制常用的编码方法常用的调制方法 传输介质双绞线同轴电缆光纤以太网对有限传输介质的命名规则无线传输介质物理层接口的特性 物理层设备中继器集线器一些特性 物理层任务:实现相邻节点之间比特(0或1&…

后端MVC三层架构,Mybatis ,雪花算法生成唯一id

一.MVC MVC(Model View Controller),它是一种思想,他把软件系统分为 以下三部分: Model(模型):用来处理程序中数据逻辑的部分(service,dao层) View(视图):在应用程序中&#xff0…

如何把逆地理编码结果表格的不同字段都作为点标注的属性

0.序 很多行业都需要获取一些地点的信息作为gis基础数据。 如消防行业的重点建筑 交通行业的道路 智慧城市的商业楼栋等等。 这些表格信息如何叠加到地图之上,并能够很好的查看各个字段的信息? 本文的重点是把经纬度坐标的Excel表格内容转成kml&…

【Python】数据分析分类图可视化

目录 条形图 箱形图 散点图 分簇散点图 小提琴 分簇小提琴 条形图 条形图是一种直观的图表形式,它通过不同长度的矩形条(即“条形”)来展示数值变量的中心趋势估计值,其中每个矩形的高度直接对应于该组数据的某个中心量度&…

保存json时,保存成自己喜欢的格式的方法(而不是直接保存成格式化的json文档)

保存json时,不是直接保存成格式化的json文档的格式的方法 前言,博主是如何把格式话的json格式保存成自己喜欢的json格式的保存成格式化的json文档的格式:带缩进格式全部保存成一行每条数据保存成一行: 保存成自己喜欢的格式碎碎念…

《Rust避坑入门记》第1章:挖数据竞争大坑的滥用可变性

赵可菲是一名Java程序员,一直在维护一个有十多年历史的老旧系统。这个系统即将被淘汰,代码质量也很差,每次上线都会出现很多bug,她不得不加班修复。公司给了她3个月的内部转岗期,如果转不出去就会被裁员。她得知公司可…

奇安信天眼--探针/分析平台部署及联动

奇安信天眼–探针/分析平台部署及联动 一 概述二 探针/分析平台部署及联动 1.网络拓扑2.配置流量传感器(探针) (1)登录控制台(2)配置接口(3)配置默认路由及DNS(4)配置SNMP(5)在探针联动分析平台 3.配置分析平台 (1)登录控制台(2)配置接口(3)配置默认路由…

2024年全国各省路网矢量数据介绍

一、2024年全国路网矢量数据介绍 数据更新时间:2024年5月 数据范围:全国(不包含台湾省) 数据格式:shp(线) 数据包含类型:城市主干道、城市次干道、城市快速路、城市支路、高速公…

Python编码系列—Python代码审查的艺术:提升代码质量的黄金法则

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

苹果录屏功能究竟何在?深入探寻苹果设备上的录屏功能:简便、高效、一键达成

在当下这一数字化的时代,不论是教学演示,还是游戏分享,抑或是工作汇报,录屏软件皆已成为我们日常生活中不可或缺之工具。苹果设备以其出类拔萃的用户体验而声名远播,而其内置的录屏功能更是将便捷性与功能性精妙融合。…

TensorFlow介绍二-线性回归案例

一.案例步骤 1.准备数据集:y0.8x0.7 100个样本 2.建立线性模型,初始化w和b变量 3.确定损失函数(预测值与真实值之间的误差),均方误差 4.梯度下降优化损失 二.完整功能代码: import os os.environ[TF…