Windows编程学习笔记(十二)
第八章 菜单及其他资源
这一部分主要学习了windows程序中对资源的定义及使用。
在windows程序中,主要有以下几种资源:
·图示·游标·字符串·自订资源·菜单·键盘快捷键·对话框·位图
/*******************************************************/
使用图标资源
·定义好一个图标 #define IDI_MYICON 123 (当然这个IDI_MYICON必须是存在的)
·载入资源 hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_MYICON));
·使用资源 这时我们就可以通过hIcon来使用图标资源
/*******************************************************/
自订光标
自订游标一般为单色,大小为32*32像素,在创建游标时,记得要定义游标的热点。
我们可以这样载入自订游标
Wndclass.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE(IDC_MYCURSOR));
举个简单的例子,如果我们想一个程序中的不同窗口处使用不同的游标,我们可以改变每个子窗口类别中的hCursor字段,让每个窗口使用不同的游标。
SetClassLong( hwndChild, GCL_HCURSOR, (LONG)hCursorChild );
这样,当鼠标进入子窗口的控制视野中时,鼠标就会显示出hCursorChild的游标了。
/*******************************************************/
STRING资源
当定义好一个string类的资源后,我们可以使用loadstring来把字符串资源复制到一个缓冲区中
LoadString( hInstance, id, szBuffer, iMaxLength);
/*********************************************************/
菜单资源
当您建立或改变程序中的菜单时,把顶层菜单和每一个弹出式菜单想象成各自独立的菜单是有用的。顶层菜单有一个菜单句柄,在顶层菜单中的每一个弹出式菜单也有它自己的菜单句柄。系统菜单(也是一个弹出式菜单)也有菜单句柄。
菜单中的每一项都有三个特性
·菜单中显示什么,它可以是字符串或是位图
·wm_command消息中的ID或在使用选择菜单时windows显示的弹出式菜单句柄
·菜单项的属性,包括是否被禁用,无效化或被选中。
/********************************************************/
使用菜单:
当一个菜单定义好后,可以这样载入
hMenu = LoadMenu(hInstance , MAKEINTRESOURCE( ID_MENU));
我们也可以在窗口类别中指定NULL菜单,窗口建立后在给窗口指定一个菜单:
SetMenu( hwnd , hMenu);
菜单和消息
当使用者选择一个菜单时,windows通常项消息处理程序发送几个消息。
WM_INITMENU wparam:主菜单句柄 lparam:0
WM_MENUSELECT 当使用者在菜单项中移动鼠标,程序会收到WM_MENUSELECT消息
LOWORD(wparam):被选中项目 id或弹出式菜单句柄
HIWORD(wparam):选择旗标
lParam : 包含被选中项目的菜单句柄
WM_INITMENUPOPUP 当windows准备显示一个弹出式菜单时,他给窗口消息处理程序发送这个消息,
wParam:弹出式菜单句柄
LOWROD(lParam):弹出式菜单索引
HIWORD(lParam): 系统菜单为1,其余为0
WM_COMMAND 表示我们已经从菜单中选中了一个被启用的菜单项。
LOWORD(wParam):菜单id
/*******************************************************************/
几个函数
·CheckMenuItem( hMenu , iSelection , MF_UNCHECKED ); 用于取消或选定相应的项目
·EnableMenuItem( hMenu , IDM_MENU , MF_ENABLED); 用于设定菜单的有效状态
MF_ENABLED 此菜单可以使用
MF_DISABLED 菜单不可使用,但是不变灰
MF_GRAYED 菜单不可使用,同时变灰
·GetSubMenu( hMenu, iPosition ); 获得指定位置弹出式菜单的句柄
·iCount = GetMenuItemCount(hMenu); 获得菜单的元素的数目
·GetMenuItemID(hMenuPopup , iPosition); 获得弹出式菜单的ID
·DestoryMenu(hMenu); 销毁菜单句柄
/***********************************************************/
浮动弹出式菜单
当我们单击鼠标右键时,我们想使他弹出一个浮动菜单,我们可以这样做:
hMenu = LoadMenu(hInst, szAppName);
hSubMenu = GetSubMenu(hMenu, iIndex);
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
ClientToScreen(hwnd, &point);
TrackPopupMenu( hSubMenu , TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL);
其中GetSubMenu中的iIndex是我hMenu主菜单中第几个菜单句柄下标,0~n-1,一般来说是0。当获得鼠标的位置时,要通过ClientToScreen()将坐标转换为屏幕坐标。最后调用TrackPopupMenu使菜单显示。
TrackPopupMenu用于显示一个菜单项的某个元素Item。