CreateMenu与CreatePopupMenu的区别
来源:互联网 发布:棉被可以抽真空吗 知乎 编辑:程序博客网 时间:2024/06/04 23:32
作者:陈飞
很多人都弄不清楚这CreateMenu与CreatePopupMenu的区别,继而发生很多莫名其妙的菜单行为。虽然极少数情况下,Windows能检测出来是你混淆了这两个函数,并且会在合适的时候把错误的函数调换过来,但我们不能总是指望Windows能够正确的判断出我们想要的操作,所以还是得弄清楚这两个函数到底有什么不同。CreateMenu是创建水平菜单,通常是放置在顶级窗口中,同时也是作为顶级菜单的,就像我们经常看到的“文件”,“编辑”等菜单。而CreatePopupMenu则是创建一个竖立的弹出菜单,通常被用来做另一个菜单的子菜单,或者右键菜单的顶级菜单。
菜单资源总是以菜单栏的形式出现,然而,当你想从资源中加载一个弹出菜单时,就应该将弹出菜单放到一个空的水平菜单栏中。下面通过这个函数来说明如何在水平菜单中内嵌一个弹出菜单。
void UsePopUpMenu(HWND hwnd, HINSTANCE hinst, LPCTSTR pszMenu){ HMENU hmenu = LoadMenu(hinst, pszMenu); if(hmenu) { HMENU hpopMenu = GetSubMenu(hmenu, 0); TrackPopupMenu(hpopMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam), 0, hwnd, NULL); }}
我们首先加载水平菜单,然后通过GetSubMenu函数提取到子菜单,然后使用TrackPopupMenu函数来显示这个弹出菜单(子菜单)。当不需要这个弹出菜单时,就用DestroyMenu函数来销毁水平菜单。
如果我们在每次需要显示弹出菜单的时候都要先加载水平菜单,然后在来提取并显示弹出菜单,这样以来步骤就显得很麻烦。而一种更为简单的办法就是:首先将弹出菜单从水平菜单中分离出来,然后销毁水平菜单并返回弹出菜单的句柄。
HMENU LoadPopupMenu(HINSTANCE hinst, LPCTSTR pszMenu){ HMENU hpopMenu = NULL; HMENU hmenu = LoadMenu(hinst, pszMenu); if(hmenu) { hpopMenu = GetSubMenu(hmenu, 0); RemoveMenu(hmenu, 0, MF_BYPOSITION); DestroyMenu(hmenu); } return hpopMenu;}void Function(HWND hwnd){ HMENU hpopMenu = LoadPopupMenu(hwnd, MAKEINTRESOURCE(1)); if(hpopMenu) { TrackPopupMenu(hpopMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam), 0, hwnd, NULL); DestroyMenu(hpopMenu); }}
这样一来,LoadPopupMenu可以看作是LoadMenu专门针对弹出菜单的版本。
- CreateMenu与CreatePopupMenu的区别
- CMenu::CreateMenu和CMenu::CreatePopupMenu之间的区别
- Windows菜单函数 - CreateMenu
- Windows菜单函数 - CreatePopupMenu
- &&与&,||与| 的区别
- &与&& ,|与||的区别
- -> 与 .的区别,&与*
- &与&& ,|与||的区别
- 注释区别???/与//的区别
- 与的区别与作用
- 与的区别与作用
- 与的区别与作用
- “//”与“\\”还有“/”与“\" 的区别
- java &与&& |与||的区别
- java &与&& |与||的区别
- 与的区别
- 与的区别
- 与 的区别
- log4j配置
- Android 优化Bitmap避免 OutOfMemoryError
- Lucene简介&Lucene示例
- IIS6.0中部署mvc
- ORACLE ACCOUNT LOCK REASON
- CreateMenu与CreatePopupMenu的区别
- GNU 工具 nm
- 全角转半角
- java 文件 读取目录下的所有文件(包括子目录)
- 使用Maven Archetype生成工程报错的解决
- Bbitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化方法
- MYSQL 开发实用知识集合
- Ext JS 版本在eclipse中使用spket插件设置自动提示的方法
- linux下mnt目录作用