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

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

以在创建控件前,我们要首先创建一个父窗口,此处我们直接使用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.mzph.cn/news/788070.shtml

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

相关文章

类和对象(下)--- 初始化列表、explicit、友元、static、匿名对象和内部类

本篇将会对类和对象的主要知识收尾,先会对构造函数进行补充,分别补充了构造函数体赋值、初始化列表、explicit 关键字,然后介绍 static 成员知识以及友元、内部类还有匿名对象等知识点,目录如下: 目录 1. 构造函数补充…

VUE3——生命周期

Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但有有两个被更名: beforeDestroy改名为 beforeUnmountdestroyed改名为 unmounted Vue3.0也提供了 Composition API 形式的生命周期钩子,与Vue2.x中钩子对应关系如下: beforeCreate&g…

【ROS 笔记5】话题发布与订阅————高级(一)

1. 前言 在使用ros pulisher时, 我们在建立话题 pub = rospy.Publisher(chatter, String, queue_size=10) 我们的目的时将我们的message (string)通过话题发布出去,如:pub.publish(hello_str)。 如果是为了处理单个话题的问题, 我们只用一个pub.publish()去发布就好。 …

matlab学习(一)(3.26-4.1)

一.信息隐藏的概念 信息隐藏是利用一些技术,使得要隐藏的信息是用眼睛看不出变化的。它将秘密信息隐藏在可公开的媒体信息中,使人们凭直观的视觉和听觉难以察觉基存在。 二.空域信息隐藏技术 空域信息隐藏是将信息直接嵌入到图像的像素值中的技术。主要…

洛谷 P2658 汽车拉力比赛

思路:二分BFS 题目的大意就是找出一个难度系数,让到达每一个路标之间的相邻格子的高度之差为难度系数。 所以,想要找到这个难度系数,我们需要不断地枚举数据范围内的数据,然后一个一个试试,全部BFS遍历一…

Mysql 和 Redis 数据怎么保持一致性,怎么实现

MySQL 和 Redis 是两种不同类型的数据库,MySQL 是关系型数据库,而 Redis 是键值存储的非关系型数据库。它们在数据一致性的保证上需要采取不同的策略,尤其是在分布式环境中。以下是一些保持 MySQL 和 Redis 数据一致性的常见策略:…

ISELED-演示项目代码

目录 一、main函数二、点灯函数一、main函数 int main(void) {/* Write your local variable definition here */iseledInitType.crcEnable = 1;iseledInitType.firstLedAdr = 1;iseledInitType.tempCmpEnable = 0;iseledInitType.voltSwing = 0;/*** End of Processor Expert…

简单了解裸眼3D呈现技术

裸眼3D呈现是一种不需要佩戴任何特殊设备(如3D眼镜或头盔)即可观看到3D效果的技术。这种技术近年来得到了快速发展,为观众带来了更加沉浸式的视觉体验。 实现裸眼3D呈现的关键步骤包括: 创建立体图像源:首先需要有一…

HWOD:记录正负数

一、知识点 1、scanf()的返回值 scanf()返回值类型为int,返回转换成功的个数 有代码int temp; scanf("%d",&temp); 在屏幕输入一个数字,比如5,回车,scanf()返回1 在屏幕输入一个字符或字符串,比…

STM32 M3内核寄存器概念

内容主要来自<<M3内核权威指南>> 汇编程序中的最低有效位&#xff08;Least Significant Bit&#xff09;。LSB是二进制数中最右边的位&#xff0c;它代表了数值中的最小单位。在汇编程序中&#xff0c;LSB通常用于表示数据的最小精度或者作为标志位。 ---------…

人工智能|深度学习——基于Xception算法模型实现一个图像分类识别系统

一、Xception简介 在计算机视觉领域&#xff0c;图像识别是一个非常重要的任务&#xff0c;其应用涵盖了人脸识别、物体检测、场景理解等众多领域。随着深度学习技术的发展&#xff0c;深度卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff…

linux下tar命令的压缩和解压详细使用方法

在Linux系统中&#xff0c;tar命令用于创建、查看、提取和解压 tar 存档文件。以下是 tar 命令的一些常见用法&#xff1a; 压缩文件或目录&#xff1a; tar -czvf archive.tar.gz /path/to/directory # 压缩目录为 .tar.gz 格式的文件tar -czvf archive.tar.gz file1 file2 …

测试人员前期参与设计方案时需要注意什么?

服务的健壮性跟系统设计有很大关系&#xff0c;前期设计时考虑多一些处理逻辑&#xff0c;可以避免后期出现问题带来的损失以及修复问题的成本。 在前期讨论设计方案时测试同学也需要参与&#xff0c;而不只是埋头设计用例和测试&#xff0c;开发同学可能因为思维局限或者思考…

ssm018简易版营业厅宽带系统+jsp

营业厅宽带系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本营业厅宽带系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间…

LeetCode 977 有序数组的平方(双指针法)

给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c;数组变为 […

QCustomPlot一、QCustomPlot基础及画图显示

1、QCustomPlot下载 QCustomPlot源码demo 根据需要选择需要的文件&#xff1a; 完整版。QCustomPlot.tar.gz 源代码例子帮助文档&#xff1b; 共享库。QCustomPlot-sharedlib.tar.gz 库编译和使用&#xff1b; 源代码。QCustomPlot-source.tar.gz 源代码 里面包含了很多QCusto…

夜晚兼职好选择:六大副业助你增收

晚上兼职&#xff0c;无疑是许多寻求额外收入人群的理想选择。以下为您精心推荐的六个副业&#xff0c;既适合晚间操作&#xff0c;又能让您在轻松愉悦中赚取额外收益。 网络调查与市场研究&#xff1a;利用晚上的闲暇时光&#xff0c;参与网络调查与市场研究&#xff0c;为企业…

TO-277肖特基二极管 散热效果好 型号齐全

市场对于肖特基二极管的需求非常旺盛&#xff0c;近日常有客户前来东沃电子咨询TO-277B 封装系列肖特基二极管选型、价格、交期、现货等方面的问题。东沃电子推出的TO-277B 封装系列肖特基产品&#xff0c;外形扁平&#xff0c;散热片外露设计&#xff0c;能够有效改善散热能力…

JAVA 100道题(25)

25.实现一个死锁示例&#xff0c;并解释如何避免死锁。 在Java中&#xff0c;死锁通常发生在两个或更多的线程无限期地等待一个资源&#xff0c;而该资源又被另一个线程持有&#xff0c;后者也在等待另一个线程释放资源。这形成了一个循环等待条件&#xff0c;导致所有涉及的线…

配置plsql链接Oracle数据库(新手)

配置plsql链接Oracle数据库 安装Oracle客户端 、安装plsql客户端并激活 配置tnsnames.ora文件&#xff08;路径D:\app\peter\Oracle\InstantClient\network\admin根据你的实际路径设置&#xff09; 配置文件如下 # tnsnames.ora Network Configuration File: D:\app\peter\O…