孙鑫VC++深入详解:Lesson6 Part5--- 给自建的动态子菜单配置COMMAN消息响应函数

CleanMyMacX4.12.1Crack版本频繁弹密码 菜单浮窗无法显示显示空白解决办法 阅读详情


在MainFrm.cpp文件中的

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)  中创建好子菜单:

	CMenu menu;
	menu.CreatePopupMenu(); //初始化对象menu --- 创建一个空的弹出菜单
	GetMenu()->InsertMenu(2,MF_BYPOSITION|MF_POPUP,(UINT)menu.m_hMenu,"InsertMenu");
	menu.AppendMenu(MF_STRING,110,"Hack"); //menu对象已经赋予了一个菜单资源,可用其成员函数操作菜单
	menu.AppendMenu(MF_STRING,ID_MENUITEM_CRACK,"Crack"); //menu.AppendMenu(MF_STRING,111,"Crack");
	menu.AppendMenu(MF_STRING,111,"Link");
	menu.Detach(); //把菜单资源与局部对象menu脱离,以免menu析构时,清除菜单.

//--

子菜单创建OK后,都是灰色的,不能响应任何消息.

----怎么为Crack这个子菜单项添加COMMAND消息响应函数?

 (1) 先把它Crack的ID数字111用一个宏字ID_MENUITEM_CRACK,定义在资源类头文件resource.h中.       

      动态子菜单没有资源类文件(*.rc),它是运行时创建的.    已有的资源类文件Menu2.rc是静态资源.

    (Menu2.rc包含了该Menu2项目的所有资源:Accelerator,Dialog,Icon,Menu,String,Toolbar,Version )

//--- 

 (2) 在MainFrm.h中先申明OnCrack()消息响应函数原型:

     格式就照着MFC生成的OnCreate()的格式来,就是前面加个 afx_msg 修饰符

       afx_msg void OnCrack();

//---


(3) 在MainFrm.cpp中实现OnCrack()函数, 分2步骤

       step1:添加映射宏

        step2:添加 void CMainFrame::OnCrack(){ }

       先要增加消息响应宏,在BEGIN_MESSAGE_MAP 与END_MESSAGE_MAP()之间

       格式就是 ON_COMMAND(参数1,参数2)  

       参数1:就是子菜单项的ID,

       参数2:消息函数名

      注意末尾不要有分号

      ON_COMMAND(ID_MENUITEM_CRACK,OnCrack)

//---

      最后实现这个函数:

// 实现子菜单Crack的消息响应函数
void CMainFrame::OnCrack()
{
	MessageBox("CMainFrame::OnCrack()");

}

编译运行后, Crack菜单项就是可以影响COMMAND命令消息了:

//---

//---   



//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//实际编程中可以参考静态子菜单项的COMMAND消息响应函数的添加过程

(1)MainFrm.h头文件中的消息响应函数原型的申明格式

(2)MainFrm.cpp中映射宏的申明格式

(3)消息响应函数void CMainFrame::OnEditCut() { }的实现.

// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "Menu2.h"

#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_EDIT_CUT, OnEditCut) //实际编程中可以参考这个格式来编写动态菜单项的映射红
	//}}AFX_MSG_MAP

	//为OnCrack消息函数添加映射宏
		ON_COMMAND(ID_MENUITEM_CRACK,OnCrack)  //就是把宏与函数关联起来. 

END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar); 

//--- 对动态创建的菜单的菜单项进行COMMAND命令响应?
	/*
	    以子菜单为例:
		 (1) 先把它Crack的ID数字111用一个宏字ID_MENUITEM_CRACK,定义在资源类头文件resource.h中
		 (2) 在MainFrm.h头文件中申明消息函数原型:  afx_msg void OnCrack();
		 (3) 在MainFrm.cpp中实现OnCrack()函数: 
		        先定义映射宏: ON_COMMAND(ID_MENUITEM_CRACK,OnCrack) 
				再在下面实现函数 void CMainFrame::OnCrack(){}
	 */
	CMenu menu;
	menu.CreatePopupMenu(); //初始化对象menu --- 创建一个空的弹出菜单
	GetMenu()->InsertMenu(2,MF_BYPOSITION|MF_POPUP,(UINT)menu.m_hMenu,"InsertMenu");
	menu.AppendMenu(MF_STRING,110,"Hack"); //menu对象已经赋予了一个菜单资源,可用其成员函数操作菜单
	menu.AppendMenu(MF_STRING,ID_MENUITEM_CRACK,"Crack"); //menu.AppendMenu(MF_STRING,111,"Crack");
	menu.AppendMenu(MF_STRING,112,"Link");
	menu.Detach(); //把菜单资源与局部对象menu脱离,以免menu析构时,清除菜单.	

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers

// 实现子菜单Crack的消息响应函数
void CMainFrame::OnCrack()
{
	MessageBox("CMainFrame::OnCrack()");
}

//实际编程中可以参考静态子菜单项的COMMAND消息响应函数 添加过程
void CMainFrame::OnEditCut() 
{
	// TODO: Add your command handler code here
    MessageBox("参考 OnEditCut()");	
}

//----------

  


   



孙鑫VC++深入详解:Lesson6 Part4 ---CMenu 类的应用:添加菜单项AppendMenu,插入菜单项InsertMenu,删除菜单DeleteMenu CMenu 类的应用 添加菜单项AppendMenu,插入菜单项InsertMenu,删除菜单DeleteMenu // //------ 追加菜单,在已菜单后面追加一个菜单 用函数CMenu::AppendMenu  CMenu::AppendMenu  BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lps 阅读详情

相关推荐

孙鑫VC++深入详解:Lesson6 Part2 -- MFC菜单更新机制 用该机制实现 Enable or Disable MenuItem

MFC菜单命令更新机制---用该机制实现 Enable or Disable  MenuItem 方法: 1)用资源中的菜单项"剪切"的ClassWizard添加一个UPDATE_COMMAND_UI消息响应函数     void CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI)     同时发现MFC在MainFrm.cpp的消息映射代码处添加

-----------------------------不要在跟自己无关的事情上浪费时间 5385

孙鑫VC++深入详解:Lesson6 Part6--- 电话本示例程序 动态添加菜单 框架类窗口截获命令消息

// --- //-- 一. 电话本设计思路: a. 在Veiw类中用 OnChar()响应客户区的输入 如 "Weixin 2666777",用空格隔开名称与电话 b. 收到回车键时把每行输入保存到m_strLine,和m_strArray数组中,m_strArray要定义成public,因为MainFrame中要用 c. 用"Weixin"创建动态菜单. d. 响应菜单COMM

-----------------------------不要在跟自己无关的事情上浪费时间 2949

孙鑫VC++深入详解:Lesson5 Part4 屏幕字符串滚动输出,DrawText,SetTimer,WM_Timer消息

滚动字母,修改输出字幕颜色,定时器 在onCreate中添加一个定时器,即SetTimer(1,100,NULL) 再在类CDrawView中添加消息WM_TIMER的响应函数OnTimer 每间隔100毫秒被调用OnTime() 在OnTime()中用DrawText输出字符串,DrawText的输出宽度每次按照5像素宽度增加, 随着矩形宽度增加,那么显示出来的字符串就逐步增加,效

-----------------------------不要在跟自己无关的事情上浪费时间 3782

VC6动态创建控件并响应其消息(button/combo)

描述: 本文讲述了如何在VC6动态创建控件并响应其消息。  技术实现:  在基于对话框的程序里我们创建控件的方法大多是直接拉一个控件上去,然后利用ClassWizard给控件添加变量及进行消息映射等。但在有些时候(如单文档或多文档程序)我们就无法直接拉这个控件,更无法用ClassWizard给他添加变量或进行消息映射了。 在本文中我们将以在对话框上动态添加一个按钮(CButton)与一个

avatar1912的专栏 1891

vc中动态菜单的实现

如何在VC中实现动态菜单 1.生成动态菜单 先定义一个菜单类对象:CMenu m_menuMain; 创建菜单:CreateMenu(CMenu *)创建一个普通菜单项 CreatePopupMenu()创建一个弹出式菜单项 2.使用菜单和应用程序挂钩 可使用SetMen

hithyy的专栏 2436

4_ 消息映射的实现

4.      消息映射的实现 1.      Windows消息概述 Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。1.      消息的分类 队列消息和非队列消息消息的发送途径上看,消息分两种:队列消息和非队列消息。队列消息送到系统消息队列,然后到线

刘磊的专栏 1440

非模态对话框注意点

用MFC创建非模态的对话框,和模态对话框创建方式不同,模态对话框用 dlg.DoModel()调用,而非模态对话框要用Create函数创建调用。 /*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/ CTestDlg* dlg = new CTestDlg; dlg->Create(IDD_TEST_DLG,NULL); dlg->ShowWindow(SW_SHOW); /

1万+

C++编程中的消息机制

消息映射: BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏定义这个消息映射的边界。 BEGIN_MESSAGE_MAP()宏有两个参数,第一个参数为定义消息映射的当前类名,第二个参数提供一个到该基类的连接,以查找消息处理程序。如果在定义消息映射的

timebomb的专栏 9970

孙鑫VC++深入详解:Lesson6 Part3 ---创建右键弹出菜单 TrackPopupMenu

1  -----增加右键弹出菜单方法一:      Project-->Add to Project-->Components and Controls -->Visual C++ Components    -->Pop-up menu 注意要加到View类中,不要加到Frame类中,因为Frmae被View覆盖,收不到鼠标消息. 2  -----增加右键弹出菜单方法二: 模仿一,在鼠

-----------------------------不要在跟自己无关的事情上浪费时间 9975

孙鑫VC++深入详解:Lesson5 Part2 路径层 CDC::BeginPath,BeginPath

5. 路径层 CDC::BeginPath,BeginPath    如何在Device Context中建立了一个路径层:    1)即调用BeginPath()    2)再调用其他的GDI绘图函数参数一个区域,如Rectangle生成一个矩形区域    3)调用EndPath()  产生闭环的路径层(即一个绘图区域)             pDC->BeginPath();

-----------------------------不要在跟自己无关的事情上浪费时间 4887

孙鑫VC++深入详解:Lesson6 Part1 -- CheckMenuItem,菜单项上添加位图,禁用菜单项,删除整个菜单,和加载菜单

//--   1.    在菜单上加个菜单TEST,然后在CMainFrame,CMenuApp,CMenuDoc,CMenuView这4个类中都添加响应WM_COMMAND命令消息的OnTest函数      测试表明     (1) 只会有一个OnTest能响应     (2)响应优先级 ,类的顺序是 CMenuView ---> CMenuDoc --->CMainFrame --

-----------------------------不要在跟自己无关的事情上浪费时间 4881

孙鑫VC++深入详解:Lesson8 Part3---如何让对话框捕获WM_KEYDOWN消息?

因为对话框程序中,某些特点的消息,如按键消息被Windows内部的对话框过程处理了,即基类完成了或者被发送给控件处理,所以在对话框类中就不能捕获到按键消息 解决办法:类中覆盖基类的特定消息过滤响应函数. 在MFC中,用虚函数ProcessMessageFilter()来过滤或者响应菜单和对话框的特定Windows消息. 在类中覆盖它,接管消息响应. 本例中,在CWinSun

-----------------------------不要在跟自己无关的事情上浪费时间 3205

孙鑫VC++深入详解:Lesson8 Part2---属性表单

1. Insert-->Dialog 插入IDD_LARGER....3个   Style:Child, Disable 2 分别给三个属性表单页Page1,Page2,Page3 用ClassWizard创建3个类,CPage1,CPage2,CPage3 3. 属性表单页CPropertyPage实际是要附加在CPropertySheet上才能显示    (1)CPropertyPage

-----------------------------不要在跟自己无关的事情上浪费时间 3168

孙鑫VC++深入详解:Lesson9 Part2---修改窗口光标,图表,背景

一. 窗口创建之前修改,用自定义的窗口类WNDCLASS wc 由于窗口的图标,光标,背景是在窗口类设计是指定的,因此要改的话, 就自己定义一个WNDCLASS wc,按照自己的需要填充wc,并注册RegisterClass(&wc) 1. 在MFC程序中,要修改出现窗口图表只能在框架类进行(CMainFrame) 2. 要修改背景和光标,应该在视类中进行,在框架类修改则看不见

-----------------------------不要在跟自己无关的事情上浪费时间 2554

孙鑫VC++深入详解:Lesson9 Part8---给程序加个启动画面

方法: VC菜单: Project--->Add to Project--->Components and Controls   选择VISUAL C++ Components 找到Splash screen 插入该组件后,工程中就增加了CSplashWnd 类,并在CMainFrame类的OnCreate函数中加了一条语句: CSplashWnd::ShowSplashScree

-----------------------------不要在跟自己无关的事情上浪费时间 2544

孙鑫VC++深入详解:Lesson9 Part7---在状态栏中显示鼠标的位置

1. 要在View中捕获WM_MOUSEMOVE消息,而不是在FRAME中,因为框架被VIEW类覆盖了. 2. 在CMainFrame中       public: CStatusBar  m_wndStatusBar; // 设置为public,一边view中访问 四种方式: void CStyleView::OnMouseMove(UINT nFlags, CPoint point)

-----------------------------不要在跟自己无关的事情上浪费时间 2523
上一篇: 孙鑫VC++深入详解:Lesson6 Part4 ---CMenu 类的应用:添加子菜单项AppendMenu,插入子菜单项InsertMenu,删除菜单DeleteMenu
下一篇: 孙鑫VC++深入详解:Lesson6 Part6--- 电话本示例程序 动态添加子菜单 框架类窗口截获命令消息
sergery
博客等级 码龄18年 113粉丝 136原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值