Windows SDK(五)按钮静态文本与编辑框控件

news/2024/6/16 11:50:26/文章来源:https://blog.csdn.net/2301_78838647/article/details/137207720

我们首先应该知道,所谓按钮静态文本等等控件都是窗口,他们都是隶属于父窗口下的子窗口,所

以在创建控件前,我们要首先创建一个父窗口,此处我们直接使用Windows桌面程序创建时,程

序自动为我们创建的一个窗口,该窗口如下表示:

 HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,750,

400, 500, 800, nullptr, nullptr, hInstance, nullptr);

此时我们已经有了一个主窗口,接下来开始讲解控件的创建和应用

在以下控件内容中,我们首先在全局变量中定义我们的控件ID,以便我们后续控件的查找

#define IDC_BUTTON_CHECK_1 0

#define IDC_BUTTON_CHECK_2 1

#define IDC_BUTTON_CHECK_3 2

按钮的创建

常见按钮类型如下:

    BS_PUSHBUTTON;       按压式按钮

    BS_DEFPUSHBUTTON;    显眼的按压式按钮

    BS_CHECKBOX;         复选框

    BS_AUTOCHECKBOX;     自动复选框

    BS_RADIOBUTTON;      单选按钮

    BS_AUTORADIOBUTTON;  自动单选按钮

    BS_3STATE;           三状态按钮

    BS_AUTO3STATE;       自动三状态按钮

    BS_GROUPBOX;         按钮群

    BS_OWNERDRAW;        自绘按钮

HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int

x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HANDLE hlnstance,LPVOID lpParam);

如上是我们创建窗口类的函数,该函数除了可以创建窗口以外,也可以创建一些预定义的系统类即

控件,如按钮类,编辑框类等等,所以我们可以根据该函数进行按钮(控件)的设置

由于控件本身属于父窗口,是作为父窗口的子窗口所存在,所以我们的控件在窗口主消息消息中窗

口创建的同时调用,而非在WM_PAINT中绘制控件,也就是如下函数中创建:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
    {
        此处创建子窗口即控件
        break;
    }   

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

此时我们正在WM_CREATE选项中创建一个子窗口,作为父窗口的按钮也就是父窗口的控件,并返回新窗口的句柄

    HWND hwndButton = CreateWindow(

       L"BUTTON",  预设的类名

       L"OK",      按钮显示的文字

       WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 选择应用哪个控件,此处应用按钮

       10,         窗口相对于父窗口左上角x坐标

       10,         窗口相对于父窗口左上角y坐标

       80,        窗口宽度

       20,        窗口高度

       hWnd,     所创建窗口的父窗口句柄,此处是程序自行创建的窗口的句柄

       IDC_BUTTON_CHECK_1, 子窗口ID也是控件ID,一般是全局变量,每个子窗口都要有ID,通常我们要通过该ID找窗口句柄,因为该函数返回的句柄可能不是全局

       (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE)

);   

通过以上步骤我们创建好了一个按钮,创建完毕后我们需要应用它,当我们点击按钮时,发送一个点击消息,该消息发送至消息循环中的WM_COMMAND中,然后进行二次分发,也就是在下面函数中:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    switch (message)

    {

    case WM_COMMAND:

        {

        此处填写点击消息

        }

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

此后我们填写点击消息默认在此选项中填写            

按钮的应用

在应用按钮之前,我们应该知道wParam:高16为时通知码,低16位是子窗口ID,IParam存储的是

触发消息的子控件的句柄

接下来我们将使用前文中创建的按钮进行应用

应用一:单击按钮,按钮名称改变

           if (LOWORD(wParam) == IDC_BUTTON_CHECK_1) 此处判断是子窗口ID是否相等:找到自己想要处理的控件

           {

              HWND hSWnd = GetDlgItem(hWnd, IDC_BUTTON_CHECK_1);  该函数用于间接获取窗口句柄,利用该函数可以获取返回窗口中指定参数ID的子元素的句柄,此处参数为父窗口的句柄和控件ID

             SetWindowText(hSWnd,L’sad’); 此时修改按钮标题为sad

        }

应用二:点击一个按钮把另一个按钮名称改变

我们首先要创建第二个按钮:

CreateWindow(

       L"BUTTON", 

       L"but2",    

       WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,

       10,       

       40,        

       80,   

       20,   

       hWnd,

       (HMENU)IDC_BUTTON_CHECK_2,   

       (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),

       NULL

); 

此时第二个按钮创建完毕

接下来我们要开始按钮的应用了:

if (LOWORD(wParam) == IDC_BUTTON_CHECK_1) 此处判断是否点击子窗口1

{

    HWND hSWnd = GetDlgItem(hWnd, IDC_BUTTON_CHECK_2);

    SetWindowText(hSWnd,L’sadXS’); 此时修改按钮2标题

}

应用三:隐藏和显示目标按钮

if(IsWindowVisible(hSWnd)) 判断窗口可不可见,此处为可见

{

    ShowWindow(hSWnd, SW_HIGH); 隐藏目标窗口

}

else

{

    ShowWindow(hSWnd, SW_SHOW); 显示目标窗口

}

应用四:禁用按钮

if(IsWindowEnabled(hSWnd)) 判断按钮是否正常,此处为正常

{

    EnableWindow(hSWnd, FALSE); 禁用目标按钮

}

else

{

    EnableWindow(hSWnd, TURE); 启用目标窗口

}

应用五:将按钮2的文本修改为按钮1的文本

if (LOWORD(wParam) == IDC_BUTTON_CHECK_2) 点击按钮2

{

    HWND hSWnd = GetDlgItem(hWnd, IDC_BUTTON_CHECK_1);

此处有两种获取按钮文本的方式:

方式一:WCHAR szBuffer[256] = { 0 };  作为获取文本的缓冲区

方式二:DWORD dwLength = GetWindowTextLength(hSWnd)

               WCHAR *szBuffer = new WCHAR[dwLength];

    GetWindowText(hSWnd, szBuffer, 256) 获取按钮1的文本

    SetWindowText((HWND)lParam,szBuffer); 此时修改按钮标题为按钮1的标题

}

复选框的创建

首先我们创建两个复选框

    CreateWindow(

       L"BUTTON",

       L"OK",    

       WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_CHECKBOX | BS_NOTIFY,

注:BS_NOTIFY 用于双击,BS_NOTIFY多选按钮,该类型按钮,点击后,按钮前置空格不会把对号勾上

       10,     

       10,        

       80,   

       20,       

       hWnd,   

       IDC_BUTTON_CHECK_1,    

       (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),

       NULL); 

    CreateWindow(

       L"BUTTON", 

       L"but2",  

       WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_CHECKBOX | BS_NOTIFY, 

       10,       

       40,       

       80,      

       20,       

       hWnd,    

       (HMENU)IDC_BUTTON_CHECK_2,    

       (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),

       NULL);  

复选框的应用

应用一:将复选框转换为自动复选框

switch (HIWORD(wParam))

{

    case BN_CLICKED: 单击点击时

    {

        SendMessage((HWND)lParam,BM_SETCHECK,!SendMessage((HWND)lParam,

BM_GETCHECK, 0, 0), 0);

       break;    

    }

}

原理是:单击时发送消息BM_SETCHECK给触发控件的窗口用于检测窗口是否被点击,之后再次发送信息BM_GETCHECK给该窗口以获取该窗口点击状态, 此时该信息取反,如此执行,该多选按钮点击后会有对号勾上

单选框的创建

首先我们要创建一个群用于存放我们的单选框

    HWND hGroup = CreateWindow( 此处创建一个群

       L"BUTTON", 

       L"Radio",    

       WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_GROUPBOX, 

       10,      

       10,    

       400,    

       300,    

       hWnd,    

       (HMENU)0,    

       (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),

       NULL);   

然后创建两个单选框

CreateWindow( 创建第一个单选框

       L"BUTTON",

       L"Radio1",   

       WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,

       50,      

       40,   

       80,    

       40,

       hGroup, 

       (HMENU)IDC_BUTTON_CHECK_1,    

       (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),

       NULL);     

    CreateWindow( 创建第二个单选框

       L"BUTTON", 

       L"Radio2", 

       WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON, 

BS_AUTORADIOBUTTON 该类型按钮,点击后,按钮前置空格会自动有对号勾上

       50,       

       80,      

       80,    

       40,      

       hGroup, 

       (HMENU)IDC_BUTTON_CHECK_2,      

       (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),

       NULL);

CreateWindow( 创建一个表示ok的按钮

       L"BUTTON", 

       L"OK",   

       WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,

       10, 

       70, 

       80, 

       20, 

       hWnd, 

       (HMENU)IDC_BUTTON_CHECK_3      

       (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),

       NULL); 

此时运行程序后,在一个群中,多个按钮只能有一个被勾选

单选框的应用

应用一:判断某按钮是否被选中

switch (HIWORD(wParam))

{

    case BN_CLICKED:

    if (LOWORD(wParam) == IDC_BUTTON_CHECK_3) 判断按钮3是否被点击

    {

        HWND hSWnd = GetDlgItem(hWnd, IDC_BUTTON_CHECK_1);获取窗口1句柄以判断点取状态

        if (SendMessage(hSWnd, BM_GETCHECK, 0, 0) == TRUE) 判断该按钮是否被点击

        {

            MessageBox(NULL, L"选中", L"Msg", MB_OK);

        }

        else

        {

            MessageBox(NULL, L"未选中", L"Msg", MB_OK);

        }

    }

       break;    

}

自绘按钮的创建

HWND BTN = CreateWindow( 此处创建一个自绘按钮

       L"BUTTON", 

       L"",   

       WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_OWENRORAW | BS_ICON,

BS_OWENRORAW 可以给图标上色 BS_ICON 可以在图标上加载图片

       10,       

       40,       

       80,       

       20,      

       hWnd,    

       (HMENU)IDC_BUTTON_CHECK_2,     

       (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),

       NULL);    

此时运行程序,发现创建了一个空的按钮

自绘按钮的应用

应用一:按钮上加载图像

紧跟在按钮创建后面:

SendMessage(BTN, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIcon(NULL, IDI_ERROR)); 该API可以加载一个图在该空白按钮上,此时没有图片地址,所以会加载一个叉号图标

应用二:按钮涂色

该函数在消息循环WM_CTLCOLORBTN设定文字颜色的控件选项中:

return (LRESULT)CreateSolidBrush(RGB(0, 0, 255)); 创建一个实心画刷,此处再次运行程序,按钮变成蓝色

静态文本的创建

CreateWindow(L"static", L"test", WS_VISIBLE | WS_CHILD | SS_LEFT, 10, 10, 100, 30, hWnd,

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

此处有一个新的获取程序实例句柄的方式:((LPCREATESTRUCT)lParam)->hInstance

此时运行程序以后,有一个test的文本

显示图标的创建

HWND hStatic = CreateWindow(L"static", L"test", WS_VISIBLE | WS_CHILD | SS_ICON, 10, 10, 100, 30, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL);

SendMessage(hStatic, STM_SETICON, (WPARAM)LoadIcon(NULL, IDI_ERROR), NULL);

此时运行程序,显示一个叉号的图标

显示位图的创建

HWND hStatic = CreateWindow(L"static", L"test", WS_VISIBLE | WS_CHILD | SS_BITMAP, 10, 10, 100, 30, hWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL);

HBITMAP hBitMap = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, 500, 100, LR_LOADFROMFILE); 加载位图,假设bg.bmp是我们的文件名

SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitMap);

此时运行程序会加载出我们自己的位图

编辑框的创建

HWND hwndEdit = CreateWindowEx(

    0, L"EDIT",  

    NULL, 

    WS_CHILD | WS_VISIBLE | WS_VSCROLL |

    ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,

    100, 10, 80, 200, 

    hWnd,     

    (HMENU)12138,  

    (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),

    NULL);      

}

此时运行程序出现一个编辑框,会有垂直滚动条

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

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

相关文章

6.8物联网RK3399项目开发实录-驱动开发之RTC实时时钟的使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接:https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f RTC 使用 简介 AIO-3399J 开发板上有 一个集成于 RK808 上的RTC(Real Time Clock),主要功能有时钟&#xff0c…

Linux-3 yum和vim

目录 本节目标: Linux 软件包管理器 yum 什么是软件包 1.yum是什么?软件包? 2.Linux(centos)的生态 3.yum的相关操作 我怎么知道我应该安装什么软件? 4.yum的本地配置 关于 rzsz 查看软件包 Linux编辑器-vim使用 1.v…

Red Hat配置本地yum源

Red Hat配置本地yum源 创建本地源文件夹 mkdir -p /mnt/cdrom挂载镜像文件至指定的目录 mount /dev/cdrom /mnt/cdrom备份本地源 cp -rf /etc/yum.repos.d /etc/yum.repos.d_$(date %Y%m%d_%H%M%S)删除默认原本地源 rm -rf /etc/yum.repos.d/*配置本地源,创建…

苹果应用上架攻略

苹果上架要求是苹果公司对于提交应用程序到苹果商店上架的要求和规定。这些要求主要是为了保证用户体验、应用程序的质量和安全性。以下是苹果上架要求的详细介绍:1. 应用程序的内容和功能必须符合苹果公司的规 苹果上架要求是苹果公司对于提交应用程序到苹果商店上…

Linux系统----------探索mysql数据库MHA高可用

目录 一、MHA概述 1.1 什么是 MHA 1.2MHA 的组成 1.2.1MHA Node(数据节点) 1.2.2MHA Manager(管理节点) 1.3MHA 的特点 1.4MHA工作原理 1.5数据同步的方式 1.5.1同步复制 1.5.2异步复制 1.5.3半同步复制 二、搭建 MySQ…

什么是AIGC,AIGC的应用领域有哪些,以及对AIGC的未来展望有什么值得关注的方向

AIGC:人工智能生成内容的深度解析 在数字技术的浪潮中,AIGC(ArtificialIntelligenceGeneratedContent,人工智能生成内容)逐渐崭露头角,成为继专业生产内容(PGC)和用户生产内容(UGC)之后的新型内容创作方式。它不仅改变了内容生产的传统模式,更在多个行业中展现出…

数据结构——第5章 树和二叉树

1 二叉树 二叉树和树都属于树形结构,但两者互不包含。即二叉树不是特殊的树。 1.1 二叉树的基本概念 1.2 二叉树的顺序存储 仅适用于完全二叉树 #define MaxSize 100 typedef int ElemType; typedef struct TreeNode{ElemType value;//结点中的数据元素bool isE…

Linux和Windows安装PHP依赖管理工具Composer

Composer 是 PHP 的一个依赖管理工具。它允许申明项目所依赖的代码库,会在项目中安装它们。 Composer 不是一个包管理器。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的…

【2023】kafka在linux和docker安装(kafka-1)

目录💻 一、linux安装kafka1. 安装jdk2. 上传解压到/usr/local目录下3、使用kafka 二、docker安装kafka1. 下载2. 安装zookeeper3. 安装kafka 一、linux安装kafka 环境主机 mac m2、虚拟机Ubuntu22.04.4 1. 安装jdk yum install -y java-1.8.0-openjdk.x86_64下载k…

自动驾驶执行层 - 线控底盘基础原理(非常详细)

自动驾驶执行层 - 线控底盘基础原理(非常详细) 附赠自动驾驶学习资料和量产经验:链接 1. 前言 1.1 线控的对象 在自动驾驶行业所谓的“感知-定位-决策-执行”的过程中,在末端的执行层,车辆需要自主执行决策层所给出的指令,具体…

大数据学习-2024/3/30-MySQL5.6版本的安装

1、下载好文件后打开bin目录: 2、在这个位置进入输入cmd进入命令行界面,进入命令行界面后输入如下:mysqld install 进行数据库安装: 注意:显示Service successfully installed表示安装成功 3、安装好后启动服务&…

iPhone设备中使用第三方工具查看应用程序崩溃日志的教程

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么? 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志,以便调查崩溃的原因。我们将展示三种不同的…

ObjectiveC-03-XCode的使用和基础数据类型

本节做为Objective-C的入门课程,笔者会从零基础开始介绍这种程序设计语言的各个方面。 术语 ObjeC:Objective-C的简称,因为完整的名称过长,后续会经缩写来代替;项目/工程:也称工程,指的是一个A…

邮件SMTP服务的工作原理?如何配置服务器?

邮件SMTP服务如何优化性能?怎么使用邮件服务器发信? 电子邮件能够准确无误地发送到收件人的邮箱中,离不开背后的SMTP服务。那么,邮件SMTP服务究竟是如何工作的呢?接下来,AokSend就来深入剖析一下邮件SMTP服…

力扣17 电话号码的字母组合 Java版本

文章目录 题目描述代码 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入&#xff1a…

RVM安装ruby笔记

环境 硬件:Macbook Pro 系统:macOS 14.1 安装公钥 通过gpg安装公钥失败,报错如下: 换了几个公钥地址(hkp://subkeys.pgp.net,hkp://keys.gnupg.net,hkp://pgp.mit.edu),…

V R虚拟现实元宇宙的前景|虚拟现实体验店加 盟合作|V R设备在线购买

VR(虚拟现实)技术作为一种新兴的技术,正在逐渐改变人们的生活和工作方式。随着技术的不断进步,人们对于元宇宙的概念也越来越感兴趣。元宇宙是一个虚拟世界,通过VR技术可以实现人们在其中进行各种活动和交互。 元宇宙的…

【论文笔记】Text2QR

论文:Text2QR: Harmonizing Aesthetic Customization and Scanning Robustness for Text-Guided QR Code Generation Abstract 二维码通常包含很多信息但看起来并不美观。stable diffusion的出现让平衡扫描鲁棒性和美观变为可能。 为了保证美观二维码的稳定生成&a…

鸿蒙原生应用开发-网络管理HTTP数据请求

一、场景介绍 应用通过HTTP发起一个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 二、接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 涉及的接口如下表,具体的…

bugku-web-秋名山车神

发现问题 每一次刷新后,得到的算式都不一样 但是按照他的说法在两秒内多次进行页面刷新,这时的算式是相同的 现在就要找到,是以何种方式将答案反馈给他 Give me value post about 965096517*4378809482019677711-1518023767539874227-528320…