工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 技术跟踪 > 技术理论 > 正文
游戏开发新手入门之Win32程序资源
[文章信息]
作者:ant3000
时间:2005-02-26
出处:编程论坛
责任编辑:方舟
[文章导读]
通过本章题目可能你已经猜出了本章论题,我将教会你在Windows程序中使用资源
advertisement
热点推荐
· VB中使用DDE技术为应用程序增辉
· Java新手留意:Java编程三十条规则
· 设计欣赏:《夜精灵》之守望
· CDSpace 虚拟的光盘空间
· 动画图解:Word斜线表头的制作
[正文]

1 2 3  下一页

  简介

  通过本章题目可能你已经猜出了本章论题,我将教会你在Windows程序中使用资源。简单的讲,资源即数据,它们通常是和程序的EXE文件相关联的,但是它们又是独一无二的。首先,资源在运行过程中不能被修改。它们实际上都是只读文件,而且程序代码不能够直接访问它们。另外,资源并不在程序的数据区内。在装入时,程序资源通常在某个磁盘文件中,直到程序需要它们时才被装入。使用资源是一件很容易的事情,并且它的妙处无穷。Windows为我们提供了大量的资源类型,但我们这里只学一些最常用,最容易的:图标(icon)、光标(cursor)、位图(bitmap)、菜单(menu)和字符串(string)。此后,我还将教你建立自己风格类型的资源,使你为所欲为。

  重复一下,要想看懂本章,你得有点C语言的基础。C++有时用一用,但不影响你学习本章内容。并且我假定你已经读过了上一章内容“Windows编程基础”。我还是用Microsoft Visual C++的编译器,怎么样?出发吧!

  ☆ 资源脚本

  在进行细节之前,我们要先搞懂怎样要编译器知道它所要编译的资源类型。方法是使用称之为资源脚本的特殊文件,它是一个简单的文本文件,可以手工编辑,也可以让Visual C++自动编辑,或者你用其它的自动编辑器编辑。无论如何,资源脚本文件要有一个.rc的扩展名。大多数的脚本文件都从定义资源行开始,最简单的资源行通常要用到资源类型,就像这样:

  [identifier] [resource type] [filename]
  【标识符】 【资源类型】 【文件名称】

  标识符可以用两种方式表示:一种是能表示资源意思的字符串,另一种是在资源相对应的头文件中用#define定义过的数字常量。如果你选择数字常量,这通常是一个好主意,别忘了把相应的头文件加入到你的资源脚本。资源脚本使用C语言风格的文件格式好像比较容易理解。以下是一个比较简单的资源脚本实例:

#include "resource.h"

// icons
ICON_MAIN ICON myicon.ico

// bitmaps
IMG_TILESET1 BITMAP tileset.bmp
IMG_TILESET2 BITMAP tileset2.bmp

  好理解吧!但有一件事可能把人弄胡涂。例子中的ICON_MAIN和IMG_TILESET是字符串呢,还是数字常量?但这无伤大雅,编译器编译的时候会自己判断。如果发现在头文件中有#define的定义,那就认为是字符常量,否则,就是字符串。

  如果有些迷茫,不要紧。我将解释我们要用到的每一个资源类型。什么?觉得麻烦?OK,OK,让我们用全自动的资源插入系统吧!(在Visual C++中,在“插入”下拉菜单中,选择“资源”)我还是喜欢在记事本中用手工输入的模式,别问我为什么,我也不知道。:)现在你知道了建立资源脚本的基础知识,让我们开始进一步的行程吧!

  ☆ 图标和光标

  你每天在使用的大多数的Windows程序,都有自己的图标,简单的说,就是EXE文件同这个图标资源相关联了,独特风格的光标也是如此。你已经知道图标的脚本行样子了,光标的和它很相似,看看吧:

[identifier] CURSOR [filename]
[identifier] ICON [filename]

  增加了一行脚本行后,也就是意味着你的EXE文件又多了一个关联。也就是说你的EXE文件要根据标识符去相应的位置寻找相应的文件[filename]。你可以使用任何你喜欢用的图标/光标编辑器去编辑相应的文件。我通常利用Visual C++中的编辑器。

  把资源脚本做出来后,并没有完事儿,因为你还不知道怎么调用相应的资源,要想知道图标和光标是怎样在你的程序中被调用的,让我们回过头来,看一看上一章中的窗口类(windows class)文件:

WNDCLASSEX sampleClass; // declare structure variable

sampleClass.cbSize = sizeof(WNDCLASSEX); // always use this!
sampleClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; // standard settings
sampleClass.lpfnWndProc = MsgHandler; // message handler function
sampleClass.cbClsExtra = 0; // extra class info, not used
sampleClass.cbWndExtra = 0; // extra window info, not used
sampleClass.hInstance = hinstance; // parameter passed to WinMain()
sampleClass.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Windows logo
sampleClass.hCursor = LoadCursor(NULL, IDC_ARROW); // standard cursor
sampleClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // a simple black brush
sampleClass.lpszMenuName = NULL; // no menu
sampleClass.lpszClassName = "Sample Class" // class name
sampleClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // Windows logo again

  还记得它吧?这个hIcon用来表示整个程序;hIconSm用来出现在开始菜单和窗口的标题栏里;hCursor用来表示在你所创建的窗口中的光标的样子。我向你保证,我们要实现自己的风格一点都不复杂。下面是它们的原形:

HICON LoadIcon(
 HINSTANCE hInstance, // handle to application instance
 LPCTSTR lpIconName // icon-name string or icon resource identifier
);

HCURSOR LoadCursor(
 HINSTANCE hInstance, // handle to application instance
 LPCTSTR lpCursorName // name string or cursor resource identifier
);

  返回的类型是它们自己相对应的类型。其内部的参数都很直观:

  HINSTANCE hInstane:但程序执行时,把图标或光标相对应的句柄传递给WinMain()函数。若要使用Windows的标注图标或光标,就把它设置为NULL。

  LPCTSTR lpIconName,lpCursorName:是你要调用的资源的标识符字符串。如果你在脚本文件中用字符串直接作为标识符,就直接传送它好了;如果你是用数字常量,就要使用一个Windows头文件里的宏MAKEINTRESOURCE()来把它们协调一致。

  让我们看一看下面的资源脚本,是关于图标和光标的:

#include "resource.h"

ICON_MAIN ICON myicon.ico
CURSOR_ARROW CURSOR arrow.cur

  如果标识符ICON_MAIN合CURSOR_ARROW在头文件resource.h中没有被#define定义过,那么我们将直接传递它给资源调用函数,象这样:

sampleClass.hIcon = LoadIcon(hinstance, "ICON_MAIN");

  如果它们在头文件resource.h中这样定义过:

#define ICON_MAIN 1000
#define CURSOR_ARROW 2000

  你就必须用宏MAKEINTRESOURCE()把它们转变为LPCTSTR类型。下面给出你几种意义相同的调用方法,都是正确的喔!

sampleClass.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(ICON_MAIN));
or...
sampleClass.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(1000));
or...
int ident = 1000;
sampleClass.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(ident));

  关于图标和光标的调用,你学的差不多了。就这个话题,我还想告诉你一件事儿。如果你除了在程序的开始设置光标外,在程序中还要设置光标,有一个简单的Windows函数可以完成它:

HCURSOR SetCursor(HCURSOR hCursor);

  仅仅一个参数,它是一个句柄,是在调用LoadCursor()时得到的,函数返回调用的上一个光标的句柄,如果没有设置过上一个光标,返回值是NULL。有点胡涂?无关大局,以后会明白。让我们看一看更有趣的吧!


1 2 3  下一页

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

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

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 初学者的福音:游戏开发新手入门指南
  • 无需再购新浪股票 传盛大已总体控股新浪36%
  • 微软否认XP优惠遭冷遇 开始发放电子优惠券
  • 电盈网通公布中国业务发展计划 合作四大块
  • 常小兵务实新政:CDMA发展要改走老百姓路线
  • KDDI开通手机游戏网站 43家公司350种类任选
  • 美国民众看淡电子政务 有事依然打电话
  • 预测:中国软件市场未来将呈现六大发展趋势
  • “花花公子”和“绅士” 新浪会落到谁手里?
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索