一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

HowTo:加入弹出式菜单

时间:2008-04-26 编辑:简简单单 来源:一聚教程网

 环境:
Visual C++ 6.0
WindowsXP
MFC
Dialog-Based Application

1.      声明一个CMenu类型的变量,如下:
CMenu popmenu;

2.      调用CMenu:: CreatePopupMenu()函数
popmenu.CreatePopupMenu();

3.      然后在resouce.h文件中,定义
#define ID_MENUITEM_HELLO                        32772
需要注意的是,最好将resouce.h文件中“Next default values for new objects”预定义block中的_APS_NEXT_COMMAND_VALUE的值修改为32772+1,即32773
#define _APS_NEXT_COMMAND_VALUE         32773
因为这可能会在使用Wizard自动生成代码是造成代号冲突。


4.      然后调用CMenu::AppendMenu(), Menu里加菜单项
popmenu.AppendMenu(MF_STRING, ID_MENUITEM_HELLO, "Hello world");
MF_STRING
是指菜单项用字符串表述,字符串内容为参数3
ID_MENUITEM_HELLO
是在resouce.h文件中定义的资源代码。
”Hello world!”
是将显示在菜单中的字符串。

5.      Dialog声明中加入对应的command handler
afx_msg void OnMenuitemHELLO();
implement中加入定义
void CXXXDlg::OnMenuitemHELLO()
{
SetWindowText("Hello world");
}

6.      因为我们实现用户右击鼠标弹出菜单,所以加入消息WM_ RBUTTONDOWNhandler,并在handler中调用CMenu:: TrackPopupMenu()函数:
void CXXXDlg::OnRButtonDown(UINT nFlags, CPoint point)
 
{
      CRect rect;
       GetWindowRect(&rect);
       popmenu.TrackPopupMenu(TPM_LEFTALIGN, point.x + rect.TopLeft().x,     point.y+rect.TopLeft().y, this/*, &rect*/);
CDialog::OnRButtonDown(nFlags, point);
}
这里值得注意的是,CWnd响应WM_RBUTTONDOWN所返回的的CPoint参数的xy对应的是其对应窗体的左上角为原点的坐标系,而TrackPopupMenu函数中x,y则对应的是整个屏幕左上角为原点的坐标系,因此这里需要转换。


7.      编译运行,当我们点选弹出菜单的“Hello world”项目后,对话框Caption栏被修改为“Hello world”。



完(workbook)