windows基础编程 -- 资源

来源:互联网 发布:sky 态度 科技知乎 编辑:程序博客网 时间:2024/05/16 17:58

前言

VC环境可以通过资源脚本文件(.rc)给当前程序添加资源,这些资源包括:

Accelerator(加速键),Bitmap(位图),Cursor(光标),Dialog(对话框),HTML(网页脚本),Icon(图标),Menu(菜单),StringTable(字符表),ToolBar(工具栏),Version(程序版本).通过图形界面添加对应的资源后,系统会生成对应的资源脚本文件,然后系统通过RC.EXE(资源编辑器)就可以把该文件翻译成.res文件用来链接目标文件,同时生成resource.h文件记录你放入的资源ID,需要把该文件包含在工程文件中才可以在程序里正常使用这些资源。

资源分类

对于每项资源,我们在放入后都可以自己定义它的ID号,然后通过对应的
LoadXXX函数就可以得到对应的资源句柄了。

HMENU 菜单

菜单在前面已经讲过,在添加完菜单资源并填好其对应的ID号和名称后就可以保存然后调用LoadIcon获得窗口菜单的句柄。

HICON 图标

  • 在注册窗口类时有两个和HICON相关的成员(WNDCLASSEX), 其中一个是大图标一个小图标,现在我们可以先通过资源文件添加然后画出一个ICON了,然后通过LoadIcon得到它的句柄,这样就可以在注册窗口类时放入自己设计的ICON图标了。
  • 其次,在程序运行时可以通过发送WM_SETICON消息来修改图标,这个消息WPARAM指定大小图标类型,LPARAM则指定新的图标句柄,我们只需要send该消息而不必在消息响应函数里处理它,该消息应由DefWinodwProc来做处理,和WM_QUIT消息一个道理。
  • 最后,ICON图标还可以画在窗口上,调用DrawIcon函数即可,这点上我觉得是想把它当作图形文件使用而已。

HCURSOR 光标

  • 光标其实就是鼠标在窗口程序的表现形式,依旧可以通过资源文件画出自己想要的光标文件,同时指定它的Hotspot,然后通过LoadCursor获得其句柄,在设计窗口类时添加它。
  • 其次,可以使用SetCursor函数在程序运行时修改光标,这点上和图标使用的差异一直让我想不通,为何图标没有SetIcon函数而光标不使用WM_SetCursor消息?
  • 使用LoadCursorFromFile函数是可以加载动态光标的(.ani文件)

String Table 字符串表

  • 字符串表的意义在于你可以把整个程序的常量字符串做一个系统管理,你可以很清晰的看见和修改任何字符串,同时给串取一个ID方便复用。
  • 调用LoadString,参数里需要指明哪个ID的字符串,以及放在哪个缓冲
    变量里。

Accelerator 加速键表

  • 加速键表相当于快捷键,你可以在各个菜单项里看到对应的快捷键,按下就会和点击产生相同的效果,加速键确实在按下也会产生WM_COMMMAND消息,你或许以为加速键只是和具体菜单项绑定的一种资源,但其实不是,他们2者没有半毛联系,至于他们的功能一样,那是因为他们2者资源的ID一样,在WM_COMMAND响应函数处理的结果也就一样,但按下加速键和点击菜单项其实是截然不同的路线。
  • 往资源文件里添加一个加速键表,然后往表里添加你想放入的加速键,每一组加速键都可以指明其具体ID,而加速键表也有一个ID,这点和菜单有点像。
  • 使用LoadAccelerators可以加载加速键表资源,加速键表比较特别,它不是给客户看的,其实是给系统看的,具体来说,是用在消息处理里的,
    而你按下加速键,只会产生WM_KEYDOWN消息,并没有WM_COMMAND的消息,所以我们需要调用一个TranslateAccelerator函数来处理,它的内部会发出具体的WM_COMMAND消息。
    -对于TranslateAccelerator函数我们应该把它放到消息循环处理里,这个函数作用就是,判断接收的按键消息是不是具体的加速键,如果是返回非0,否则返回0,这点上和TranslateMessage有点像,它负责解释按下的键是不是具体有效字符键,所以为了避免干扰,需要将加速键翻译函数放在字符翻译函数之前,可如下
    HACCEL hAccel = LoadAccelerators(        g_hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));    while (GetMessage(&msg,NULL,0,0))    {        if(!TranslateAccelerator(msg.hwnd,hAccel,&msg)){        TranslateMessage(&msg);        DispatchMessage(&msg);        }    }


  • TranslateAccelerator函数具体执行过程如下:

检测消息是否为WM_KEYDOWN\WM_SYSDOWN消息
根据msg.wParam有虚拟键码找到对应按键
取加速键表里查找有没有对应的ID值
包装发送WM_COMMAND消息,其中wParam的高字节要填1,这点和点击菜单时是0有区别,其他都一样。
返回非0

BitMap 位图

在资源文件里可以添加位图资源,它有点像ICON和CURSOR资源,需要自己画,然后得到一个位图的ID号,同样通过LoadBitmap可以得到其句柄资源。
但是位图应用上有所区别,

可以作为资源添加到画刷中(绘图对象)。
可以画在窗口上,但中间的过程比较复杂。

这里涉及到绘图设备和绘图一系列相关的知识,请参考下一章。

0 0