编程初学者:游戏编程起源(初学者)Ⅲ



★ 第 2章 使用Win32资源

☆ 介绍
欢迎继续收看!通过本章题目可能你已经猜出了本章论题我将教会你在Windows中使用资源简单资源即数据它们通常是和EXE文件相关联但是它们又是独无 2首先资源在运行过程中不能被修改它们实际上都是只读文件而且代码不能够直接访问它们另外资源并不在数据区内在装入时资源通常在某个磁盘文件中直到需要它们时才被装入使用资源是件很容易事情并且它妙处无穷Windows为我们提供了大量资源类型但我们这里只学些最常用最容易:图标(icon)、光标(cursor)、位图(bitmap)、菜单(menu)和串()此后我还将教你建立自己风格类型资源使你为所欲为(好像挺诱人哦!)
重复要想看懂本章你得有点C语言基础C++有时用但不影响你学习本章内容并且我假定你已经读过了上章内容“Windows编程基础”我还是用Microsoft Visual C++编译器如何样?出发吧!

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

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

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

# \"resource.h\"

// icons
ICON_MAIN ICON myicon.ico

// bitmaps
IMG_TILESET1 BITMAP tile.bmp
IMG_TILESET2 BITMAP tile2.bmp

好理解吧!但有件事可能把人弄胡涂例子中ICON_MAIN和IMG_TILESET是串呢还是数字常量?但这无伤大雅编译器编译时候会自己判断如果发现在头文件中有#定义那就认为是常量否则就是
如果有些迷茫不要紧我将解释我们要用到个资源类型什么?觉得麻烦?OK,OK让我们用全自动资源插入系统吧!(在Visual C++中在“插入”下拉菜单中选择“资源”)我还是喜欢在记事本中用手工输入模式别问我为什么我也不知道:)现在你知道了建立资源脚本基础知识让我们开始进行程吧!

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

[identier] CURSOR [filename]
[identier] ICON [filename]

增加了行脚本行后也就是意味着你EXE文件又多了个关联也就是说你EXE文件要根据标识符去相应位置寻找相应文件[filename]你可以使用任何你喜欢用图标/光标编辑器去编辑相应文件我通常利用Visual C++中编辑器
把资源脚本做出来后并没有完事儿你还不知道如何相应资源要想知道图标和光标是怎样在你中被让我们回过头来看上章中窗口类(windows )文件:

WNDCLASSEX sampleClass; // declare structure variable

sampleClass.cbSize = (WNDCLASSEX); // always use this!
sampleClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; // standard tings
sampleClass.lpfnWndProc = MsgHandler; // message handler function
sampleClass.cbClsExtra = 0; // extra 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\" // 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 or icon resource identier
);

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

返回类型是它们自己相对应类型其内部参数都很直观:
HINSTANCE hInstane:但执行时把图标或光标相对应句柄传递给WinMain()若要使用Windows标注图标或光标就把它设置为NULL
LPCTSTR lpIconNamelpCursorName:是你要资源标识符如果你在脚本文件中用串直接作为标识符就直接传送它好了;如果你是用数字常量就要使用个Windows头文件里宏MAKEINTRESOURCE来把它们协调
让我们看看下面资源脚本是有关图标和光标:



# \"resource.h\"

ICON_MAIN ICON myicon.ico
CURSOR_ARROW CURSOR arrow.cur

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

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

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

# ICON_MAIN 1000
# CURSOR_ARROW 2000

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

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

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

HCURSOR SetCursor(HCURSOR hCursor);

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

☆ 位图
想要往里添加图象通过位图资源可能是最简单办法了位图是Windows的本当然提供了来处理位图请记住如果你使用了太多位图EXE文件将要非常巨大在资源脚本中设置位图同图标和光标没什么区别:

[identier] BITMAP [filename]

LoadBitmap同LoadCursor和LoadIcon使用方法很相似它将得到个句柄由于我还没有讲过图形(graphics)就不具体说功能了你可以猜猜它是怎样工作旦你得到了图形句柄你将怎样使用它呢?更多留待以后再讲不要担心现在只是要你有点儿准备下面看看我们还应该学点儿什么

串表格

待续



Tags:  网络游戏的起源 网络游戏起源 游戏的起源 编程初学者

延伸阅读

最新评论

发表评论