Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1032919
  • 博文数量: 177
  • 博客积分: 3629
  • 博客等级: 中校
  • 技术积分: 1839
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-23 21:21
文章分类

全部博文(177)

文章存档

2021年(1)

2020年(5)

2019年(4)

2018年(7)

2017年(1)

2016年(4)

2014年(1)

2013年(8)

2012年(10)

2011年(50)

2009年(12)

2008年(10)

2006年(56)

2005年(8)

分类: WINDOWS

2006-05-03 17:51:24

在WTL中处理消息由于全是映射,手动添加处颇多.随着类越来越多,会难以管理.无论如何消息流程是主线,了解了它就抓住了主线.
 
今天用到了WTL中的CMenu类.听说和MFC的差不多,不过MFC的没用过.
CMenu是对菜单相关API的简单封装.菜单是做为资源存在的.所以创建菜单是首要.另外显示菜单的API需要一窗口句柄.这个窗口接收菜单消息.
 
菜单创建可以由资源编辑器建立,然后由LoadMenu装入.
也可以手动AppendMenu(),InsertMenuItem,InsertMenu手动建立.
 
显示一右键菜单只需调用:TrackPopupMenuEx,原型如下:
BOOL TrackPopupMenuEx(      

    HMENU hmenu,     UINT fuFlags,     int x,     int y,     HWND hwnd,     LPTPMPARAMS lptpm );
注意hwnd是接收菜单消息的窗口句柄.所以在偶的CTreevView中可以收到菜单消息.这就和一般的  WM_COMMAND消息发送给父窗口 对应上了.
在用CreateWindowEx创建窗口时指定菜单也可以.这时在窗口过程中处理WM_COMMAND即可.
还有个
BOOL SetMenu(      

    HWND hWnd,     HMENU hMenu );
hMenu为NULL,可以清除一个窗口的菜单.如是一有效HMENU,与指定窗口关联新菜单.
还有个:IShellMenu::SetMenu原型如下:
HRESULT SetMenu(      
    HMENU hmenu,     HWND hwnd,     DWORD dwFlags );
这个函数的作用如下 :
This method appends a static menu to the menu band.
呵呵,这个band好象是Rebar里的band,还指定了static menu,是不是动态创建的不行,只能是DLL里的资源菜单?偶没用过.不敢多说,是个思路记在这儿.
 
下面是偶WTL用的菜单代码.很爽不是.为了以后添加菜单项方便,这里弄了个循环.
 
CMenu m_popMenu;
 
  //初始化菜单
  UINT   uFlags     =MF_STRING;
  const int  menuCount    =2;
  LPCTSTR   lpszNewItem[menuCount] ={"删除","创建新分组"};
  
  UINT_PTR  ID[menuCount]   ={ IDM_POP_DELITEM,IDM_POP_CREATEGROUP  };
  m_popMenu.CreatePopupMenu();
  int tmp=menuCount;
  while(--tmp>=0){  
   m_popMenu.AppendMenu(uFlags,ID[tmp],lpszNewItem[tmp]);
  }
阅读(3132) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~