Pointer to a null-terminated character string that specifies the resource name of the class menu, as the name appears in the resource file. If you use an integer to identify the menu, use the MAKEINTRESOURCE macro. If this member is NULL, windows belonging to this class have no default menu.
================
也就是说,你需要用MAKEINTRESOURCE宏来转换IDR_TYPER,而不是直接强制转换(LPSTR)。
这样改:
MAKEINTRESOURCE(IDR_TYPER)
=========================
一、创建新工程二、编辑菜单资源
1、添加菜单按“Ctrl+R”,双击“Menu”图标
2、于菜单编辑器内编辑菜单
四、添加代码(红色部分)
void CCMenuView::OnUpdateShow(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
MessageBox(“右键d出菜单测试!“)
}
void CCMenuView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMenu menu
menu.LoadMenu(IDR_MENU1)
CMenu *pPopup=menu.GetSubMenu(0)
ClientToScreen(&point)
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
this)
CView::OnRButtonDown(nFlags, point)
}
五、编译
七、函数说明
CMenu::TrackPopupMenu函数声明
BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd*pWnd,LPCRECT LPrECT=0)
nFlags:d出菜单的位置
x:d出菜单的水平位置
y:d出菜单的垂直位置
pWnd:d出菜单的所有者
lpRect:一包含矩形坐标的RECT结构体指针。
功能:显示一d出菜单。函数调用成功,返回非零值;否则返回零。
在菜单触发事件时运行相关火焰效果函数,比如你已有CFire这个类,类中定义了相关的Fire方法,你就可以用CFire->Fire()的方式执行相应火焰效果函数。VC++中菜单事件使用方法如下:
菜单项属性说明:
ID 标识菜单的唯一常量。
Caption 菜单项标题,“&" 后面的字符为快捷键,在菜单项后的字符将加下划线。
Separator 水平线,其它属性无效。
Pop_up有子菜单
Grayed 无效,标题以灰色显示
Inactive 无效,标题正常显示
Checked 在标题前加一个对钩
break 为None时,使它和它的兄弟们一行或一列显示。
Help只对最上层菜单项有效,使它及后面的最上层菜单移到窗口的右上角。
Prompt 当鼠标指向它时的提示信息
多文档应用程序除了生成IDR_MAINFRAME外,还生成标识符为IDR_xxxxTYPE,其中xxxx为应用程序名。它们分别对应无文档和有文档时。
一个菜单id可以在多个类有响应函数,但只会有一个响应。
我实验得出的结果,CChildFrame,CCMenuApp,CCMenuDoc,CCMenuView,CMainFrame(我的应用程序名为CMenu)的响应顺序为:
在IDR_MAINFRAME中,CMainFrame,CCMenuApp其它三个不响应.
在IDR_XXXXTYPE 中,CCMenuView,CCMenuDoc,CChildFrame,CCMenuApp,CMainFrame.
ctrl+w打开ClassWizard,选好工程,类(最常选的是xxxView),在id中选择我们要修改的菜单项。
双击COMMAND(或UPDATE_COMMAND_UI)点确定就可以了。再在成员函数中双击我们刚刚加的函数,就可以编辑函数了。
当用户单击菜单时,我们刚刚编辑的函数会执行。
如果我们双击的是UPDATA_COMMAND_UI,则响应形式类似如下:
void ... OnUpdate...(CCmdUI * pCmdUI)
{
pCmdUI->SetCheck(true)//在菜单项前加一个对钩
pCmdUI->Enable(true)// 使菜单项能够使用
}
因为此函数往往影响到它的外形,故在它的“父亲”或“祖父”被选中时就会执行。
CWnd类中与菜单有关的几个函数。
SetMeun(CMenu *pMenu)
修改窗口的菜单,为NULL,则表示删除。
常用的还有
GetMenu()
GetSystemMenu()
CMenu的一些函数。
AppendMenu()函数指定的菜单最后附加一个新菜单项,同时可以指定菜单项的相关情况,它有两个语法。
nFlag指定状态,可以是以下四组之一或相组合而成,还可以与MF_POPUP组合表示添加的是d出式菜单。
MF_CHECKED,MF_CHECKED
MF_DISABLED,MF_ENABLED,MF_GRAYED
MF_STRING,MF_OWNERDRAW,MF_SEPARATOR,MF_BITMAP菜单项是字符串,自画型,分隔线,位图。
MF_MENUBARBREAK,MF_MENUBREAK
nIDNewItem 指定菜单项的id.
lpszNewItem指定菜单项的内容,与nFlag有关。为MF_OWNERDRAW时,该参数为数据指针,用来传送数据,系统在发送消息WM_MEASUREITEM和WM_DRAWITEM时将该数据存入参数
的(DRAWITEMSTRUCT结构)itemData域;nFlag为MF_STRING时该参数为菜单标题。
InsertMenu
nFlags指定菜单项位置和状态,状态选项参见AppendMenu()函数,位置选项为MF_BYCOMMAND,MF_BYPOSITION.
nPositin若为MF_BYCOMMAND,新菜单项插在指定菜单项之前;或为MF_BYPOSITION,该参数指定新菜单项的位置,为-1插到最后。
ModifyMenu()参数与InsertMenu类似。
DeleteMenu删除菜单项
RemoveMenu移去菜单项
设置和显示浮动菜单
BOOL TrackPopupMenu(UINT nFlags,int x,int y,
CWnd *pWnd,LPCRECT = NULL)
nFlag浮动式菜单坐标设定方式及鼠标 *** 作方式,有效值如下:
TPM_CENTERALIGN TPM_LEFTALIGN TPM_RIGHTALIGN
TPM_LEFTBUTTONTPM_RIGHTBUTTON
x,y浮动式菜单坐标
pWnd指定 *** 作菜单的窗口
lpRect指定鼠标 *** 作范围
在客户区单击左键就会d出快捷菜单,方法二需要在资源编辑器中编辑一个新菜单,方法三必须有主菜单。
方法一:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CMenu PopupMenu
PopupMenu.CreatePopupMenu()
PopupMenu.AppendMenu(MF_STRING,ID_FILE_NEW,"NEW..")
//...
ClientToScreen(&point)
PopupMenu.TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this)
CView::OnLButtonDown(nFlags, point)
}
方法二:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CMenu menu
menu.LoadMenu(IDR_DUMMY)
CMenu *pMenu=menu.GetSubMenu(0)
ASSERT(pMenu!=NULL)
ClientToScreen(&point)
pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this)
CView::OnLButtonDown(nFlags, point)
}
方法三:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd *pWnd=AfxGetApp()->GetMainWnd()
CMenu * pMenu=pWnd->GetMenu()
pMenu=pMenu->GetSubMenu(0)
ASSERT(pMenu!=NULL)
ClientToScreen(&point)
pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)