`

《Windows游戏编程大师技巧》三、Windows高级编程

 
阅读更多


Windows编程很绝的地方在于:你不用了解太多细节,就可以完成很多工作。

使用资源

资源就是你的程序代码结合在一起的多块数据,可以被程序本身在运行时加载。
资源应当也放在程序的.EXE文件中的原因是:

1.同时包含代码和数据的.EXE文件更容易发布。
2.外力不容易任意删改程序的数据文件(如.BMP和.WAV文件)。

对于想编译进程序中的数据类型没有限制,下列这些预定义的资源类型就可以
满足大部分需要:

图标 - 小的位图文件
光标 - 鼠标指针的位图
字符串 - 可以硬编码在代码中,也可以集中放在这
声音 - 大部分Windows程序都使用.WAV格式
位图 - 这是标准的位图,使用.BMP扩展名
对话框 - 也可以作为资源来存储
图元 - 一系列图像操作记录的回放



要添加资源文件,必须有一个以ASCII形式的资源描述文件.RC。编译过程如下:



下面是如何在.RC脚本文件中定义一个ICON资源:

windowicon ICON star.ico (使用字符串)
124 ICON ship.ico (使用数字)

使用字符串定义时会产生歧义,windowicon可能是个字符串也可能是个#define定义的符号常量。
所以还需要一个.H文件来解析符号索引。

RESOURCES.H的内容:

#define ID_ICON1 100
#define ID_ICON2 101
#define ID_ICON3 102

RESOURCES.RC的内容:

#include "RESOURCES.H"

ID_ICON1 ICON star.ico
ID_ICON2 ICON ball.ico
ID_ICON3 ICON cross.ico

现在,将RESOURCES.RC和.ICO文件添加到工程,并在程序中#include RESOURCES.H。
若使用字符串定义,则:winclass.hIcon = LoadIcon(hInstance, "icon_name");
若使用符号索引,则:winclass.hIcon =LoadIcon(hInstance, MAKEINTRESOURCE(ID_ICON1));
注意第一个参数不再是NULL而是hInstance。

其他资源也都是类似这样定义和使用的。
光标:LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));
字符串表:LoadString(hInst, IDS_STRING109, string3, 20);


GDI简介

应该了解GDI,以便知道如何在不使用DirectX的情况下如何在Windows环境绘制各种图形。
而理解WM_PAINT消息对于标准的GDI图形和Windows编程来讲是非常重要的,因为大部分
Windows程序的显示都围绕该消息。例外是游戏编程中DirectDraw或Direct3D负责图形绘制。

PAINTSTRUCT ps; // used in WM_PAINT
HDC hdc; // handle to a device context
case WM_PAINT:
{
// simply validate the window
hdc = BeginPaint(hwnd, &ps);
// do all your painting here
EndPaint(hwnd, &ps);
// return success
return (0);
}

参看下面图示,当一个窗口被移动、改变大小或被其他窗口“弄脏”时,该窗口的用户区的
部分或全部需要重画。这时,WM_PAINT消息就被发送了。



对BeginPaint()和EndPaint()函数的调用可以完成一系列任务。首先,它们使用户区有效;
其次,它们用该窗口创建时参照的Windows类中定义的背景刷来填充该窗口的背景。

你只能访问实际上需要刷新的该窗口用户区的一部分。无效矩阵区域的坐标都保存在
BeginPaint()函数返回值PAINTSTRUCT的rcPaint字段中。如果要访问整个用户区的话,
这就是一个问题。解决方法是通过GetDC()直接获得图形设备描述表。

但BeginPaint()-EndPaint()会向Windows发消息指示窗口有效,而GetDC()-ReleaseDC()不会,
所以WM_PAINT消息将一直不停地传递下去,因为必须使该窗口有效。因此在ReleaseDC()
后还要调用ValidateRect()。

PAINTSTRUCT ps;
HDC hdc;
RECT rect;
case WM_PAINT:
{
// simply validate the window
hdc = GetDC(hwnd);
// do all your painting here
ReleaseDC(hwnd, hdc);
// get client rectangle of window
GetClientRect(hwnd, &rect);
// validate window
ValidateRect(hwnd, &rect);
// return success
return(0);
}

注意GetClientRect是用来获取用户矩形区域的坐标。每个窗口都有两套坐标系:
Windows坐标系和用户坐标系。区别见下图:



你很可能会说:“非得这么麻烦吗”是的,非得如此,因为这是Windows。哈哈!
本书的大多数例程里,将在WM_PAINT消息以外的地方使用GetDC()-ReleaseDC(),
BeginPaint()-EndPaint()只用于WM_PAINT消息句柄中。


基本文本显示

Windows有最复杂且最强悍的文本渲染系统。当实际运用在实时游戏中时,用GDI文本
引擎输出文本就显得太慢了,还是要亲手设计基于DirectX的文本引擎。但先了解下有助于
调试和输出。

输出文本有两个常用函数:TextOut()和DrawText()。TextOut()是一个寒酸的文本输出函数,
而DrawText()则像凌志汽车一样豪华。我经常使用TextOut()因为它运行比较快。

case WM_PAINT:{
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;

char buffer[50];
static int counter = 0;
sprintf(buffer, "WM_PAINT called %d times ", ++counter);
TextOut(hdc, rect.left, rect.top, buffer, strlen(buffer));

DrawText (hdc, TEXT (“Hello text”), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;

EndPaint (hwnd, &ps) ;
return 0 ;
}

==========================================================

2012年4月22日 更新

补充学习处理重要事件:Window操作、键盘操作、鼠标操作。

1.Window操作

WM_CLOSE消息在WM_DESTROY和WM_QUIT之后发送,它表示用户正试图关闭窗口。
如果在WinProc()里仅return (0),那么用户不能关闭窗口。WM_SIZE消息对于窗口游戏
非常重要,当窗口尺寸改变时,必须调整图像显示来适应。


2.键盘操作

在Windows环境下,可以以多种方式访问键盘消息:
2.1 通过WM_CHAR消息:保存产生的ASCII码,如'a'或'A',字处理程序要关心这个。
2.2 通过WM_KEYDOWN/UP消息:保存产生的扫描码,即键盘上每一个按键的编码,
如ESC键VK_ESCAPE。游戏只需关心WASD移动,F开火而不必关心产生的是大写字符
还是小写字符,所以不必关心WM_CHAR消息。
2.3 通过调用GetAsyncKeyState():在状态表中跟踪该键的最后已知状态,使用它的
妙处是它与事件循环没有耦合,可以在任何地方测试按键。


3.鼠标操作

鼠标移动事件WM_MOUSEMOVE。lParam保存鼠标位置,wParam保存按键状态。

case WM_MOUSEMOVE:
{
int mouse_x = (int) LOWORD(lParam);
int mouse_y = (int) LOWORD(lParam);
int buttons = (int) wParam;
if (buttons & MK_LBUTTON)
...
if (buttons & MK_RBUTTON)
...
} break;

鼠标只是移动没有按键产生的事件。

case WM_LBUTTONDBLCLK:
{
int mouse_x = (int) LOWORD(lParam);
int mouse_y = (int) LOWORD(lParam);
...
// tell windows you handled it
return (0);
} break;


4.自行发送消息

自行传递消息有两种方法:
SendMessage()向窗口传递一个要求立即处理的消息。
PostMessage()将消息发往窗口的消息队列。

为什么要自行发送消息?因为Window的设计者希望你这样做,这也是窗口环境下的工作原理。
下一章中学习按键控件时将会看到,发送消息是和控件窗口交流的唯一途径!

分享到:
评论

相关推荐

    Windows游戏编程大师技巧(第二版)完整版光盘文件04

    《Windows游戏编程大师技巧(第二版)》是一本深度探讨Windows平台上游戏开发的权威书籍,其完整版光盘文件包含了丰富的资源,旨在辅助读者更好地理解和实践书中的理论知识。光盘内容共分为九个主要部分,分别是:...

    Windows游戏编程大师技巧(第二版) 源码

    《Windows游戏编程大师技巧(第二版) 源码》是一个专为Windows平台游戏开发人员设计的资源,其中包含了丰富的代码示例和实践项目,帮助读者深入理解游戏开发的各个环节。这个压缩包很可能是书籍配套的实践教程,通过...

    Windows游戏编程大师技巧第二版.pdf

    ### Windows游戏编程大师技巧第二版 #### 一、Windows平台游戏开发概述 1. **Windows平台特点**: - Windows作为全球最流行的操作系统之一,拥有庞大的用户基础。 - 其API(应用程序编程接口)丰富多样,为...

    windows游戏编程大师技巧源码

    《Windows游戏编程大师技巧》是一本经典的游戏开发书籍,它主要涵盖了使用DirectX技术进行游戏编程的各个方面。这本书深入浅出地介绍了如何在Windows平台上构建高性能、交互性强的游戏应用程序。对于那些想要进入...

    Windows游戏编程大师技巧.pdf

    根据提供的文件信息,“Windows游戏编程大师技巧.pdf”是一本经典的中文版游戏编程入门书籍,主要聚焦于游戏开发的基础知识及高级技巧。以下是对该书可能包含的一些重要知识点的概述: ### 一、游戏编程基础 #### ...

    《Windows游戏编程大师技巧》源码

    《Windows游戏编程大师技巧》是一本深受欢迎的书籍,它为读者揭示了Windows平台上游戏开发的奥秘。这本书的核心在于其丰富的源码示例,这些示例覆盖了从基础到高级的各种游戏编程技术。源码是学习编程最直观的方式,...

    Windows游戏编程大师技巧——2D和3D游戏编程基础.zip

    通过阅读"Windows游戏编程大师技巧.chm"这本书,你将得到详尽的指导,从基础知识到高级技巧,逐步提升你的编程能力。而"CGPAD.COM - 分享CG的技术和乐趣.url"则可能链接到一个社区或资源网站,提供更多的学习资料和...

    Windows游戏编程大师技巧(第二版)源码

    《Windows游戏编程大师技巧(第二版)》是一本深度探讨Windows平台上游戏开发的权威书籍,其源码提供了丰富的实例和实践教程,对于想要深入学习Windows游戏编程的开发者来说,是宝贵的资源。源码包含了作者精心设计和...

    windows游戏编程大师技巧chapter2(含编译常见问题解决说明)

    "Windows游戏编程大师技巧Chapter2"聚焦于提升开发者的技术水平,特别是针对编译过程中遇到的问题提供了详细的解决策略。本章内容涵盖了一系列核心概念和技术,旨在帮助程序员克服在游戏开发过程中可能遇到的挑战。 ...

    Windows游戏编程大师技巧(第二版)

    《Windows游戏编程大师技巧(第二版)》是André LaMothe所著的一本经典游戏编程书籍,旨在帮助读者深入理解和掌握在Windows平台上进行游戏开发的技术与策略。这本书全面覆盖了从基础知识到高级技巧的各个层面,对于...

    Windows游戏编程大师技巧, 2D和3D游戏编程基础教程。

    本教程将深入探讨2D和3D游戏编程的基础,帮助初学者建立起坚实的技术基础,同时也为经验丰富的开发者提供一些实用的技巧和最佳实践。 一、Windows游戏开发环境搭建 1. 安装开发工具:Visual Studio是常见的Windows...

    Windows游戏编程大师技巧源码

    《Windows游戏编程大师技巧源码》是一份宝贵的资源,它为初学者和有经验的开发者提供了从零开始构建DirectX游戏及游戏引擎的详细步骤。这份资料通过一系列章节的源代码,逐步引领读者深入理解游戏开发的核心技术。...

    WINDOWS游戏编程大师技巧中文版(第二版).rar

    《WINDOWS游戏编程大师技巧中文版(第二版)》是一本专为中文读者设计的游戏编程教程,旨在帮助初学者和进阶者深入理解Windows平台上的游戏开发技术。这本书以清晰易懂的方式介绍了游戏编程的核心概念、技术和实践方法...

    windows游戏编程大师技巧

    《Windows游戏编程大师技巧》是一本深入探讨在Windows平台上进行游戏开发的专业书籍,它涵盖了从基础知识到高级技术的广泛内容。CHM版本是该书的电子版,方便读者在电脑上阅读和查阅。同时,附带的代码源文件进一步...

    Windows游戏编程大师技巧

    总的来说,通过阅读《Windows游戏编程大师技巧》,读者不仅能学习到Windows平台的游戏开发基础,还能掌握一系列高级技术,从而有能力创建出引人入胜、富有互动性的游戏作品。无论是对于个人兴趣还是职业发展,这本书...

    WINDOWS游戏编程大师技巧

    "WINDOWS游戏编程大师技巧"这一主题涵盖了从基础到高级的各种知识点,旨在帮助程序员提升在Windows平台上的游戏开发技能。 首先,Windows游戏编程的基础是理解操作系统与游戏引擎的交互。Windows API(应用程序接口...

    window 游戏编程大师技巧 前三章源码

    "Window 游戏编程大师技巧 前三章源码"显然是一份涵盖了基础到进阶的游戏开发资源,通过阅读和分析这些源码,我们可以深入理解游戏编程的核心概念。以下是基于这个主题的详细知识点讲解: 1. **Windows编程基础**:...

Global site tag (gtag.js) - Google Analytics