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

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

#include <windows.h>
#include <stdlib.h>
#include <tchar.h>

当然,如果你和我一样,是这么创建的(如下图),那么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中各成员参数的含义,但还有更多的问题等待着我们搞明白,因此,未完待续……

  • 8
    点赞
  • 1
    评论
  • 46
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

张宗望

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者