工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 技术跟踪 > 技术理论 > 正文
游戏开发新手入门之跟踪窗口和使用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  下一页

  ☆ 绘制象素

  终于到了本章的戏肉儿!只要你取得了显示设备上下文的句柄,就可以用GDI绘制象素了。记住,要调用GetDC()取得句柄。绘制单个的象素,不出意外的话,你就用SetPixel()函数:

COLORREF SetPixel(
HDC hdc, // handle to device context
int X, // x-coordinate of pixel
int Y, // y-coordinate of pixel
COLORREF crColor // pixel color
);

  返回类型COLORREF是我们没有讲过的。它不是一个结构,但是在表格0x00bbggrr里是一个32位的值。Bb是蓝色成分的8位值,gg是绿色,rr是红色。高字节00没有用,总是00。让我们看看函数里面的参数:

  ※ HDC hdc:你将要GetDC()得到的DC句柄。(DC就是设备上下文)你只能调用GetDC()一次,然后其它的函数也可以用这个DC句柄了。你每次绘制单个象素不用再取得新的DC句柄了。

  ※ int X,Y:是象素的x和y坐标。是在客户区的坐标,(0,0)即是窗口客户区左上角的坐标,不是屏幕左上角的坐标。

  ※ COLORREF crColor:象素的颜色。设置象素的颜色,用RGB()宏最简单。RGB()括号中的三个值分别是红色、绿色和蓝色,各个颜色的值可从0-255间取,不同的值组合成不同的颜色。

  如果函数调用成功,将返回一个颜色,就是你要绘制的象素的颜色。由于视频硬件的限制,返回的颜色可能与调用函数时要求的颜色并不一致。如果调用失败,返回-1。如果你要设置窗口客户区的左上角为红色,函数将是这样:

SetPixel(hdc, 0, 0, RGB(255,0, 0));

  是在假设你已经取得了DC句柄hdc后,调用这个函数。很简单,是不是?这个函数的更快的版本是SetPixelV():

BOOL SetPixelV(
HDC hdc, // handle to device context
int X, // x-coordinate of pixel
int Y, // y-coordinate of pixel
COLORREF crColor // new pixel color
);

  参数相同,但返回类型不同。SetPixelV()返回的是布尔类型,成功,TRUE;失败,FALSE。如果你没有必要使用SetPixel()提供的额外信息,那我们当然是选择使用SetPixelV()了。(我们总是希望快一些)
还有一件事情,我们需要得到绘制好的象素的值(颜色)。没问题,使用GetPixel()函数就解决了:

COLORREF GetPixel(
HDC hdc, // handle to device context
int XPos, // x-coordinate of pixel
int nYPos // y-coordinate of pixel
);

  很明显,返回值是象素所在位置的颜色。如果坐标出了DC句柄控制的区域,返回值是CLR_INVALID。参数同SetPixel()差不多:DC句柄,象素的x,y坐标。绘制象素就说到这吧,下面看看GDI的文本输出。

  ☆ GDI的文本输出函数

  有两个关于绘制文本的函数,其中简单一点儿的是TextOut()函数,原形是:

BOOL TextOut(
HDC hdc, // handle to device context
int nXStart, // x-coordinate of starting position
int nYStart, // y-coordinate of starting position
LPCTSTR lpString, // pointer to string
int cbString // number of characters in string
);

  我们已经看过很多返回类型是布尔类型的函数了,意思都一样:成功TRUE,失败FALSE。函数的参数如下:

  ※ HDC hdc:DC句柄。它既可以使GetDC的返回值,也可以是在处理WM_PAINT消息时BeginPaint的返回值。

  ※ int nXStart,nYStart:定义客户区内字符串开始的位置。字符串中第一个字符的左上角位于坐标(xXStart,nYStart)。在默认DC中,客户区的左上角为(0,0)。

  ※ LPCTSTR lpString:要显示的字符串。由于下一个参数给出字符串的长度,所有字符串不需要空的中止符。

  ※ int cbString:串中字符的个数。(字符串的长度)

  TextOut()函数使用当前的文本颜色,背景颜色和背景类型。你若想自己改变这些,就得用如下的函数:

COLORREF SetTextColor(
HDC hdc, // handle to device context
COLORREF crColor // text color
);

COLORREF SetBkColor(
HDC hdc, // handle of device context
COLORREF crColor // background color value
);

  SetTextColor()函数设置当前文本颜色,SetBkColor()函数设置当前背景颜色。参数的解释是显而易见的。第一个是DC句柄。第二个是颜色,你当然记得可以用RGB()宏来设置颜色。例如设置文本为蓝色:SetTextColor(hdc,RGB(0,0,255))。设置背景为白色:SetBkColor(hdc,RGB(255,255,255))。最后,设置背景类型用SetBkMode()函数:

int SetBkMode(
HDC hdc, // handle of device context
int iBkMode // flag specifying background mode
);

  第一个参数就不讲了。第二个参数iBkMode可以分别取两个值:TRANSPARENT或OPAQUE。如果取TRANSPARENT,文本不会对背景造成影响。如选择OPAQUE,则相反。函数的返回值是背景的模式。

  关于TextOut()函数还有一点要说,你可以控制文本的排列方式,用SetTextAlign()实现:

UINT SetTextAlign(
HDC hdc, // handle to device context
UINT fMode // text-alignment flag
);

  参数如下:

  ※ HDC hdc:DC句柄。没有什么特别的。

  ※ UINT fMode:一个标志或一组标志(用“|”分开)将决定TextOut()输出文本的对齐模式。你不可以随便组合,要合理组合。这些标志如下:

  ◎ TA_BASELINE:参考点将在文本的基线。

  ◎ TA_BOTTOM:参考点将在矩形范围的底边。

  ◎ TA_TOP:参考点将在矩形范围的顶部。

  ◎ TA_CENTER:参考点将在矩形范围的中心。

  ◎ TA_LEFT:参考点将在矩形范围的左边。

  ◎ TA_RIGHT:参考点将在矩形范围的右边。

  ◎ TA_NOUPDATECP:当前的位置没有被文本输出函数调用,参考点被每次调用传递。

  ◎ TA_UPDATECP:当前的位置被每次文本函数输出调用,当前的位置作为参考点。

  默认的设置是TA_LEFT|TA_TOP|TA_NOUPDATECP。如果你设置成TA_UPDATECP,后来调用的TextOut()函数将忽略nXStart和nYStart这两个参数,把文本放置在……。OK,告一段落,我们来看看TextOut()函数的兄弟DrawText():

int DrawText(
HDC hDC, // handle to device context
LPCTSTR lpString, // pointer to string to draw
int nCount, // string length, in characters
LPRECT lpRect, // pointer to struct with formatting dimensions
UINT uFormat // text-drawing flags
);

  这个家伙有点儿复杂。DrawText()函数能格式化文本,多种排列方式。返回值是文本象素的高度。返回0,说明调用失败。让我们看看它的参数:

  ※ HDC hDC:一样的东东。我们的好朋友DC句柄。

  ※ LPCTSTR lpString:要显示的字符串。用双引号引起来。

  ※ int nCount:字符串中字符的数量。(字符串长度)

  ※ LPRECT lpRect:是RECT类型结构的地址,该结构包含了将要显示字符串的区域的逻辑坐标。

  ※ UINT uFormat:文本格式选项,你可以用“|”符号组合。下面列出最常用到的标志:

  ◎ DT_BOTTOM:指定底部对齐文本。必须与DT_SINGLELINE组合使用。

  ◎ DT_CALCRECT:返回矩形的宽度和高度。在多文本行的情况下,DrawText()将使用lpRect所指向的矩形的宽度,并扩展矩形的底部直到包含文本的最后一行。在单文本行的情况中,DrawText()将改变矩形的右边界,使它包含最后一个字符。不管在那种情况下,DrawText()都返回格式化后的文本高度,但是不重新绘制文本。

  ◎ DT_CENTER:文本水平居中。

  ◎ DT_EXPANDATABS:扩充Tab键跳跃的字符数,默认情况下,每按一次Tab键跳跃8个字符。

  ◎ DT_LEFT:指定文本左对齐。

  ◎ DT_NOCLIP:绘制屏幕时无需剪切。当使用DT_NOCLIP后,程序性能提高。

  ◎ DT_RIGHT:指定文本右对齐。

  ◎ DT_SINGLELINE:指定单行文本,忽略回车和换行。

  ◎ DT_TABSTOP:设置Tab键停止。在uFormat的低端字的高阶字节(15-8)中存放Tab键每按一次跳跃的字符数。默认是8。

  ◎ DT_TOP:顶部对齐文本(仅用于单行文本)。

  ◎ DT_VCENTER:指定垂直居中(仅对单行文本)。

  还有一些其它的标志,但你看到的已经足够了。有了这些,你就可以轻松驾驭文本了,但记住,是以牺牲函数速度为代价的。你可以选择比较常用的TextOut()函数。文本输出就说道这吧,让我们去学点儿令人兴奋的东东吧!


上一页  1 2 3 4  下一页

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

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

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