送给初学者的礼物:C++游戏编程起源连载三

送给初学者的礼物:C++游戏编程起源连载三,第1张

送给初学者的礼物:C++游戏编程起源连载三,第2张

第3章:跟踪你的窗口和使用GDI

简介

如果你读过前两个连载,这次我们将学习WINDOWS GDI(图形设备接口)和其他相关的东西,比如响应用户输入和处理WINDOWS生成的一些消息。至于显示图形,我们将涉及三个主题:文本显示、绘制像素和显示位图。我们先来研究几个Windows消息的细节。重复一遍:你需要C语言的基础知识。你已经读过最后两章了。由于本章将使您能够制作一个特定的图形演示,因此本章后面附有一个源代码例程。是用Visual C++编写和编译的。在系列一中,我们创建并注册了一个窗口类,用一行定义了窗口的样式(功能)。看起来是这样的:

sample class . style =
CS _ dbl clks | CS _ own DC | CS _ HREDRAW | CS _ VREDRAW;
//标准设置

这些属性中有三个非常笼统,但是这个——CS _ own DC,需要解释一下。设备上下文是一种结构,表示一组图形对象和属性,以及输出设备的一些设置和属性。使用设备上下文允许您直接操作图形,而无需考虑底层细节。Windows GDI是一个图形翻译系统,它是应用程序和图形硬件之间的一层。GDI可以导出到任何兼容的设备,但最常用的设备是视频监视器、图形硬拷贝设备(如打印机或绘图仪)或内存中的原始文本。GDI函数可以画直线、曲线、封闭图形和文本。所有访问GDI的Windows函数都需要一个设备上下文句柄作为参数。这很容易做到。如果你想得到一个窗口的设备上下文句柄,你可以使用这个函数:

HDC GetDC(
HWND hWnd //一个窗口的句柄
);

很简单,你所要做的就是把要操作的窗口的句柄传递给它,然后返回一个设备上下文句柄。如果传递NULL,将返回整个屏幕的设备上下文(DC)句柄。如果函数调用失败,将返回NULL。

处理图形的DC称为显示DC,处理打印的称为打印DC。处理位图数据的称为内存DC,还有其他设备DC。有点复杂,没关系。这就是Windows,主要作用就是迷惑群众。一旦我们接触到一些代码,就不会很难了。

当你用完DC的时候,一定要释放它,也就是它占用的内存空。这个思路应该贯穿于以后的编程中,占用内存,不用的时候需要释放。记住!释放DC是一个非常简单的功能:

int ReleaseDC(
HWND hWnd,//窗口句柄
HDC hDC //设备上下文句柄
);

如果释放成功,返回值为1;否则为0。参数有评论,我还是说:

Hwndwnd:要控制的窗口的句柄。※.如果你开始传递NULL,你现在必须传递NULL。

hdc hdc:DC手柄。※.

在使用DC和GDI进行图形显示之前,让我们看看创建窗口实例时的几个重要信息。我要提到的四个消息是:WM_MOVE,WM_SIZE,WM_ACTIVATE,WM_PAINT。

跟踪窗口状态

前两个非常简单。当用户移动窗口时,将发送WM_MOVE消息,窗口新位置的坐标将存储在lparam中。(记住,消息在lparam和wparam中有进一步的描述,它们是消息控制函数的参数。)lparam的低端字存储的是窗口客户区左上角的坐标X,高端字存储的是坐标y,当窗口大小发生变化时,会发送WM_SIZE消息。类似于WM_MOVE消息,lparam的低端字存储的是客户端区域的宽度,高端字存储的是高度。与WM_MOVE不同,wparam参数还控制一些重要的事情。它可以是下列任何值:

Size _ maxhide:其他窗口已经融化。※.

Size _ maximized:此窗口已被更改。※.

Size _ maxshow:其他窗口已恢复。※.

Size _ minimized:这个窗口已经最小化了。※.

Size _ restored:窗口已经调整了大小,但是既没有缩小也没有最小化。※.

当我编写窗口实例时,我通常喜欢将窗口的当前位置和大小保存在几个全局变量中。假设我们将这些全局变量命名为xPos、yPos、xSize和ySize,您像这样控制WM_SIZE和WM_MOVE消息:

if(msg = = WM _ SIZE)
{
xSize = LOWORD(lparam);
ySize = hi word(lparam);
}
if(msg = = WM _ MOVE)
{
xPos = LOWORD(lparam);
yPos = hi word(lparam);
}

现在是WM_ACTIVATE消息。它告诉你一个新的窗口被激活。这是非常有用的,因为如果有一个优先级应用,你不可能处理程序中的所有逻辑。有时候,比如写一个全屏的DIRECTX程序,忽略WM_ACTIVATE消息会导致你的程序出现致命错误。也许它做了你不想让它做的事。在任何情况下,等待WM_ACTIVATE消息采取行动都是一个好主意。

当一个窗口被激活或停用时,WM_ACTIVATE消息将被发送出去。我们通过检测wparam的低端字就可以知道是激活还是取消。这将有三个可能的值:

窗口被鼠标激活。※.

窗口被别的东西激活了。※.(键盘,函数调用等。)

Wa _ inactive:窗口被停用。※.

为了处理这个消息,我保留了另一个全局变量bFocus,当接收到WM_ACTIVATE消息时,它的值会改变。例子如下:

if(msg = = WM _ ACTIVATE)
{
if(LOWORD(wparam)= = WA _ INACTIVE)
focus = FALSE;
else
focus = TRUE;
//告诉Windows我们处理了
return(0);
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 送给初学者的礼物:C++游戏编程起源连载三

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情