Peng Lv

毋意,毋必,毋固,毋我。 言必行,行必果。

导航

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。

posted on 2010-02-03 19:46  Lvpengms  阅读(303)  评论(0编辑  收藏  举报