第3章,[标签 Win32] :窗口类06,实例句柄与图标光标
专栏导航
上一篇:第3章,[标签 Win32] :认识句柄
回到目录
下一篇:无
本节前言
对于本节所讲解的知识,有可能,你会需要时不时地参考本专栏之前的文章。真的遇到了需要参考之前的文章的知识点,请你自行查阅。
我呢,也会提到一部分的参考课节。但是呢,你不应该依赖于我的主动提及。最好呢,你自己能够多去了解和查看本专栏目录。
学习本节所讲的知识,需要你事先了解过本章的完整代码。完整的代码,请参考下述文章链接。
参考课节:第3章,[标签 Win32] :本章程序代码
在之前,我们有讲过窗口类的基本情况。
为了便于学习,我们还是再次贴出窗口类的各个成员变量,如下所示。
typedef struct {UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR lpszClassName;
} WNDCLASS, * PWNDCLASS;
本节,我们的任务,是要在窗口类中,设置 hInstance,hIcon,和 hCursor 字段。
我们开始。
一. hInstance 字段
hInstance 字段,它是实例句柄的意思。实例,是指应用程序的实例。
我们可以多启动几个记事本程序,如图所示。

图1 中,我启动了三个记事本程序,每一个记事本程序,其实都是记事本程序的一个实例。每一个记事本程序的实例,都对应着桌面上的一个记事本程序窗口。
在之前的课节中,我讲了一点关于句柄的知识。
实例句柄,就是对应用程序实例的一种引用。
本节呢,我们需要给窗口中的 hInstance 字段设置一个值。这个值,我们将其设置为 WinMain 函数里面,参数列表中的第 1 个参数,hInstance 。
WinMain 函数中的 hInstance 参数如下图所示。

设置代码,如下图所示。

关于应用程序的实例句柄,我们在之前有讲解过,请大家参考下述文章链接,来学习。
参考课节:第1章 :第一个 WIn32 程序,程序入口
在上述文章链接的八.(一)分节中,有讲到实例句柄的问题。
二. hIcon 字段
hIcon 字段,是图标句柄。
图标,是一个小图片,一个位图格式的小图片。
我们在下面的截图中,来看一看图标的示例。

图4 里面,我在红色框线位置处展示了三个桌面图标。它们分别是回收站图标,unity 游戏引擎软件图标,搜狗高速浏览器图标。这三个呢,都是应用程序的桌面图标。
图标呢,不但是可以显示在桌面上,供我们启动程序,还可以在我们启动了程序以后,显示在桌面底部的任务栏上。我们来看一看。

在图5 里面,我展示了我的电脑在此时写作时候的情况,红色框线位置,分别是搜狗高速浏览器的任务栏图标和 Visual Studio 2019 的任务栏图标。
图标呢,除了可以显示在桌面和任务栏之外,一般地,当我启动了一个软件以后,它也会显示在应用程序的左上角。比如下面我展示的 Visual Studio 2019 软件左上角的图标。

看到了没? VS2019 左上角的那个图标,和任务栏的 VS2019 的图标一样。
一个程序的图标,一般的呢,就显示在三个位置上,分别是桌面,任务栏和程序的左上角。
图标的一个作用,就是向用户表示该程序。
当程序在运行时,图标会显示在任务栏上和程序窗口的标题栏左侧。
在本专栏的后面,我们会讲解,如何来创建一个自定义图标。
而现在呢,我们不想对图标的知识详细讲解,只想了解一下图标字段。所以呢,在本章代码中,我们采用的图标,是一个系统预定义的图标。
为了获取图标的句柄,我们需要调用函数 LoadIcon 。
LoadIcon 函数的声明代码如下。
此时,如果想要获取的图标句柄,它是系统预定义图标的句柄,那么,我们需要将 LoadIcon 函数的第一个参数设定为 NULL 。如果想要获取的图标句柄,它是程序员自定义的图标,并且是从保存在磁盘中的应用程序的可执行文件中加载这个图标时,那么,我们就必须要将第一个参数设置为 WinMain 函数的第一个参数,hInstance 。
由于本章程序代码采用了系统预定义图标,所以呢,第一个参数,我们用的是 NULL 。
LoadIcon 函数的第二个参数用于标识该图标。对于预定义图标来说,该参数是一个前缀为 IDI 的标识符。前缀 IDI 表示“图标的标识符”(ID for an icon),这些标识符都在 WinUser.h 头文件中定义。
我们来看一看本章程序代码对 hIcon 字段的设置代码。

在本专栏里面,以及在佩措尔德先生的教材里面,很多的程序,采用的图标,都是 IDI_APPLICATION 标识符所引用的图标,与图7 中的设置情况一样。这个小图标,基本上是一个练习程序的时候,所使用的一种图标。我们来看一看这个图标。

如图8 所示,它就长这样。
实际的程序,流行的商业程序里,基本上不会使用这样的图标。但是呢,如果你自己编写一个程序,为了省事的话,用这个图标,倒是也行。
LoadIcon 函数,返回图标的句柄。句柄的实际取值,我们并不关心,我们只是用它来设定窗口类变量 wndclass 的 hIcon 字段。
三. hCursor 字段
讲完了 hIcon 字段以后,我们来讲解 hCursor 字段。
hCursor 字段,表示鼠标光标句柄。
鼠标光标,就是鼠标的指针。在不同的情况下,我们知道,鼠标的指针会显示为不同的形状。
鼠标指针的形状,是可以通过应用程序来进行设置的。
我们来看一看本章程序代码中对鼠标光标进行设置的部分。

这个代码,其实与设置图标的代码差不多。换了个函数名,换了第二个参数。
加载图标的时候,采用的标识符,是以 IDI 为前缀的标识符。而在加载鼠标光标的时候,它是以 IDC 为前缀的大写字母标识符。
本章程序代码中的 LoadCursor 函数,为程序加载了一个系统预定义的鼠标指针(IDC_ARROW),并返回指针的句柄,这个句柄被用来设置窗口类变量 wndclass 的 hCursor 字段。当鼠标指针出现在这类窗口的客户区时,将呈现为一个小箭头的形状。
这个小箭头的形状,其实就是我们经常见到的鼠标指针的形状。
结束语
本节的内容不难,我们讲了窗口类的三个字段,实例句柄字段,图标字段,光标字段。
窗口类的字段,其实我们也快要讲完了。
大家学习愉快啊。
本节结束。
专栏导航
上一篇:第3章,[标签 Win32] :认识句柄
回到目录
下一篇:无