MFC制作右键弹出菜单(精)
- 格式:doc
- 大小:12.50 KB
- 文档页数:3
1、打开菜单模板编辑器
2、插入空白菜单项
按Insert键,如果已有则编辑之3、编辑菜单(标题)
注:&D表示助记键为D
4、编辑下拉菜单
注:...表示将弹出对话框
5、插入分隔符
将空白菜单项属性的分隔符勾上
6、定制级联菜单
将下拉菜单项的弹出属性选上
7、添加菜单项说明,内容将在状态栏显示
定制快捷键
1、添加快捷键提示文本
即在菜单项标题属性中添加类似“\tCtrl+K”的字符串,其中“Ctrl+K”就是快捷键。
2、添加快捷键资源
打开快捷键编辑器;
双击最后一行,编辑快捷键属性;
注:ID标签与菜单项ID对应。
定制右键(浮动)菜单
1、定制菜单模板
注:和普通菜单定制方法一样,“浮动”是要通过代码来实现的。
2、代码实现:为视图类添加右键事件响应函数OnRButton Up
为视图类添加成员变量
3、修改右键事件响应函数OnRButtonUp.
4、将右键菜单资源添加到主框架类,为该类添加事件响应函数。
注:视图类接管处理按键和鼠标消息,当右键事件触发视图类的响应函数时将显示右键菜单;
而主框架类接管菜单项命令消息,当点击某菜单项就触发主框架类,进而调用响应函数。
MFC实现动态菜单及响应函数MFC中利用CMenu类动态添加弹出菜单和响应函数步骤:1 声明一个菜单:CMenu menu;2 生成菜单对象:menu.CreatePopupMenu();3 给菜单添加上内容:menu.AppendMenu(MF_STRING,WM_CLEARHOSTS,"清除HOSTS");AppendMenu函数具体的意义可以查看MSDN,其中WM_CLEARHOSTS为自定义的一个消息,最后一个参数为菜单的text,点击这个菜单就可以调用WM_CLEARHOSTS消息的处理函数。
4 添加子弹出菜单:CMenu submenu;submenu.CreatePopupMenu();menu.AppendMenu(MF_POPUP,(UINT_PTR)(submenu.m_hM enu),"sub");5 设置当失去焦点时菜单自动消失SetForegroundWindow();6 设置菜单的位置:menu.TrackPopupMenu();以上各步连接起来就是一个完整的动态生成菜单的步骤,当动态生成的菜单很多且菜单又不固定的时候,预先为每个菜单都定义一个消息和消息处理函数是很麻烦且不现实的,现在介绍一种方法来动态响应动态生成的菜单。
其原理就是利用OnCommand函数。
首先,要为每一个动态生成的菜单指定一个ID,方式如下menu.AppendMenu(MF_STRING,ID,"yourMenuName");其中参数ID为一个唯一的整数,可以由你自己指定,当鼠标单击此菜单的时候,系统发送一个消息,此消息优先被OnCommand函数接收,OnCommand函数的原形为:BOOL OnCommand(WPARAM wParam, LPARAM lParam);假如你指定菜单的ID为10001,响应函数的具体写法为:BOOL OnCommand(WPARAM wParam, LPARAM lParam){int menuID = LOWORD(wParam);if(menuID > 10000){//添加你自己的处理代码}}如果是使用对话框的mfc,自己重载OnCommand函数即可做一个MFC程序的时候碰到一个需求。
MFC实现动态菜单及响应函数一、实现步骤1.调用AppendMenu函数在菜单栏添加菜单2.调用AppendMenu函数在菜单栏菜单项添加子菜单3.调用AppendMenu函数在菜单栏菜单项添加动态子菜单4.将菜单所属的窗口句柄传入OnInitMenu函数5.在OnInitMenu函数中清除原有的菜单6.在菜单窗口中添加新的菜单二、代码1.主程序代码```// MFC_DynamicMenu.cpp : 定义应用程序的入口点。
//#include "stdafx.h"#include "MFC_DynamicMenu.h"#define MAX_LOADSTRING 100//全局变量:HINSTANCE hInst; // 当前实例WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名//此代码模块中包含的函数的前向声明:ATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR lpCmdLine,_In_ int nCmdShow)UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);//TODO:在此处放置代码。
//初始化全局字符串LoadStringW(hInstance, IDS_APP_TITLE, szTitle,MAX_LOADSTRING);LoadStringW(hInstance, IDC_MFCCDYNAMICMENU, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);//执行应用程序初始化:if (!InitInstance (hInstance, nCmdShow))return FALSE;}HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MFCCDYNAMICMENU));MSG msg;//主消息循环:while (GetMessage(&msg, nullptr, 0, 0))if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam;//// 函数: MyRegisterClass////目标:注册窗口类。
在MFC 中,您可以通过自定义CListCtrl 的右键菜单来添加和删除按钮。
下面是一个简单的示例代码,演示如何在CListCtrl 中添加和删除按钮:void CMyListCtrl::OnContextMenu(CWnd* pWnd, CPoint point){// 获取鼠标位置int nItem = GetItemPos(point);if (nItem >= 0){// 获取选定项的数据项CString strItemData;GetItemData(nItem, MD_GETITEMDATA, (void*)&strItemData);// 检查选定项是否为空if (strItemData.IsEmpty()){// 添加一个删除按钮InsertImageList(nItem, IDB_DELETE, ILC_MARQUEE, 1, 1);// 添加一个编辑按钮InsertImageList(nItem, IDB_EDIT, ILC_MARQUEE, 1, 2);}else{// 删除一个编辑按钮RemoveImage(nItem, IDB_EDIT);// 删除一个删除按钮RemoveImage(nItem, IDB_DELETE);}}// 清除右键菜单项CListCtrlEx::OnContextMenu(pWnd, point);}在上面的示例代码中,我们首先获取选定项的数据项,然后根据数据项的值来决定是否添加删除按钮。
如果数据项为空,则在选定项中添加一个删除按钮和一个编辑按钮。
如果数据项不为空,则删除一个编辑按钮和一个删除按钮。
您可以将上面的代码放在您的CListCtrl 自定义视图类的OnContextMenu() 方法中,以便在右键菜单中显示删除和编辑按钮。
请注意,上面的示例代码仅适用于Windows Vista 及更高版本的操作系统。
如果您的应用程序需要支持较旧版本的Windows 操作系统,则需要使用不同的方法来添加和删除右键菜单项。
mfc 中nm_rclick的用法在MFC中,nm_rclick是指当用户右键点击某个控件时触发的消息。
nm_rclick 是通过向父窗口发送NM_RCLICK消息来实现的。
下面将详细介绍nm_rclick 的用法。
首先,需要了解一些基本概念。
在MFC中,控件是通过CWnd类的派生类来表示的,处理控件的消息一般是在父窗口中进行的。
通过向父窗口发送消息的方式来实现对控件的操作。
当用户在控件上右键点击时,控件会发送一条NM_RCLICK消息给父窗口。
父窗口可以通过处理该消息来执行相应的操作。
nm_rclick消息的处理方式有两种:消息映射和自定义处理。
一、消息映射的方式:在父窗口的消息映射表中添加对NM_RCLICK消息的映射。
示例如下:ON_NOTIFY(NM_RCLICK, IDC_LIST, OnRclickList)上述代码表示当ID为IDC_LIST的列表控件接收到NM_RCLICK消息时,调用OnRclickList函数进行处理。
在OnRclickList函数中可以对右击事件进行相应的处理,例如显示一个右键菜单或执行其他操作。
void CMyDialog::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) {处理右键点击事件TODO: 添加代码*pResult = 0;}二、自定义消息处理的方式:在父窗口中重载PreTranslateMessage函数,在该函数中判断是否接收到了NM_RCLICK消息,并进行相应的处理。
示例如下:BOOL CMyDialog::PreTranslateMessage(MSG* pMsg){if (pMsg->message == WM_RBUTTONDOWN){HWND hWnd = ::GetForegroundWindow();CWnd* pWnd = CWnd::FromHandle(hWnd);if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_LIST){处理右键点击事件TODO: 添加代码return TRUE; 拦截消息}}return CDialog::PreTranslateMessage(pMsg);}上述代码中,首先判断当前接收消息的窗口是否为打开的对话框,并且判断窗口ID是否为IDC_LIST,表示列表控件。
在一个对话框中点按一个按钮弹出另外一个对话框。
弹出的对话框可以是模态和非模态两种,简单点讲,模态对话框就是在弹出的对话框没有关闭之前,是不能操作父对话框的。
非模态可以。
这里介绍建立模态对话框。
在建立的时候可以有两种形式,一种是直接新建,一种是将已有的对话框整合添加进来。
(我是在WinCE平台下。
也是类似MFC的)第一种方式:新建弹窗操作步骤首先按步骤建立一个简单的对话框,并添加按钮。
然后点击Dialog添加资源选择Dialog 新建此时会出现新建好的对话框,右击选择属性可以修改名称。
设计新建的对话框在对话框上右击选择添加类填写类名称,点击完成此时在解决方案资源管理器视图中就会有新建的类,源文件及头文件将这个头文件包含到主对话框的头文件中。
然后就是调用关系的产生,双击主窗口在中的按钮,添加相应的处理函数此时调试运行,点“刀”按钮,就会弹出设计好的刀的对话框。
当然,刀对话框中的设计就是走原来熟悉的路了。
另外一个键“剑” 也是同样的步骤。
这样弹出的对话框有个问题,就是感觉弹出的对话框缩放了,字体变小了。
在对话框上右击选择属性就可以看见设置字体的选项了,修改字体即可。
下来介绍第二种方式,添加现有的窗口。
第一步:同样按部就班的建立好基本工程。
编译一下(F7)第二步:拷贝文件首先在当前工程目录下新建一个文件夹用来存放原有工程源码需要拷贝下面选中的这几个文件。
拷贝到新建的这个文件夹下。
由于现有工程中有resource.h文件,所以需要提前改一下名称,相应的WifiConfig.rc文件中有调用到这个文件,所以也要修改。
用记事本打开.rc文件,将#include “Resource.h” 改为#include “Resource_2.h”(如果是准备新建文件夹来组织代码的话就可以不用改。
就像下面这样,其实可以不用改)将这几个文件拷贝到新建的文件夹下。
还需要将原有工程res目录下的图标拷贝到现在工程的res目录下第三步:添加文件到工程首先是资源文件添加现有项,找到WiFI2Uart目录下的.rc文件。
修改文件的鼠标右键弹出菜单打开HKEY_CLASSES_ROOT\ \shellex\ContextMenuHandlers分支。
该分支下有主键Winzip 笔者的电脑中装有Winzip ,删去后即可发现原来文件的弹出菜单上的AddtoZip不见了。
当要在弹出菜单中添加一些可执行文件时(以notepad为例),可进行如下操作:在HKEY_CLASSES_ROOT\ \shell下新建一个名为“XXX” XXX即是显示于弹出菜单中的文字,这里假设用“用笔记本打开”代替 的主键(需要注意的是如果在HKEY_CLASSES_ROOT\ 下没有shell,则需要新建shell主键)。
再在XXX下新建名为“Command”的主键,修改其默认的键值为“C \Windows\Notepad.exe%1”(%1表示该文件不带参数,而只运行笔记本程序)即可。
再添加新的菜单项重复上面的步骤。
扩展鼠标右键功能增加“在新窗口中打开”的功能,打开HKEY_LOCAL_MACHINE\Software\CLASS-ES\Directory\Shell,添加一个新的主键,命名为“Openwindows”,并且设定键值为“在新窗口中打开”,然后在Openwindows下新建一个主键,命名为“Command”,键值栏内填入“explorer.exe%1”。
在右键菜单中添加“清空A盘”命令打开HKEY_CLASSES_ROOT\Drive\sh-ell,添加一个新的主键,命名为“EmptyA”,并且设定键值为“清空A盘”,然后在EmptyA下新建立一个主键,命名为“Command”,键值栏内填入“Deltree.exe/yA ”。
增加个MS-DOS方式打开HKEY_LOCAL_MACHINE\Softw-are\CLASSES\Directory\shell,添加一个新的主键,命名为“MS-DOSPrompt”,并且设定键值为“MS-DOSPrompt”,然后在MS-DOSPrompt下新建一个主键,命名为“Command”,键值栏内填入“C \Command.com”。
MFC 单文档中动态添加菜单项和响应菜单事件新建一个单文档程序在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU) 在Resource.h中增加一个ID_NEWMENU宏#define ID_NEWMENU WM_USER+101操作工具栏和状态栏使用GetDescendantWindow函数获取工具栏和状态栏的指针为ID_HIDE添加消息映射,编辑代码如下static bool m_Hide=false;m_Hide=!m_Hide;//获取工具栏指针CWnd* pWndToolBar=(CWnd*)GetDescendantWindow(AFX_IDW_TOOLBAR);//获取状态栏指针CWnd* pWndStatusBar=(CWnd*)GetDescendantWindow(AFX_IDW_STATUS_BAR);CMenu* pMenu=GetMenu();CMenu* pSubMenu=pMenu->GetSubMenu(2);if(m_Hide){pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"显示工具栏");if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("隐藏工具栏");if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_HIDE);}else{pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"隐藏工具栏");if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("显示工具栏");if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_SHOW);}动态添加子菜单为ID_NEWMENU增加消息映射,编辑代码如下static UINT m_NewMenu=ID_NEWMENU+1;//获取菜单CMenu* pMenu=GetMenu();//获取索引为2的菜单项,即第3列菜单CMenu* pSubMenu=pMenu->GetSubMenu(2);char buffer[1];itoa(m_NewMenu-ID_NEWMENU,buffer,10);if(m_NewMenu<=ID_NEWMENU+5){pSubMenu->AppendMenu(MF_SEPARATOR); //分隔线pSubMenu->AppendMenu(MF_STRING | MF_ENABLED,m_NewMenu++,CString("新的菜单")+buffer);}//如果m_bAutoMenuEnable为true,则会依次检查View、Document、Frame的//消息映射表是否有这个弹出菜单中每个菜单项的处理函数,澳门新濠天地官网 如果没有就会把那一项改为灰的m_bAutoMenuEnable=false;添加OnCommand的消息映射用来响应添加的子菜单项,代码如下UINT uMsg=LOWORD(wParam);for(UINT i=ID_NEWMENU+1;i<=ID_NEWMENU+5;i++)if(uMsg==i){char buffer[1];itoa(i-ID_NEWMENU,buffer,10);MessageBox(CString("新的菜单") + buffer);}右键菜单在View类中添加OnRButtonDown的消息映射,代码如下CMenu pPopMenu;pPopMenu.CreatePopupMenu();if(pPopMenu==NULL);pPopMenu.AppendMenu(MF_STRING,ID_NEWMENU+6,"右键菜单");this->ClientToScreen(&point);pPopMenu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);在View类中添加OnCommand的消息映射用来响应右键菜单的事件UINT uMsg=LOWORD(wParam);if(uMsg==ID_NEWMENU+6)MessageBox(CString("右键菜单"));。
MFC工具栏ToolBar按钮添加下拉菜单(转)2010-07-04 11:001.在MainFrm.cpp的int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数末尾添加如下代码://为画图工具栏的按钮添加下拉菜单m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARRO WS);//取值TBSTYLE_EX_DRAWDDARROWS,可以为某一个按钮添加下拉按钮。
DWORD dwStyle =m_wndToolBar.GetButtonStyle(m_mandToIndex(ID_DRAW_LINE ));dwStyle |= TBSTYLE_DROPDOWN; //其中ID_DRAW_LINE是你要添加下拉菜单的按钮的IDm_wndToolBar.SetButtonStyle(m_mandToIndex(ID_DRAW_LINE ),dwStyle);2.新建你要在点击按钮ID_DRAW_LINE出现的下拉菜单,即在工程的Resourceview选择目录树的条目点击右键,插入新的Resouse:Menu,在这里我新建的Menu它的ID是IDR_POPUP_LINE,如下图所示:3.在CMainFrame类的消息映射中(即MainFrm.cpp )加入下拉箭头的TBN_DROPDOWN消息映射:ON_NOTIFY(TBN_DROPDOWN,AFX_IDW_TOOLBAR,OnToolbarDropDown)如下:BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_NOTIFY(TBN_DROPDOWN,AFX_IDW_TOOLBAR,OnToolbarDropDo wn)//此行即为新增的ON_NOTIFY消息映射//}}AFX_MSG_MAPEND_MESSAGE_MAP()4.在MainFrame.h头文件中加入消息处理函数的声明:afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);如下:// Generated message map functionsprotected://{{AFX_MSG(CMainFrame)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);//}}AFX_MSGDECLARE_MESSAGE_MAP()5.在MainFrame.cpp文件中加入TBN_DROPDOWN消息处理的实现代码:void CMainFrame::OnToolbarDropDown(NMTOOLBAR *pnmtb, LRESULT *plr){CWnd *pWnd;UINT nID;switch(pnmtb->iItem){case ID_DRAW_LINE: //ID_DRAW_LINE即是你要添加下拉菜单的ToolBar按钮的IDpWnd = &m_wndToolBar;nID = IDR_POPUP_LINE;//IDR_POPUP_LINE就是上面新制作的菜单ID,当然,如果你要添加多个下拉菜单,只要多加几个case就好了break;default:return;}CMenu menu;menu.LoadMenu(nID);CMenu* pPopup = menu.GetSubMenu(0);ASSERT(pPopup);CRect rc;pWnd->SendMessage(TB_GETRECT,pnmtb->iItem,(LPARAM)&r c);pWnd->ClientToScreen(&rc);pPopup->TrackPopupMenu(TPM_LEFTALIGN |TPM_LEFTBUTTON | TPM_VERTICAL,rc.left,rc.bottom,this,&rc);}运行后如图:。
1、打开菜单模板编辑器
2、插入空白菜单项
按Insert键,如果已有则编辑之3、编辑菜单(标题)
注:&D表示助记键为D
4、编辑下拉菜单
注:...表示将弹出对话框
5、插入分隔符
将空白菜单项属性的分隔符勾上
6、定制级联菜单
将下拉菜单项的弹出属性选上
7、添加菜单项说明,内容将在状态栏显示
定制快捷键
1、添加快捷键提示文本
即在菜单项标题属性中添加类似“\tCtrl+K”的字符串,其中“Ctrl+K”就是快捷键。
2、添加快捷键资源
打开快捷键编辑器;
双击最后一行,编辑快捷键属性;
注:ID标签与菜单项ID对应。
定制右键(浮动)菜单
1、定制菜单模板
注:和普通菜单定制方法一样,“浮动”是要通过代码来实现的。
2、代码实现:为视图类添加右键事件响应函数OnRButton Up
为视图类添加成员变量
3、修改右键事件响应函数OnRButtonUp.
4、将右键菜单资源添加到主框架类,为该类添加事件响应函数。
注:视图类接管处理按键和鼠标消息,当右键事件触发视图类的响应函数时将显示右键菜单;
而主框架类接管菜单项命令消息,当点击某菜单项就触发主框架类,进而调用响应函数。
MFC点击按钮弹出菜单CMenu menu,*pMenu;menu.LoadMenu(IDR_MENU_MANAGE);CRect pt;GetDlgItem(IDC_BUTTON)->GetWindowRect(&pt);pMenu = menu.GetSubMenu(0);pMenu->TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this); TrackPopupMenu();函数功能:该函数在指定位置显示快捷菜单,并跟踪菜单项的选择。
快捷菜单可出现在屏幕上的任何位置。
函数原型:BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, int nReserved, HWND hWnd, CONST RECT* prcRect); CheckMenuItem();函数功能:该函数取得与指定菜单项相联系的菜单标志。
如果该菜单项打开了一个子菜单,该函数也返回子菜单里的菜单项数。
函数原型:DWORD CheckMenuItem(HMENU hmenu, UINT uIDCheckItem, UINT uCheck);参数:hmenu:含有其菜单项的标志将被提取得的菜单的句柄。
uIDCheckItem:指定要修改的菜单项。
uCheck:表示标记的状态。
此参数可取下列值之一:MF_BYCOMMAND:表示参数uId给出菜单项的标识符。
如果MF_BYCOMMAND和MF_BYPOSITION都没被指定,则MF_BYCOMMAND是缺省值。
MF_BYPOSITION:表示参数uId给出菜单项相对于零的位置。
返回值:如果指定的项不存在,返回值是OXFFFFFFFF;如果菜单项打开了一个子菜单,则返回值的低位含有与菜单相联系的菜单标志,高位含有子菜单的项数。
否则,返回值是莱单标志的掩码(布尔OR)。
cmfcpopupmenu的用法cmfcpopupmenu的用法:cmfcpopupmenu是一个用于创建自定义弹出菜单的类,该类是MFC(Microsoft Foundation Class)中的一部分。
它可以让开发者在他们的应用程序中添加自定义的右键菜单。
要使用cmfcpopupmenu类,首先需要在项目中包含afxpopupmenumanager.h头文件,并链接到afxpopupmenumanager.lib库。
然后,可以通过以下步骤来创建一个弹出菜单:1. 创建一个cmfcpopupmenu对象:```cppCMFCPopupMenu menu;```2. 使用cmfcpopupmenu的Create方法创建菜单:```cppmenu.Create(this, x, y, pParentWnd, FALSE);```这里的x和y是菜单的位置,pParentWnd是弹出菜单的父窗口,FALSE表示菜单并不是一个菜单栏。
3. 使用cmfcpopupmenu的AppendMenu或InsertMenu方法添加菜单项:```cppmenu.AppendMenu(MF_STRING, ID_MENUITEM1, _T("Menu Item 1"));menu.AppendMenu(MF_STRING, ID_MENUITEM2, _T("Menu Item 2"));```这里的ID_MENUITEM1和ID_MENUITEM2是菜单项的ID,_T("Menu Item 1")和_T("Menu Item 2")是菜单项的显示文本。
4. 可以使用cmfcpopupmenu的TrackPopupMenu方法显示菜单:```cppmenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, pParentWnd);```这里的TPM_LEFTALIGN表示菜单将左对齐显示,TPM_RIGHTBUTTON表示在鼠标右键按下时显示菜单。
VC MFC菜单栏(CMenu)控件 (2011-07-02 12:49)分类:C++菜单栏在对话框窗口里显示菜单栏像工具栏一样,菜单栏在按件面板里没有对应的选项,但有一个菜单控件类CMenu,所以如果想要在对话框里显示菜单栏,就得像工具栏那样,到ResourceView选项卡里新建一个菜单栏资源,步骤跟新建工具栏资源一样,只是资源类型是:Menu,菜单资源设计如下图:如果想改菜单项文本内容的话,方法是右击要更改的菜单项,选择属性,接着会弹出这样一个对话框:上面那个ID项就是该菜单项对应的ID号了,添加菜单项单击消息处理函数时会用到,而标明项里的内容就是菜单项要显示的文本了。
这里还得注意一下“弹出”这个选项,勾上这个选项表明对应的菜单项还有下级菜单,如:上面“转到”这个菜单项具有弹出属性,有下级菜单设计好了菜单资源,接着我们就来在对话框显示菜单栏吧,方法是进入对话框编辑区,右击对话框界面,选择属性,然后在菜单项里选择菜单资源ID号,回车,编译,运行,效果如下图:当然还有第二种在对话框显示菜单的方法:调用SetMenu函数把菜单跟对话框关联起来,函数第一个参数是窗口句柄,第二个参数是菜单句柄。
在OnInitDialog函数里添加如下语句:CMenu menu;//定义一个菜单类变量menu.LoadMenu(IDR_MENU1);//装载IDR_MENU1菜单资源SetMenu(&menu);//和当前窗口关联起来menu.Detach();//分离如果要处理菜单项单击消息的话,方法跟处理工具栏项单击消息一样,进入类向导,找到对应的菜单项ID,为它添加COMMAND消息处理函数。
设置菜单左边显示位图和背景位图CMenu类里要了解的函数SetMenuItemBitmaps//设置菜单项左边的位图函数定义:BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );nPostion指明具体要设置的菜单项,可以是菜单项索引,菜单项ID,具体由nFlags参数指明,为MF_BYPOSITION,则以菜单项索引指明,为MF_BYCOMMAND则第一个参数nPosition是菜单项ID号。
mfc 教程MFC(Microsoft Foundation Classes)是一种用于开发Microsoft Windows应用程序的C++库。
它提供了一组类和函数,用于处理窗口、对话框、控件、消息传递等常见的Windows编程任务。
下面是一个简单的MFC教程,介绍如何创建一个基本的窗口应用程序。
首先,打开Visual Studio并创建一个新的MFC应用程序项目。
选择MFC Application(对话框)模板,并为项目命名。
项目创建后,你会看到一个默认的对话框。
我们需要对其进行一些修改。
打开资源视图,找到IDD_DIALOG1对话框资源。
双击它,会弹出一个对话框设计器。
在对话框设计器中,你可以添加控件并调整它们的位置和大小。
我们先添加一个按钮控件。
在工具箱中选择按钮工具,然后在对话框上绘制一个按钮。
接下来,需要为按钮添加一个响应函数。
首先,在类视图中找到对话框类(通常命名为CMainDlg)。
右键单击类,选择“添加->消息处理程序”菜单。
在弹出的对话框中,选择按钮的点击事件(一般是BN_CLICKED)。
点击“确定”后,会自动生成一个响应函数。
在响应函数中,你可以编写你想要执行的代码。
例如,你可以在点击按钮时显示一个消息框。
使用AfxMessageBox函数可以很方便地实现这个功能。
完成了对话框的设计和按钮的添加后,可以进行编译和运行了。
编译后,点击运行按钮,一个窗口应用程序将会弹出。
当你点击按钮时,会显示一个消息框。
这只是MFC的入门教程,介绍了如何创建一个简单的窗口应用程序并添加一个按钮。
MFC还提供了更多功能和控件,可以用于开发更复杂和功能丰富的应用程序。
你可以继续学习MFC的其他教程,深入了解这个强大的框架的更多特性和用法。
MFC基于对话框——右键弹出菜单,并响应函数1、新建一个菜单资源,比如把菜单的ID号为IDR_MENU1。
2、在ClassWizard中void CArcSoft_EffectDlg::OnRButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCMenu menu; //定义下面要用到的cmenu对象menu.LoadMenu(IDR_MENU1); //装载自定义的右键菜单CMenu *pContextMenu=menu.GetSubMenu(0); //获取第一个弹出菜单,所以第一个菜单必须有子菜单CPoint point1;//定义一个用于确定光标位置的位置GetCursorPos(&point1);//获取当前光标的位置,以便使得菜单可以跟随光标pContextMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RI GHTBUTTON,point1.x,point1.y,AfxGetMainWnd()); //在指定位置显示弹出菜单CDialog::OnRButtonDown(nFlags, point1);}这时,当右键点击对话框,就可以将菜单调出来了,但如何响应,菜单项呢?请继续看:3、在资源视图中右键单击菜单项,建立类向导(ClassWizard),此时会弹出一个对话框,点击第二个,加入到已存在的类,按确定。
4、在资源视图中为菜单中的每一项建立类向导,并添加Command响应函数,然后在这个函数中加入语句就可以啦。
ON_COMMAND(ID_COPY, OnCopy)//加Command响应函数,自动出现的灰色语句void CArcSoft_EffectDlg::OnCopy(){// TODO: Add your command handler code hereMessageBox("复制成功!");}。
对于系统菜单,创建起来比较简单,直接使用资源编辑器就能生成菜单,再通过ClassWizard创建菜单命令函数。
在我的资源中上传了一个工程,实现了一个右键弹出贴图菜单。
结合这个工程,介绍动态创建菜单、创建弹出式菜单和重绘菜单。
首先介绍基础知识:编辑本段一、CMenu类的成员函数:1. CreateMenu()和CreatePopupMenu(),这两个函数用来创建一个菜单实例,CreateMenu()创建的是普通的菜单实例,如果想创建弹出式菜单,就要用CreatePopupMenu()函数。
2. AppendMenu()向菜单中添加一个子项,这个函数有两个主要的参数。
第一个UINT nFlags,这个参数表明了该子项的属性特征,可以这样说,这个参数规定了菜单的样式和功能。
后面会详细讲这个参数所能使用的值。
第二个参数UINT_PTR nIDNewItem,根据nFlags使用不同的设置,该参数将标明菜单的资源ID或在这个菜单中的索引号。
第三个参数可以省略,如果不省略,可以传入一个字符串,这个字符串将显示在菜单中(因为我准备用突破表示菜单项,所以我的工程中省略了这个参数)。
3. DrawItem(),这是一个虚函数,如果菜单设置成可以自绘类型,则这个函数将在生成菜单、弹出菜单、选中菜单、点击菜单等时由系统框架调用。
因此,这个函数是一个很有用的函数,它可以帮你绘制出各种样式的菜单。
4. MeasureItem()也是一个虚函数,当菜单被创建的时候由系统框架调用。
这个函数用来设置菜单的大小。
编辑本段二、nFlags说明:只有当nFlags设置成MF_OWNERDRAW的时候,系统框架才会重绘菜单。
MF_CHECKED:命令旁显示默认复选标志MF_UNCHECKED:清除命令旁的复选标志MF_DISABLED:禁止此菜单命令,但是不变灰显示MF_ENABLED:允许此菜单命令,恢复到正常状态MF_GRAYED:禁止此菜单命令,变灰显示MF_MENUBARBREAK:对于静态菜单,放到新行;对于弹出菜单,放到新栏中,栏间有分隔线MF_MENUBREAK:对于静态菜单,放到新行;对于弹出菜单,放到新栏,栏间无分隔线MF_OWNERDRAW:指定该命令是自画式菜单命令MF_POPUP:指定该菜单命令有一个关联的弹出式菜单MF_SEPARATOR:画一条水平分隔线,只用于弹出式菜单MF_STRING:指定此菜单命令是一个字符串CMenu类从CObject类派生而来。
MFC制作右键弹出菜单2010年08月06日 20:14转载自 mopishhare最终编辑ttcc2009一、在资源编辑器中建立一个菜单资源
新建一个菜单资源,比如把菜单的ID号为IDC_POPMENU。
此菜单有一项两层,即有一个可弹出的菜单项,而此菜单项的弹出内容即为将要建立的弹出式菜单的内容。
至于每一个菜单项的消息映射,与一般的菜单相同。
二、使用CMenu类对象
CMenu类的成员函数较多,但建立弹出式菜单只需用到其中几个成员函数。
1、LoadMenu函数
功能:从应用程序的可执行文件中加载菜单资源
原型:BOOL LoadMenu(UINT nIDResource;
其中nIDResource是菜单资源的ID号,这里用的是刚建立的IDC_POPMENU。
2、GetSubMenu函数
功能:此函数用于得到子菜单的指针。
原型:CMenu* GetSubMenu(int nPosconst;
nPos为层数,0为第一层子菜单……以此类推。
由于我们需要的是“可弹出项”的第一层子菜单,因此用GetSubMenu(0来得到第一层子菜单的类指针。
3、TrackPopupMenu函数
功能:在指定位置显示弹出菜单,并跟踪所选择的项
原型:BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect=NULL;
其中:
nFlags为屏幕坐标属性和鼠标坐标属性
屏幕坐标属性:
TPM_CENTERALIGN 横向将菜单以x居中
TPM_LEFTALIGN 横向将菜单以x左对齐
TPM_RIGHTALIGN 横向将菜单以x右对齐
鼠标按键属性(只在响应WM_CONTEXTMENU消息时有效:
TPM_LEFTBUTTON 连续按? 右键不会连续弹出菜单,鼠标右键不可用于选定菜单项 TPM_RIGHTBUTTON 连续按鼠标右键会连续弹出菜单,鼠标右键可用于选定菜单项
x,y均为屏幕坐标
lpRect 菜单所占的区域。
如果为NULL,当用户在菜单以外的区域按鼠标键时,菜单会消失
三、具体实现方法
用ClassWizard中的“Add Windows Message Handler”功能添加对
NM_RCLICKT消息的响应函数,函数中代码如下,注释很详细,在vc6+win2000环境下调试成功:
void CMyView::OnRclick(NMHDR* pNMHDR,LRESULT* pResult
{
CMenu menu,*pSubMenu;//定义下面要用到的cmenu对象
menu.LoadMenu(IDC_POPMENU;//装载自定义的右键菜单
pSubMenu=menu.GetSubMenu(0;//获取第一个弹出菜单,所以第一个菜单必须有子菜单
CPoint oPoint;//定义一个用于确定光标位置的位置
GetCursorPos(&oPoint;//获取当前光标的位置,以便使得菜单可以跟随光标
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,this; //在指定位置显示弹出菜单
}。