第5章 使用资源

windows中的资源
菜单、图标、对话框、加速键、光标、位图、字符串、版本信息、自定义资源
资源文件的源文件是以rc为扩展名的脚本文件,由资源编译器Rc.exe编译成以res为扩展名的二进制资源文件,最后在链接的时候由Link.exe链入可执行文件中

1 菜单与加速键

菜单示例

加速键为快捷键
不管程序中是否定义快捷键,windows总是定义了几个默认的快捷键
F10 打开窗口的主菜单
Alt+空格 会打开系统菜单
alt+F4 关闭

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include        
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN        0x1000  //图标
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define IDM_MAIN        0x2000  //菜单
#define IDA_MAIN        0x2000  //加速键
#define IDM_OPEN        0x4101
#define IDM_OPTION      0x4102
#define IDM_EXIT        0x4103   
#define IDM_SETFONT     0x4201
#define IDM_SETCOLOR    0x4202
#define IDM_INACT       0x4203
#define IDM_GRAY        0x4204
#define IDM_BIG         0x4205
#define IDM_SMALL       0x4206
#define IDM_LIST        0x4207
#define IDM_DETAIL      0x4208
#define IDM_TOOLBAR     0x4209
#define IDM_TOOLBARTEXT 0x4210
#define IDM_INPUTBAR    0x4211
#define IDM_STATUSBAR   0x4212
#define IDM_HELP        0x4301
#define IDM_ABOUT       0x4302
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    ICON        "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDM_MAIN    menu    discardable
//菜单的ID为一个十六进制数 discardable表示菜单在不再使用的时候可以暂时从内存中释放出来以节省内存 可选
/*
菜单ID menu [discardable]
begin
    菜单项定义  
    ...
end
*/

BEGIN //begin end可以用{ }来代替
    popup   "文件(&F)"
    BEGIN
        menuitem    "打开文件(&O)...",  IDM_OPEN
        menuitem    "关闭文件(&C)...",  IDM_OPTION
        menuitem    separator
        menuitem    "退出(&X)",       IDM_EXIT
    END
    popup   "查看(&V)"
    BEGIN
        menuitem    "字体(&F)...\tAlt+F",IDM_SETFONT
        menuitem    "背景色(&B)...\tCtrl+Alt+B",IDM_SETCOLOR
        menuitem    separator
        menuitem    "被禁用的菜单项",  IDM_INACT,  INACTIVE
        menuitem    "被灰化的菜单项",  IDM_GRAY,   GRAYED
        menuitem    separator
        menuitem    "大图标(&G)",      IDM_BIG
        menuitem    "小图标(&M)",      IDM_SMALL
        menuitem    "列表(&L)",           IDM_LIST
        menuitem    "详细资料(&D)",     IDM_DETAIL
        menuitem    separator
        popup       "工具栏(&T)"
        BEGIN
           menuitem "标准按钮(&S)",     IDM_TOOLBAR
           menuitem "文字标签(&C)",     IDM_TOOLBARTEXT
           menuitem "命令栏(&I)",      IDM_INPUTBAR
        END
        menuitem    "状态栏(&U)",      IDM_STATUSBAR
    END
    popup   "帮助(&H)"    ,HELP
    BEGIN
        menuitem    "帮助主题(&H)\tF1", IDM_HELP
        menuitem    separator
        menuitem    "关于本程序(&A)...",IDM_ABOUT
    END
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDA_MAIN    accelerators
BEGIN
        VK_F1,  IDM_HELP,   VIRTKEY
        "B",    IDM_SETCOLOR,VIRTKEY,CONTROL,ALT
        "F",    IDM_SETFONT,VIRTKEY,ALT
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

菜单项的定义


菜单项的定义
  • 菜单文字 &x 表示下划线 带下划线的字母会被系统自动当作快捷键 \t后面接提示 会右对齐
  • 命令ID 用来分辨不同的菜单项 在菜单被选中时windows会向窗口过程发送一个WM_COMMAND消息 消息的参数就是这个ID
  • 选项 CHECKED 复选对勾 GRAYED 灰化 INACTIVE 禁用 MENUBREAK或MENUBARBREAK表示将这个菜单项和后面的菜单项理列入新的的列中


    MENUBREAK效果

poppup菜单的选项 GRAYED 灰化 INACTIVE 禁用 HELP表示本项和以后的菜单项是右对齐的

2 加速键的定义


加速键的定义

示例


快捷键的定义示例

resource.h中定义了虚拟键

定义资源 ID时 对于同类别 的多个资源 ,资源ID必须为不同的值
对于不同类别 的资源 ,资源 ID在数值上可以是相同的

1.3 使用菜单和加速键

1加载窗口

加载窗口的方法
一是在注册窗口类的时候指定类的默认菜单
二是在建立 窗口的时候在参数中指定菜单句柄
使用LoadMenu来获取菜单句柄

invoke LoadMenu, hInstance,IDM_MAIN
mov hMenu,eax
当资源文件中使用字符串为名称定义菜单时
szMenu  "MainMenu",0
invoke LoadMenu, hInstance, addr szMenu
mov hMenu,eax

2 加载加速键

invoke LoadAccelerators, hInstance,IDA_MAIN
mov @hAccelerator,eax

在消息循环中处理加速键


在消息循环中处理回事键

TranslateAccelerator函数会检查WM_KEYDOWN和WM_SYSKEYDOWN消息,若按键符合定义的加速键,向目标窗口发送WM_COMMAND或WM_SYSCOMMAND消息,将返回TRUE,否则 返回FALSE
参数中传入主窗口的句柄

3 菜单和加速键消息

WM_COMMAND消息的两个附带参数


WM_COMMAND消息的两个附带参数

对于菜单和加速键引发 的WM_COMMAND消息 lParam的值为0,wParam参数的低16位是命令ID 高16位是通知码 菜单消息的通知码是0,加速键消息的通知码为1
在窗口过程中 需要增强一个处理WM_COMMAND分支来处理对应的消息


处理WM_COMMAND消息的分支

4 菜单的修改

菜单修改使用的api

5 使用系统菜单

系统菜单指按下了标题栏图标后弹出的菜单
发送的WM_SYSCOMMAND消息
GetSystemMenu用来获取系统菜单的句柄

系统菜单的处理

6 右键弹出菜单

TrackPopupMenu

在鼠标按下的地方弹出菜单


在鼠标安排下的地方弹出菜单

右键弹出的菜单必须是popup类型的
GetSubMenu用于获取子菜单

7 菜单状态的检测与设置

GetMenuState
设置菜单状态
EnableMenuItem MF_DISABLE MF_ENABLE MF_GRAYED
CheckMenuItem MF_CHECKED MF_UNCHECKED
CheckMenuRadioItem

8 其它菜单函数

CreateMenu
CreatePopMenu
GetMenuItemCount
GetMenuString
GetMenuItemID
SetMenu
DestoryMenu

2 图标和光标

2.1 图标和光标资源的定义

示例


图标和光标资源 的定义

图标文件扩展名为ico
静态光标文件扩展名为cur
动态光标文件扩展名ani

2.2 图标和光标资源的使用

1 加载图标和光标资源

用的相关api
LoadIcon
LoadCursorFromFile
LoadCursor

2 使用图标和光标

要在标题栏中设置图标可以向窗口发送 WM_SETICON消息

WM_SETICON  
wParam = (WPARAM) fType;          // icon type ICON_BIG/ICON_SMALL
lParam = (LPARAM) (HICON) hicon;  // handle of icon

若要改变窗口的光标,需要调用SetClassLong函数 该函数可以改变窗口类的所有属性

DWORD SetClassLong(

    HWND hWnd,  // handle of window
    int nIndex, // index of value to change
    LONG dwNewLong  // new value
   );

3 位图

3.1 位图

bitmap 是windows操作系统存储图像的方式
每个像素对应的位数叫做颜色深度

位图
设备无关位图(DIB) 色彩表和位图数据
位图文件 bitmap文件头和DIB数据

3.2

位图资源的定义

加载位图数据

4 对话框

4.1 对话框的类型

  • 模态 必须关闭当前对话框,才能切换到其它窗口 DialogBoxParam
  • 非模态 当前窗口和其它窗口可以自由切换 CreateDialogParam


    对话框和普通窗口的工作原理

    可以使用模态对话框来当作小程序的主窗口

4.2 对话框的资源定义

  1. 对话框资源定义的语法


    对话框的可选属性

    。。。

5 字符串资源

字符串可以在.const节定义,也可以在资源文件中的定义
使用LoadString加载

6 版本信息资源

在程序中检测版本信息
GetFileVersionSize 检测程序有没有版本信息
GetFileVersionInfo 获取文件的版本信息
VerQueryValue 解码文件版本信息中的特定属性

7 二进制资源和自定义资源

使用二进制资源
二进制资源的定义
FindResource
LoadResource
LockResource
SizeofResource

使用自定义资源

你可能感兴趣的:(第5章 使用资源)