工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 技术跟踪 > 技术理论 > 正文
游戏开发新手入门之跟踪窗口和使用GDI
[文章信息]
作者:ant3000
时间:2005-03-03
出处:编程论坛
责任编辑:方舟
[文章导读]
这次我们将学习WINDOWS GDI和其它一些相关的东西,象响应用户输入和处理Windows产生的一些消息
advertisement
专题教程宝典
【软件应用】
【办公软件】
【图形图像】
【网页制作】
【操作系统】
【网络安全】
【程序开发】
【日报周刊】
【多媒体教程】
· 天极软件应用多媒体教程
· 图解PS按比例自动批量裁剪照片
· Visual FoxPro9.0构建管理系统图解
· 体验面对面的网络视频通讯
· 对付网页恶意代码
· Word动画教程:表格操作全接触
· JBuilder 2005开发Applet游戏全接触
· WinRAR操作技巧与另类应用
· 用VMware 5实现多系统同时运行
· 轻松玩转Excel数据图表
[正文]

上一页  1 2 3 4  下一页

  ☆ WM_PAINT 消息

  WN_PAINT消息通知程序,全部或部分客户窗口需要重新绘制。当用户在最小化、重叠或调整客户窗口区域的时候,就会产生这条消息。重新绘制,你需要做两件事,首先是要用到WM_PAINT消息专用的一对函数,第一个是BeginPaint()函数,这是它的原形:

HDC BeginPaint(
HWND hwnd, // handle to window
LPPAINTSTRUCT lpPaint // pointer to structure for paint information
);

  在我告诉你返回值是什么之前,让我们先看看参数:

  ※ HWND hwnd:需要重绘的窗口的句柄。你应该已经对于这种参数比较熟悉了。

  ※ LPPAINTSTRUCT lpPaint:这是很重要的一个。是指向PAINTSTRUCT结构的指针,该结构包含所有的要被重绘区域的信息。

  继续之前,我应该给你看看PAINTSTRUCT结构:

typedef struct tagPAINTSTRUCT { // ps
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT;

  结构内的成员如下:

  ※ HDC hdc:哈哈,有理由复习一下设备上下文(DC,有的书中叫“设备描述表”)了。这是要被刷新区域的句柄。

  ※ BOOL fErase:指明应用程序是否应该抹去背景。如果是FALSE,说明系统已经删除了背景。还记得在Windows类中我们曾经用黑色画刷定义了一个背景吗?这就意味着系统将用这个画刷抹去无效的区域。

  ※ RECT rcPaint:这是最重要的一个成员。它将告诉你需要被重绘的无效区域的矩形。我将稍后告诉你RECT结构。

  ※ BOOL fRestore,BOOL fIncUpdate,BYTE rgbReserved[32]:好消息,这些是保留成员,为老Windows服务的,所有你我都不必管它们。

  现在我已经给你看了这么多,这就是BeginPaint()函数的全部。它做了三件事儿。首先,它使窗口再次有效,直到下一次被改变,WM_PAINT消息发出前,这个窗口都是有效的。第二,如果在窗口类(Windows class)里定义了背景画刷,就像我们做过的那样,就用这个画刷重绘无效的区域。(所谓无效,就是被改变的)第三,返回了被重绘区域的DC句柄。重绘的区域,是由RECT结构定义的:

typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;

  我们已经指出这个结构描绘了一个矩形,但是有一件事情需要说说。RECT包含左上角,但不包含右下角。什么意思呢?让我们先定义一个RECT对象:

RECT myRect = {0, 0, 5, 5};

  这个RECT包含象素(0,0),但是没有达到(5,5),所以矩形的右下角实际是(4,4)。看起来没有什么意义,但是你得习惯它。
现在,还记得我所说的关于使用DC的事儿吗?一旦你用完了,你就必须释放它。OK,你记起来了,用EndPaint()函数释放。回应WM_PAINT消息,每次调用完BeginPaint()函数,必须匹配一个EndPaint()函数释放DC。这是函数的原形:

BOOL EndPaint(
HWND hWnd, // handle to window
CONST PAINTSTRUCT *lpPaint // pointer to structure for paint data
);

  函数通过返回TRUE或FALSE分别表明成功还是失败。有两个简单的参数:

  ※ HWND hWnd:就是窗口的句柄。

  ※ CONST PAINSTRUCT *lpPaint:指向PAINTSTRUCT类型的结构变量地址。同BeginPaint()的第二个参数是一回事。不要被CONST迷惑了,它只是保证和确认函数没有改变结构的内容。

  你还可以通过调用ValidateRect()函数代替BeginPaint()函数使得窗口再次有效。但你得手工操作一切。可能我们真的什么时候就要用到它。所以给你它的原形:

BOOL ValidateRect(
HWND hWnd, // handle of window
CONST RECT *lpRect // address of validation rectangle coordinates
);

  通过返回TRUE或FALSE来确定函数调用成功还是失败。参数很简单:

  ※ HWND hWnd:烦不烦,我不说了。

  ※ CONST RECT *lpRect:是指向RECT结构是否有效的指针。如果你传递NULL,则整个客户区域都是有效的。

  现在把以上讲到的做个样子给你看吧,假设我们已经定义了一个全局的变量hMainWindow作为我们的窗口句柄。

if (msg == WM_PAINT)
{
PAINTSTRUCT ps; // declare a PAINTSTRUCT for use with this message
HDC hdc; // display device context for graphics calls

hdc = BeginPaint(hMainWindow, &ps); // validate the window

// your painting goes here!

EndPaint(hMainWindow, &ps); // release the DC

// tell Windows we took care of it
return(0);
}

  这段代码很简单,也没做什么令人兴奋的事儿!OK,如果你不想用窗口类里的默认画刷重绘窗口,你必须自己做一些事情,包括使用我们还没有讲的图形部分。永远不要害怕,我们过一会儿就讲。现在我们在讨论消息,还有一些事情我必须解释。

  ☆ 关闭你的应用程序

  有三个消息看起来差不多,都是处理关闭的事情的。它们是WM_DESTROY,WM_CLOSE,和WM_QUIT。它们的确很相似,但你需要知道它们之间的不同!一个窗口或者应用程序应该被关闭时发出WM_CLOSE消息,当接收到WM_CLOSE消息时,如果你愿意,向用户提出是否真的退出。你知道让用户作确认或有错误出现或有什么应该注意的事情发生的时候,往往弹出一个消息框。消息框的制作是很容易的,由于它用途广泛,我们还是介绍一下:

int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);

  这些参数,尤其是最后一个,需要一些解释:

  ※ HWND hWnd:过一会儿我将向你介绍一个不含有它的函数,我保证。

  ※ LPCTSTR lpText:这是将要显示在消息框里的文本。你可以用\n等调整一下格式。

  ※ LPCCTSTR lpCaption:这是显示在消息框标题栏里的文本。

  ※ UINT uType:这个参数可以联合使用几个不同的标记。这些标记可以根据你的目的选择,有好多MB_打头的标记供你选择,联合使用时要用“|”分隔开。下面列出了一些常用的:

  ……按钮类

  ◎ MB_ABORTRETRYIGNORE:建立有“Abort”、“Retry”、“Ignore”按钮的消息框。

  ◎ MB_OK:建立有“OK”按钮的消息框。

  ◎ MB_OKCANCEL:建立有“OK”和“Cancel”按钮的消息框。

  ◎ MB_RETRYCANCEL:建立有“Retry”、和“Cancel”按钮的消息框。

  ◎ MB_YESNO:建立有“Yes”和“NO”按钮的消息框。

  ◎ MB_YESNOCANCEL:建立有“Yes”、“No”和“Cancel”按钮的消息框。

  ……图标类

  ◎ MB_ICONEXCLAMATION:加个惊叹号图标。

  ◎ MB_ICONINFORMATION:加个消息图标。

  ◎ MB_ICONQUESTION:加个问号图标

  ◎ MB_ICONSTOP:加个停止图标。

  ……默认按钮标志

  ◎ MB_DEFBUTTON1:设置第一个按钮为默认按钮。(默认按钮即消息框弹出后,直接敲回车就被按下的那个按钮)

  ◎ MB_DEFBUTTON2:第二个为默认按钮。

  ◎ MB_DEFBUTTON3:第三个为默认按钮。

  ◎ MB_DEFBUTTON4:第四个为默认按钮。

  ……其它的标志

  ◎ MB_HELP:添加一个帮助按钮。通常按下该按钮或者敲F1键都将产生WM_HELP消息。

  ◎ MB_RIGHT:文本右对齐。

  ◎ MB_TOPMOST:设置消息框总在窗口的最上面。

  我不知道你是怎么想的,但是我想Microsoft一定有一个程序员除了一件事,其它什么都不做,那就是全天写#define声明!^_^ 如果消息框建立失败,返回值为0,否则是下列任一个值:

  ◎ IDABORT:“Abort”按钮被选择。

  ◎ IDCANCEL:“Cancel”按钮被选择。

  ◎ IDIGNORE:“Ignore”按钮被选择。

  ◎ IDNO:“No”按钮被选择。

  ◎ IDOK:“OK”按钮被选择。

  ◎ IDRETRY:“Retry”按钮被选择。

  ◎ IDYES:“Yes”按钮被选择。

  以上说了这么多,我几乎都忘了我们原来的话题了。总之,当收到WM_CLOSE消息,你可以做两件事儿。一件是你接受默认的处理返回一个值,你若这样做了,应用程序或窗口按照计划关闭;再者,你返回0,应用程序或窗口将保持原样。以下是代码的基本部分:

if (msg == WM_CLOSE)
{
if (MessageBox(hMainWindow, "Are you sure want to quit?", "Notice", MB_YESNO | MB_ICONEXCLAMATION) == IDNO)
return(0);

// otherwise, let the default handler take care of it
}

  WM_DESTROY消息有点儿不同。它是窗口正在关闭时发出的。当得到WM_DESTROY消息的时候,窗口已经从视觉上被删除。一个主窗口被关闭,并不意味着应用程序结束了,它将在没有窗口的条件下继续运行。然而,当一个用户关闭了主窗口,也就意味着他要结束应用程序,所以如果你希望应用程序结束,在收到WM_DESTROY消息的时候,你必须发出一个WM_QUIT消息。你可以使用PostMessage()函数,但由于这是一个特殊的情况,就为它准备了一个特殊的函数:

VOID PostQuitMessage(int nExitCode);

  参数nExitCode是你的应用程序返回给Windows的一个退出代码(通常是0)。记住,WinMain()返回的是一个int(实数),不是void(空的)。nExitCode参数的值被赋值给wparam。WM_QUIT消息表示要关闭应用程序,所以得到这个消息后,你应跳出循环,把wparam返回给Windows。下面是一个简单的WinMain()函数实例:

int WinMain(HINSTANCE hinstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
// initialization stuff goes here

// main loop - infinite!
while (TRUE)
{
// check the message queue
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT) // exit main loop on WM_QUIT
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}

// main program logic goes here
}

// perform any shutdown functions here - releasing objects and such

return(msg.wparam); // return exit code to Windows
}

  对不起,罗罗嗦嗦讲了这么多,但这些都是你必须要了解的。继续你对我的耐心,让我们看看基础的GDI图形。


上一页  1 2 3 4  下一页

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 微软停止视窗XP网上激活 打击盗版重大改革
  • 周鸿祎否认辞职传言 不会介入盛大收购新浪
  • 日本丸红曲线进入京东方 1.6亿元购10%股权
  • 苏宁总裁中招被捕流言 股价昨下跌4.55%
  • 英特尔64位被指有价无市 国内厂商消极应对
  • AMD总裁称坚决支持WAPI 不会进军消费电子
  • 手机销售额首次超过彩电 换机高峰提前到来
  • 预测:影响未来IT安全性的五种攻击手段
  • Advertisement