windows使用资源的一个好处是能够统一的进行管理,把所有的资源都绑定到程序的.EXE文件中。如果没有资源的概念的话,资源不得不单独的作为一个文件来保存,并在使用的时候将其读入内存。windows编程中,主要有如下一些资源:图标,鼠标指针,字符串,自定义资源,菜单,键盘加速键,对话框,位图。
在VC中在程序中引入资源的一种便捷方法是:(1)设定一个工程已打开,如下:File->New,在弹出的New对话框中,选择files中的resource script,填写相关文件名称及工程。(2)Insert->resource,在弹出的对话框中,选择要建立的资源类型,在根据实际情况就OK了。
图标
程序中运用图标,可分为系统定义的图标和程序员定义的图标。
对于系统定义的图标使用:
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
对于系统定义的图标运用LoadIcon来加载时,第一个参数必须为NULL,表示该图标有系统内定,第二个参数表示系统内定的图标的ID号,系统定义的图标主要有:
IDI_APPLICATION:32512 IDI_QUESTION:332514
IDI_HAND:32513 IDI_EXCLAMATION:32515
IDI_ASTERISK :32516 IDI_WINLOGO:32517
IDI_UAC :32518(仅Vista、Win7)
自己定义的图标:
wndclass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON));
其中第一个参数表示资源图标的实力来自的实例句柄,第二个参数实际是一个字符串指针。
#define MAKEINTRESOURCE(i) DOWORD((WORD)(i))
这样也就是说其也可以这样使用或者定义:
wndclass.hIcon=LoadIcon(hInstance,szAppName);//其中szAppNmae为一个字符串,其代表如表文件
在.RC文件中资源脚本ICON语句形式如下eg:
IDI_ICON ICON DISCARDABLE "icondemo.icon"
其中IDI_ICON为图标ID标识符。ICON代表资源脚本的类型。IDSCARDABLE表示windows在需要是可以自动将图标从内存中移除,在需要是自动加载到内存中,无需程序员操作。
如果需在程序中动态改变图标时,可以使用SetClassLong函数:
SetClassLong(hwnd,GCL_HICON,LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ALTICON));
也就是说程序中使用图标有两种方法:一种是在定义窗口类时,使用LoadIcon函数初始化hIcon项。一种是在程序中使用SetClassLong函数。
鼠标指针
使用方法:第一种在创建窗口类时,使用LoadCursor函数初始化hCursor项,第二种时调用SetClassLong函数动态改变。第三种是使用SetCursor(hCursot)函数。
字符串资源
在使用时,应该使用LoadString来复制字符串到缓冲区中,便以在程序中使用:
LoadString(hIstance,id,szBuffer,iMaxLength);
自定义资源
方法:Insert->Resorce,在对话框中选择Custom按钮。
在初始化时可以使用LoadResource函数来获得句柄:
hResource=LoadResource(hInstance,
FindResource(hInstance,MAKEINTRESOURCE(IDR_BINTU),TEXT("BTNTU"));
其中的hResource为HGLOBAL类型,既其指向内存块的句柄。
如果需要访问文本时,应调用LockResource函数和FreeResource函数:
pdata=LockResource(hResource);//pdata为指向文本的指针
FreeResource(hResource);//释放资源
-------------------------------------------------------------------------------------------------------------
菜单
菜单的建立的方法和上面的各种资源建立方法类似。
创建时会弹出一个对话框:
方法一:wndclass.lpszMenuName=szAppName;
方法二:先用LoadMenu函数加载到内存并获得句柄,在调用CreateWindow函数时指定相应菜单项
hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(ID_MENU));
hwnd=CreateWindow("myclass","dfds",WS_OVERLAPPEDWINDOW,
CW_USEDFAULT,CW_USEDEFAULT,CW_USEDEAULT,
CW_USEDEFAULT,NULL,hMenu,hInstance,NULL):
方法三:SetMenu(hwnd,hMenu)函数在创建窗口后指定菜单。
与菜单相关的一些消息:
1)WM_INITMENU消息
wParam: 主菜单句柄
lParam: 0
产生:当一个菜单即将变为活动时,发送此消息
2)WM_MENUSELECT消息
LOWORD(wParam): 所选的菜单项:菜单的ID或弹出菜单的索引
HIWORD(wParam): 选择标记
lParam: 包含所选项的菜单句柄
产生:当鼠标或者光标在各菜单项移动时,会产生许多该消息
选择标记:
MF_DISABLED:使菜单项无效,使该项不能被选择,但不使菜单项变灰。
MF_GRAYED:使莱单项无效并变灰,使其不能被选择。
MF_CHECKED:在菜单项旁边放置一个选取标记。
MF_BITMAP:含有位图句柄
MF_POPUP:指定菜单打开一个下拉式菜单或子菜单
MF_HELP:帮助
MF_SYSMENU:显示系统弹出菜单
MF_MOUSESELECT
3)WM_INITMENUPOPUP消息
wParam: 弹出菜单句柄
LOWORD(lParam) :
HIWORD(lParam) :
产生::Windows要显示弹出菜单时,会向窗口过程发送此消息。
4)WM_COMMAND消息
LOWORD(wParam): 菜单的ID
HIWORD(wParam): 0
lParam: 0
产生:当一个菜单被选中时产生
5)WM_MENUCHAR消息
LOWORD(wParam):字符码
HIWORD(wParam): 选择码
lParam: 菜单句柄
产生:如果用户按下了Alt和一个不对于任何菜单项的字符键;或者,当淡出菜单显示时,
按下了一个不对应于任何弹出菜单项的字符键。
选择码:0 没有弹出菜单显示
MF_POPUP 弹出菜单被显示
MF_SYSYMENU 系统弹出菜单被显示
使用CreateMenu()和AppendMenu函数来创建菜单
-------------------------------------------------------------------------------------------------------------------
加速键
使用LoadAccelerators函数将键盘加速键表加载到内存中:
HANDLE hAccel;
hAccel=LoadAccelerators(hInstance,TEXT("MyAccelerators"));
在获得消息是可使用TranslateAccelerators(hwnd,hAccel,&msg)来对获得消息进行翻译,如果其与键盘加速键表中的值匹配,就将该消息传给拥有菜单的窗口过程,则返回TRUE,否则返回FALSE。
因此可以这样处理:
while(GetMessage(&msg,NULL,0,0))
{
if(!TranslateAcdelerator(hwnd,hAcdel,&msg))
{
TranslateMessage(&msg);
DispathMessage(&msg);
}
}
WM_COMMAND消息
LOWORD(wParam): 加速键ID
HIWORD(wParam): 1
lParam: 0
ID:快捷键对应的菜单的ID
Key:虚拟件码或者AXCII码
Modifiers:选择和虚拟件码组合的键
Type:Key中是虚拟件码还是ASCII码
----------------------------------------------------------------------------------------------------------------------
一些陌生的函数:
1):CheckMenuItem(hmenu, id, uCheck);
函数功能:该函数取得与指定菜单项相联系的菜单标志。如果该菜单项打开了一个子菜单,该函数也返回子菜单里的菜单项数。
uCheck参数:MF_CHECKED,MF_UNCHECKED,MF_BYCOMMAND,MF_BYPOSITION,
MF_DISABLED,MF_ARAYED,MF_HILITE,MF_MENUBARBREAK,MF_SEPARATOR
2):DWORD SetClassLong(HWND hWnd,int nlndex,LONG dwNewLong);
函数功能:该函数替换在额外类存储空间的指定偏移地址的32位长整型值,或替换指定窗口所属类的WNDCLASSEX结构。
nIndex参数:GCL_CBCLSEXTRA ,GCL_CBWNDEXTRA, GCL_HBRBACKGROUND,
GCL_HCURSOR,GCL_HMODULE , GCL_MENUNAME,GCL_WNDPROC
dsNewLong参数:用于替换的值
3)DWORD GetClassLong(HWND hWnd,int nlndex)
函数功能:该函数返回与指定窗口相关的WNDCLASSEX结构的指定32位值
nIndex参数:GCL_CBCLSEXTRA ,GCL_CBWNDEXTRA, GCL_HBRBACKGROUND,
GCL_HCURSOR,GCL_HMODULE , GCL_MENUNAME,GCL_WNDPROC
4)BOOL EnableMenuItem(HMENU hMenu,UINT uIDEnableItem, UINT uEnable);
函数功能:允许或禁止指定的菜单条目
uEnable参数::MF_BYCOMMAND,MF_BYPOSITION,MF_ENABLED,
MF_DISABLED,MF_GRAYED
5)CreateMenu()
函数功能:创建菜单
返回值:指向创建的菜单内存块的句柄
6)BOOL AppendMenu(hMenu hMenu,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem);
函数功能:函数在指定的菜单条、下拉式菜单、子菜单或快捷菜单的末尾追加一个新菜单项。此函数可指定菜单项的内容、外观和性能
unFlags参数:MF_BITMAP,MF_CHECKED,MF_DISABLED,MF_ENABLED,MF_GRAYED,
MF_MENUBARBREAK, MF_MENUBREAK,MF_POPUP, MF_SEPARATOR,
MF_STRING,MF_UNCHECKED ,MF_OWNERDRAW
7)BOOL TrackPopupMenu(HMENU hMenu,UINT uFlags,int x,int y,int nReserved,HWND hWnd,CONST RECT* prcRect);
函数功能:该函数在指定位置显示快捷菜单,并跟踪菜单项的选择。快捷菜单可出现在屏幕上的任何位置。
uFlags参数:TPM_CENTERALIGN,TPM_LEFTALIGN,TPM_RIGHTALIGN,TPM_BOTTOMALIGN
TPM_TOPALIGN,TPM_VCENTERALIGN,TPM_NONOTIFY,TPM_RETURNCMD,
TPM_LEFTBUTTON,TPM_RIGHTBUTTON
NReserved:保留值,必须为零。
PrcRect:未用。
8)GetSystemMenu(hwnd,True);//获取系统菜单句柄
9)iCount=GetMenuItemCount(hMenu);//计算子菜单的项数
10) GetSubMenu(hMenu,iPosition);//获取子菜单的句柄
11)id=GetMenuItemID(hMenuPopup,iPosition);//获取ID
12)DarwMenuBar(hwnd);//强制重绘
13)iFlags=GetMenuState(hMenu,id,iFlag);//获取当前菜单项的状态
14)iCharCount=GetMenuString(hMenu,id,pString,iMaxCount,iFlag);//获取菜单项上的字符串
15)SetMenu(hwnd,hMenuMain);
16)BOOL InsertMenu(HMENU hMenu,UINt uPosition,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem);
函数功能:函数插入一个新菜单项到菜单里,并使菜单里其他项下移。
iPosition参数:指定新菜单项将被插入其前面的菜单项,其含义由参数uFlagS决定
uFlags参数:MF_BYCOMMAND,MF_BYPOSITION, MF_BITMAP,MF_CHECKED ,
MF_DISABLED,MF_ENABLED,MF_GRAYED,MF_MENUBARBREAK,
MF_MENUBREAK,MF_OWNERDRAW,MF_POPUP,MF_SEPARATOR,
MF_STRING,MF_UNCHECKED
uIDNewltem参数:指定新菜单项的标识符,或者当参数uFlags设置为MF_POPUP时,指定下拉式菜单或子菜单的句柄。
LpNewltem参数:指定新菜单项的内容。其含义依赖于参数UFlags是否包含标志MF_BITMAP,MF_OWNERDRAW或MF_STRING。
17)BOOL ModifyMenu(HMENU hMnu,UINT uPosition,UINT uFlags,UINT uIDNewltem,LPCTSTR IpNewltem);
函数功能:该参数修改已存在的菜单项,并指定菜单项的内容、外观和性能。
18)BOOL RemoveMenu(HMENU hMenu,UINT uPosition,UINT uFlgs);
函数功能:该函数从指定菜单删除一个菜单项或分离一个子菜单。如果菜单项打开一个下拉式菜单或子菜单,RemoveMenu不消毁该菜单或其句柄,允许菜单被重用。
在调用此函数前,函数GetSubMenu应当取得下拉式菜单或子菜单的句柄。