C++窗体程序设计(一)窗体类WNDCLASSEX 您所在的位置:网站首页 vb是在什么环境下的可视化应用程序 C++窗体程序设计(一)窗体类WNDCLASSEX

C++窗体程序设计(一)窗体类WNDCLASSEX

2023-11-12 01:09| 来源: 网络整理| 查看: 265

(本文使用VS2017) 在初步学习了c++之后,我们可以着手设计一个窗口类程序,但在这之前,我们得知道c++里面是怎么设计窗口的。 开始创建窗口之前,我们需要包含几个关键的头文件:

#include #include #include

当然,如果你和我一样,是这么创建的(如下图),那么VS2017会自动包含一个stdafx.h的预编译头文件,里面包含了很多我们可能要用到的头文件,也就不用再重复输入上面的头文件。创建窗体程序项目窗口

#include "stdafx.h"

另外通过VS2017创建的桌面应用程序,会自动包含一个窗口创建模板,该模板甚至能直接运行,非常有利于我们的学习。 在这里插入图片描述 我们先跳过长长的函数和变量名,直接跳到注册窗口类。 在这里插入图片描述 众所周知,窗口,就是打开我的电脑、任意文档、甚至浏览器所弹出的界面。这个界面是可以变化的(长宽、风格、名称等等)。 在c++中也一样,在创建了一个窗口后,你可以为该窗口配置属性。 c++自带了一个类 WNDCLASS( 一般用WNDCLASSEXW,EX表示增强版,W表示宽字符),用于创建窗口对象, WNDCLASSEXW中有很多类成员对象,用于配置窗口属性。

看函数MyRegisterClass内的语句: 看不懂的地方可以先跳过,照着写就行

WNDCLASSEXW wcex; //WNDCLASSEXW是窗口类,此句的意思是创建一个名为wcex的窗口对象,也就是我们要创建的窗口 wcex.cbSize = sizeof(WNDCLASSEX);//wcex窗口的大小,一般都用sizeof获取标准大小,我也不知道为啥 wcex.style = CS_HREDRAW | CS_VREDRAW;//窗口样式,详见下文 wcex.lpfnWndProc = WndProc; //窗口回调函数,用来记录你在窗口进行的操作,并返回操作导致的结果,后面再细讲。 wcex.cbClsExtra = 0; //窗口类的额外空间,单位:字节数。这地方和下面都比较难理解,这是正常的,不慌。 wcex.cbWndExtra = 0; //窗口实例的额外空间,单位:字节数。 wcex.hInstance = hInstance; //窗口实例句柄, wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT4)); //窗口图标句柄 wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);//鼠标光标句柄 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);//窗口背景颜色句柄,该句表示默认颜色(实际上也可以把+1换成+2/3改颜色) wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT4);//所用菜单名称,资源文件中有一个后缀rc的文件记录了菜单方案 wcex.lpszClassName = szWindowClass; //窗口类的名称 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));//窗口的小图标句柄

下面对一些重要的对象成员进行解释: ①style 窗口样式 CS_HREDRAW | CS_VREDRAW意味着当窗口宽度或高度发生变化时,窗口将根据窗口大小重新绘制。其中前缀CS表示class type,HREDRAW代表当宽度(H代表水平方向Horizontal)发生改变时进行重绘(Redraw),VREDRAW代表着当高度(V代表垂直方向Vertical)方向发生变化时进行重绘。 除此之外,style还可以设置其他的值,常见的值如下:

CS_BYTEALIGNCLIENT 窗口的客户区域以“字符边界”对齐,当系统调整窗口的水平位置时,客户区域的左边坐标是8的整数倍

CS_BYTEALIGNWINDOW 窗口以“字符边界”对齐,当系统调整窗口的水平位置时,客户区域的左边坐标是8的整数倍

CS_CLASSDC 分配一个设备环境并被类中的所有窗体共享。它是可以适用于一个应用程序的若干线程创建的一个相同类的窗体。当多个线程试图同时使用相同的设备环境时,系统只允许一个线程成功地进行绘图操作

CS_DBLCLKS 当用户双击窗口时,将向窗口函数发送鼠标双击消息

CS_GLOBALCLASS 指定此窗体类是一个应用程序全局类。应用程序全局类是由一个在进程中对所有模块有效的exe或dll注册的窗体类

CS_HREDRAW 如果窗口的位置或宽度发生改变,将重绘窗口

CS_NOCLOSE 窗口中的“关闭”按钮不可见

CS_OWNDC 为同一个窗口类中的每个窗口创建一个唯一的设备上下文

CS_PARENTDC 设置子窗口中剪下的矩形区域到父窗口中,以使子窗口可以在父窗口上绘图。指定该风格可以提高应用程序的性能

CS_SAVEBITS 把被窗口遮掩的屏幕图像作为位图保存起来。当该窗口被移动时,Windows操作系统使用被保存的位图来重建屏幕图像

CS_VREDRAW 如果窗口的位置或高度改变,将重绘窗口

②lpfnWndProc 窗口回调函数 这个函数用于处理用户对窗口的操作,此处可以右键WndProc转到定义,查看该函数的定义。 WndProc包含四个参数:hwnd是要处理窗口的句柄;message是消息ID,代表了不同的消息类型;wParam的值为按下按键的虚拟键码;lParam则存储按键的相关状态信息。 这个函数留到后面再讲。

③cbClsExtra/cbWndExtra 说实话,这个地方我也没太理解,但我找到一个人讲的比较好,看这个链接: https://blog.csdn.net/zlk1214/article/details/50736674

④hInstance 窗口实例句柄 句柄可以理解为一个编号,即窗口实例的编号。因为在实际应用中,我们会打开多个窗口,Windows为了区别不同的窗口,所以要给每个窗口设置一个不同的句柄。

⑤hIcon 窗口图标句柄 hIcon和hIconSm都是表示窗口图标的成员,不同的是,hIcon表示任务栏的图标,hIconSm表示小图标,如图所示: 在这里插入图片描述 那么如何更改图标呢? 首先我们需要一个后缀为ico的标准图标文件,我们可以在很多地方下载到。 比如https://www.easyicon.net/ 在这里插入图片描述 下载完之后得到一个ico文件,我们把它移动到你新建的项目中(如果不知道路径,可以在资源视图中看到) 在这里插入图片描述 如图所示,这样在资源视图icon目录下会多出一个个IDI_ICON1的文件(当然你也可以叫其他名字) 我们再切换到Resource.h头文件中,给我们导入的IDI_CON1一个编号: 在这里插入图片描述

这样我们就能在WNDCLASSEX对象中使用它了,使:

wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1));//注意到哪里替换了吗?

再运行就是我们想要的图标了: 在这里插入图片描述

⑥hCursor 光标句柄 改变鼠标光标的语句,目前我也不太会用,估计和改变图标差不多,先就默认吧。

⑦hbrBackground 背景颜色 (HBRUSH)(COLOR_WINDOW+1),表示windows默认的颜色,+1没有特别的含义,因为滚动条颜色宏被定义成 #define COLOR_SCROLLBAR 0如果不进行+1的话,使用这个颜色就是意外的变成NULL。 我们也可以使用CreateSolidBrush(RGB(255,100,100)),来调制颜色,RBG里面的数字自己调。 如图: 在这里插入图片描述 ⑧lpszMenuName 菜单名 wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT4); 我们可以在右侧的资源文件中看到菜单设计(IDC_WINDOWSPROJECT4) 在这里插入图片描述 更方便的自定义菜单方案还是在资源视图中,你一试便知。 在这里插入图片描述 ⑨lpszClassName 窗口类的名字 以上过程实际上只是在电脑中创建了一个对象,并未实际创建窗口,如果要把我们创建的窗口对象显示出来,需要用到CreateWindowW语句(你可以在后面的语句中找到它),当创建窗口时,就需要用到窗口类的名字。(这一段我纯属瞎扯,等我以后整明白了再改。)

至此,我们已经大致理清了窗体类WNDCLASSEX中各成员参数的含义,但还有更多的问题等待着我们搞明白,因此,未完待续……



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有