在vc中怎么用菜单编辑器加菜单项

在vc中怎么用菜单编辑器加菜单项,第1张

菜单触发事件时运行相关火焰效果函数,比如你已有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)

}

楼上的这位的方法不可取,因为他每次都是将菜单更换,太消耗资源。

我还是真服你了,你有没有仔细看我写的代码呢??

我使用MessageBox("开始了"),只是说这个地方可以放一些代码,实现一些功能,难道你的菜单只是个摆设没有功能吗?

pCmdUI->SetText 来改变时没有任何问题的。一个菜单项 只有2种处理事件一种是COMMAND,一种是 UPDATE_COMMAND_UI,,,pCmdUI->SetText 就是UPDATE_COMMAND_UI事件里的。

GetDlgItem(ID_START)->SetWindowText("开始")这种方法直接导致程序崩溃,因为 菜单不是 窗口控件,CMenu不是继承CWnd 类。

至于你说的 参数 2 从“const char [9]”转换为“LPCTSTR”,是因为vs2010默认使用的是“使用Unicode字符集”,解决方法有2中,一种是 修改 项目属性,在 常规里,“使用多字节字符集”,另一种方法是 在字符串前面加个L 也就是 L“开始”,L“结束”,L“字符串”

以VC++6.0为例,其他版本处理一样。

新加一个菜单项 ID 为:ID_START 名称为 “开始”

假如 你想在 主框架里 实现 对这个菜单的响应(其他类里处理相同)

在 CMainFrame类里定义一个 bool变量 bb;

class CMainFrame : public CFrameWnd

{

protected: // create from serialization only

CMainFrame()

DECLARE_DYNCREATE(CMainFrame)

// Attributes

public:

bool bb//这里是新添加的。

// Operations

public:

。。。。。。。。

在CMainFrame 的构造函数里 初始化 bb

CMainFrame::CMainFrame()

{

// TODO: add member initialization code here

bb=1//初始化bb

}

然后处理这个菜单事件

按Ctrl+W 调出 MFC 类管理器

Class name 里选择 CMainFrame (根据需求更改的。)

Object IDs 里选择 ID_START

Messages 里 有两个事件 COMMAND 和 UPDATE_COMMAND_UI

分别 添加 为OnStart()和OnUpdateStart()

实现代码:

//下面是菜单的COMMAND事件。

void CMainFrame::OnStart()

{

// TODO: Add your command handler code here

if(bb)

{

MessageBox("开始了")

bb=0

}

else

{

MessageBox("结束了")

bb=1

}

}

//下面是菜单的 UPDATE_COMMAND_UI事件。

void CMainFrame::OnUpdateStart(CCmdUI* pCmdUI)

{

// TODO: Add your command update UI handler code here

if(bb)

pCmdUI->SetText("开始")

else

pCmdUI->SetText("结束")

//其实pCmdUI还有其他功能,如:Enable(),SetRadio(),SetCheck()

}

一、创建新工程

二、编辑菜单资源

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出菜单。函数调用成功,返回非零值;否则返回零。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11456829.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存