孙鑫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的消息映射代码处添加了

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

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

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

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

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

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

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

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

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

avatar1912的专栏 1894

STM32F407 FSMC并口读取AD7606

先贴一下最终效果图.这个是AD7606并口读取数据一个周期后的数据结果. 原始波形用示波器看是很平滑的. AD7606不知为何就会出现干扰, 我猜测可能是数字信号干扰导致的. 因为干扰的波形很有规律. 这种现象基本上可以排除是程序问题. 应该是干扰或者数字信号干扰,或者是数字和模拟共地导致的.是一个宏,实际上是指向的一个内存地址, 这个内存地址是FSMC指定的地址. 使用FSMC接口, 可免于控制引脚, 直接读取某个地址即可, FSMC会自动产生操作时序. 具体请见FSMC相关知识.

走错路的程序员 5496

安鸾渗透测试平台-CTF系列-bash

工具Xshell 公网VPS接收反弹shell Xshell新手的下载及安装教程(超详细)_新手程序员攀爬之路的博客-优快云博客_xshell使用教程 Xshell连接后 #!/bin/bash cat ${0} while : do echo "$" read input output=`$input` 显示了一个文件,不过咋做呢?这里可能考察的是linux的语法 方法 输入bash 获得shell cat ${0} while : do .

AAAAAAAAAAAA66的博客 2689

vc中动态菜单的实现

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

hithyy的专栏 2438

卡门涡街可视化实战:从网格加密策略到动画后处理技巧

本文详细介绍了利用ANSYS Fluent进行卡门涡街可视化模拟的全流程,包括网格加密策略、求解器设置、涡街捕捉及动画后处理技巧。通过计算流体力学(CFD)方法,帮助工程师和研究人员高效模拟圆柱绕流现象,优化工程设计。

weixin_29309785的博客 414

4_ 消息映射的实现

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

刘磊的专栏 1444

RTDETR多模态融合实战:基于注意力机制的红外与可见光目标检测优化

本文深入探讨了基于RTDETR模型的红外与可见光多模态目标检测优化方案。针对复杂光照下的检测难题,文章提出并实战演示了如何利用注意力机制(如SimAM与交叉注意力)实现RGB与IR特征的智能动态融合,从而构建更鲁棒的“全天候”检测系统,有效提升安防、自动驾驶等场景在夜间及恶劣天气下的检测精度与可靠性。

weixin_29083373的博客 188

银河麒麟鲲鹏aarch64架构安装docker和K8s

鲲鹏云服务器上安装docker-云社区-华为云 (huaweicloud.com) 这里我下载的版本是docker-18.09.3.tag docker 安装包地址:https://download.docker.com/linux/static/stable 配置system服务 在github对应分支的contrib/init/systemd/ 下面,提供了对应的docker.service以及docker.socket文件,可以直接拷贝到本地文件使用: 对应链接:https://github.c

qq_50007696的博客 9056

非模态对话框注意点

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

1万+

STM32入门教程:WiFi通信

第四步:初始化串口 在生成的代码中,您可以找到一个名为 "USARTx_Init" 的函数,其中 "x" 是您选择的串口号。然后,我们使用 "AT+CIPSEND" 命令发送UDP数据,接收到服务器的回复,并在终端上显示收到的数据。在配置向导中,您可以选择启用USART串口功能,并根据您的硬件连接,将串口设置为与WiFi模块连接的串口。在上述代码中,我们使用了 "HAL_UART_Receive" 函数来接收串口数据,并使用 printf 来在终端上显示收到的数据。如果有任何问题,请随时向我提问。

2401_85258012的博客 1074

C++编程中的消息机制

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

timebomb的专栏 9973

手把手教你学Simulink——四开关 Buck‑Boost(FSBB)变换器的无缝模式切换仿真

本文详细介绍了四开关Buck-Boost(FSBB)变换器的Simulink仿真方法,重点解决模式切换时的直通风险和输出电压波动问题。通过统一电压PI控制、迟滞比较模式仲裁(Buck/Boost/Pass-Through)和200ns死区设计,实现了Vin从26V到22V变化时Vout稳定在12V±0.15V。关键步骤包括:搭建功率级电路、Stateflow模式判断、PI控制器输出占空比映射(Buck模式D≈Vo/Vin,Boost模式D≈1-Vo/Vin),以及带死区的PWM信号分配。仿真验证了切换过程中

MHD0815的博客 115

【32】软考软件设计师——算法题(一):分治法与动态规划深度精讲|下午第4题常考满分攻略

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第32篇,正式开启**模块四:应用技术(下午题)算法大题专项**,聚焦下午第4道高频必考大题核心两大算法:分治法与动态规划。全文超4000字深度拆解两大经典算法的底层核心思想、算法策略识别技巧、递归边界设计、状态转移方程推导,全覆盖代码填空高频考点、时间复杂度分析、经典题型解题套路;配套可直接默写的递归代码模板、DP状态设计范式、真题完整填空案例,彻底解决考生分不清分治与DP、递归边界写错、状态转移推不出、复杂度算不对四大核心痛点。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 637

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

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

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

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

孙鑫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

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

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

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

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

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

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

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

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

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

-----------------------------不要在跟自己无关的事情上浪费时间 2525
上一篇: 孙鑫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、付费专栏及课程。

余额充值