windows菜单等常用资源设置
在现在的环境下,在VC下编程,大家都已经习惯了使用MFC的快捷,对于资源文件的处理很多人都已经不了解了,我写这篇文章,主要就是为了对VC下资源文件的处理进行一个简单的解说。
一.添加图标icon
第一种,通过ID进行添加
wndclass.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON1)) ;
这里其实是将ICON资源的ID转换为字符串的指针
第二种,通过字符串进行添加
wndclass.hIcon = LoadIcon (hInstance, TEXT("Myicon")) ;
但需要注意的是,使用这种方法的时候不应该在resource.h包含#define语句
第三种,通过SetClassLong方法进行设定
SetClassLong(hwnd,GCL_HICON,LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2)));
这种方法主要是用于动态设定
二.添加字符串资源
LoadString (hInstance, IDS_ICON1, szAppName, sizeof (szAppName) / sizeof (TCHAR)) ;
id是ID号,szAppName是接收字符串数组的指针,第四参数是最大字符数。
三.菜单资源
3.1 当用户选择一个菜单时,windows通常向窗口过程发送几个消息“:
WM_INITMENU:wParam:主菜单句柄;
lParam:0;
WM_MENUSELECT:LOWORD(wParam):选中项:菜单ID或者弹出式菜单句柄;
HIWORD(wParam):选择标志;
lParam:包含选中项的菜单句柄;
WM_INITMENUPOPUP: wParam:弹出式菜单句柄;
LOWORD(lParam):弹出式菜单索引;
HIWORD(lParam):系统菜单为1,其他为0;
WM_COMMAND: LOWORD(wParam):菜单ID;
HIWORD(wParam):0;
lParam:0;
WM_SYSCOMMAND:wParam:菜单ID;
lParam:0;
注:如果WM_SYSCOMMAND消息是由按鼠标产生的,LOWORD(lParam)和HIWORD(lParam)将包含光标位置的X和Y的屏幕坐标。
WM_MENUCHAR:LOWORD(wParam):字符代码(ASCII或Unicode);
HIWORD(wParam):选择码;
lParam:菜单句柄;
选择码是:
a. 0,不显示弹出式菜单
b. MF_POPUP ,显示弹出式菜单
c.MF_SYSMENU,显示系统弹出式菜单
3.2对于菜单处理的API
hMenu = GetMenu (hwnd) ;
//获取菜单句柄
CheckMenuItem (hMenu, iSelection, MF_UNCHECKED) ;
CheckMenuItem (hMenu, iSelection, MF_CHECKED) ;
//分别用于取消或者选中菜单项
EnableMenuItem (hMenu, IDM_TIMER_START, MF_GRAYED) ;
//用于灰化菜单项
3.3 定义菜单的复杂方法
hMenu=CreateMenu();
hMenuPopup=CreateMenu();
AppendMenu(hMenuPopup,MF_STRING,IDM_FILE_NEW,”&New”);
……
……
AppendMenu(hMenu,MF_POPUP,hMenuPopup,”&File”);
3.4 浮动弹出式菜单
case WM_CREATE:
hMenu = LoadMenu (hInst, szAppName) ;
hMenu = GetSubMenu (hMenu, 0) ;
return 0 ;
case WM_RBUTTONUP:
point.x = LOWORD (lParam) ;
point.y = HIWORD (lParam) ;
ClientToScreen (hwnd, &point) ;
TrackPopupMenu (hMenu, TPM_RIGHTBUTTON, point.x, point.y,
0, hwnd, NULL) ;
3.5 使用系统菜单
hMenu = GetSystemMenu (hwnd, FALSE) ;
3.6其他菜单命令
DrawMenuBar(hwnd);
//强制刷新菜单
hMenuPopup=GetSubMenu(hMenu,iPosition);
//获得弹出式菜单的句柄
iCount=GetMenuItemCount(hMenu);
//获得顶层菜单或者当前弹出式菜单的项数
id=GetMenuItemID(hMenuPopup,iPosition);
//其中iPosition是菜单项在弹出式菜单中的位置(从0开始)
iCharCount=GetMenuString(hMenu,id,pString,iMaxCount,iFag);
//iFag为MF_BYCOMMAND(其中ID是菜单ID),为MF_BYPOSITION(其中id是位置索引),函数返回复制的字数,将iMaxCount个字节复制到pString中
iFlags=GetMenuState(hMenu,id,iFlag);
////iFag为MF_BYCOMMAND(其中ID是菜单ID),为MF_BYPOSITION(其中id是位置索引),函数返回当前属性的组合
DestoryMenu(hMenu);
//是菜单句柄无效
3.7 处理菜单的非正规命令
setMenu(hwnd,hMenu);