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表示将这个菜单项和后面的菜单项理列入新的的列中
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消息 lParam的值为0,wParam参数的低16位是命令ID 高16位是通知码 菜单消息的通知码是0,加速键消息的通知码为1
在窗口过程中 需要增强一个处理WM_COMMAND分支来处理对应的消息
4 菜单的修改
5 使用系统菜单
系统菜单指按下了标题栏图标后弹出的菜单
发送的WM_SYSCOMMAND消息
GetSystemMenu用来获取系统菜单的句柄
6 右键弹出菜单
在鼠标按下的地方弹出菜单
右键弹出的菜单必须是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 对话框的资源定义
-
对话框资源定义的语法
。。。
5 字符串资源
字符串可以在.const节定义,也可以在资源文件中的定义
使用LoadString加载
6 版本信息资源
在程序中检测版本信息
GetFileVersionSize 检测程序有没有版本信息
GetFileVersionInfo 获取文件的版本信息
VerQueryValue 解码文件版本信息中的特定属性
7 二进制资源和自定义资源
使用二进制资源
二进制资源的定义
FindResource
LoadResource
LockResource
SizeofResource
使用自定义资源