Timers and Animation

theForger's Win32 API教程第二版(简体中文)

主页

基础
  1. 开始学习
  2. 一个简单的窗口
  3. 处理消息
  4. 理解消息循环
  5. 使用资源
  6. 菜单和图标
  7. 对话框
  8. 非模态对话框
  9. 标准控件
  10. 对话框常见问题
创建一个简单应用
  1. 在运行时创建控件
  2. 文件与常用对话框
  3. 工具栏与状态栏
  4. 多文档界面
图形设备接口
  1. 位图,设备上下文
  2. 透明位图
  3. 定时器与动画
  4. 文本,字体与顏色
工具与文档
  1. 参考
  2. 免费的Visual C++(最新更新)
附表
  1. 常见错误的解決方法
  2. API vs. MFC
  3. 关于资源文件的说明

使用资源

  你可能需要参考本教程后面的附表查看关于使用VC++和BC++编辑资源的更多消息

  在我们进行进一步的对资源进行讨论前我先提一点以免我要在每一段重写一次你不需要编译此段中的內容它仅仅是例子

  资源是你可执行文件中预定义的二进制数据你用资源脚本来创建资源就是以".rc"结尾的那种文件商业的编译器一般有可视化的资源编辑器让你不用手动编辑资源脚本但有些时候你必须这样做特別是你用的编译器沒有可视化的资源编辑器的时候或是不支持你需要的功能的时候

  不幸的是不同的编译器以不同的方式处理资源我将尽力工作所需要的资源处理中的通用部分进行解释

  MSVC++中的资源编辑器让手工编辑资源很困难因为它又加了一些专有的格式而且把你手动编辑的文件弄得一团糟. 通常说你不用为手动编辑.rc文件而操心但是知道如何手工修攺它是很有好处的另外一件烦心的事情是MSVC++总是把资源头文件命名为resource.h”即使你想起一个別的名字为简便叙述起见我暂时先遵循这一个规则将后面的关于编译器的附表中将指出怎样攺变这个规则

  首先让我们来看一个很简单的资源脚本只有一个图标

#include "resource.h"

IDI_MYICON ICON "my_icon.ico"

  这就是整个文件了IDI_MYICON是资源的标识ICON是类型"my_icon.ico"是包含其的外部文件这些应该在所有的编译器上都可以工作

  那么"#include "resource.h"干什么用因为你的程序需要一种标识这个图标的方式最好的方式就是给一个独一无二的ID(IDI_MYICON)我们可以创建"resource.h"并在我们的资源脚本和源文件中同时包含它

#define IDI_MYICON  101

  可以看到我们给IDI_MYICON赋了101的值我们可以忘掉那个标识符只用101来引用这个图标但是IDI_MYICON表达的意思更清楚而且在你拥有一大堆资源的时候也容易记忆

  现在我们来添加一个MENU资源

#include "resource.h"

IDI_MYICON ICON "my_icon.ico"

IDR_MYMENU MENU
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "E&xit", ID_FILE_EXIT
    END
END

  这次IDR_MYMENU是资源的名字MENU是类型看见BEGIN和END沒有有些资源编辑器或是编译器用{代替BEGIN和}代替END如果你的编译器两者都支持的话你随便选一种就是了如果它只支持一种的话你就需要做一些替換

  我们还添加了一个新的标识符ID_FILE_EXIT所以我们为了在我们的程序中使用的话先要在资源头文件resource.h中添加一下

#define IDI_MYICON  101

#define ID_FILE_EXIT	4001

  在大的工程中生成这些标识并要一直保持它们的定义是一件很繁杂的事务这就是为什么很多人使用一个可视化的资源编辑器来做这些事情它们有时也会出点问题比如你可能遇到很多资源项拥有相同的标识之类的问题这时候你就可能要自已来解決它们

  现在来看下怎么在你的程序中使用资源

    HICON hMyIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));

  LoadIcon()和很多其它的使用资源的函数的第一个参数为当前运行程序的实例的句柄在WinMain()中给出也可用像前面章节中讲的那样用GetModuleHandle()来获取).第二个参数为资源的标识

  你可能在想MAKEINTRESOURCE()干什么用或在迷惑为什么LoadIcon()要吃一个LPCTSTR型的参数而不是UINT之类当我们传给它一个标识的时候MAKEINTRESOURCE()所做的就是把我们资源标识的整型数强转为LoadIcon()所要的LPCTSTR类型这里我们可以看到标识资源的第二种方法使用字符串几乎沒有人这样做了所以我就不详叙细节了但是基本上如你不用#define为你的源定义一个整数的话那么它的名字以一个字符串来解释在你的程序中这样来引用

    HICON hMyIcon = LoadIcon(hInstance, "MYICON");

  LoadIcon()和一些別的使用资源的API函数能夠通过检查高字来判別传给它的是一个整数还是一个指向字符串的指针如果为0所有小于等于65535的整数则它认为它为一个资源标识这也把你你的标识限制在65535下面了除非你的确有很多很多的资源应该不成问题如果不是0则它认为它为一个字符串的指针它就用名字来找资源当然除非文档中明确指明了这一点最好不要依赖API的这个特性

  比如对于菜单命令ID_FILE_EXIT这个特性就不能工作因为它们只能为整型

Copyright © 1998-2008, Brook Miles (forgey). All rights reserved.