VC MDI 子窗口或嵌入窗体获得焦点后,用Alt快捷键弹出主窗口菜单无响应以及

原创 2013年04月03日 14:54:29

对于在对话框程Dlg1序中嵌入对话框Dlg2的程序来说,定义好系统菜单热键,按键Alt+“菜单项(如F)”会弹出下拉菜单,但如果焦点放在Dlg2中时,再次按键Alt+F时,没有再次弹出下拉菜单(即热键无效),而快捷键(先按键按下Alt放开Alt,然后才按键F菜单有效)有效,其实原因在于焦点在Dlg2中了,按键Alt+F被Dlg2拦截没有发送到Dlg1中,因此只需在Dlg2中的PreTranslateMessage函数中拦截到Alt按键发送到或调用Dlg1中的PreTranslateMessage函数即可:

 

BOOL CDirectvDlg::PreTranslateMessage(MSG* pMsg)
{
	//////////////////////////主窗体的加速键弹出菜单/////////////////////////////////// 
	if (g_hAccel) 
	{
		// Tab里面的窗体点击之后,主窗体上的快捷键菜单就不能用了。		
		if (::TranslateAccelerator(this->GetParent()->GetParent()->m_hWnd, g_hAccel, pMsg)) 
		{
			return(TRUE);
		}
	}
	
	/////////////////////////主窗体的Alt+关键字弹出菜单//////////////////////////////


	// 处理Alt快捷键消息(主窗体菜单)
	// Alt消息需要用WM_SYSKEYDOWN进行判断,而WM_KEYDOWN 不判断是否有Alt按键
	if(pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN)
	{ 
	
		// 按下的是Alt键。VK_MENU就是Alt键,包含左右Alt键。
		// VK_LMENU是左边的Alt键,VK_RMENU是右边的Alt键。
		if (GetKeyState(VK_MENU) < 0)   // GetKeyState判断指定按键是否按下
		{
			// 程序的关键,在主窗体获得焦点后才能进行Menu处理
			this->GetParent()->GetParent()->SetFocus();				
			// 调用主窗体的PreTranslateMessage函数处理Alt快捷键消息
			return this->GetParent()->GetParent()->PreTranslateMessage(pMsg);	
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}




注: 1,Alt消息需要用WM_SYSKEYDOWN进行判断,而WM_KEYDOWN 不判断是否有Alt按键

     2,ALT键虚拟码有:VK_MENU,VK_LMENU,VK_RMENU(可根据需要自己拦截什么按键)


原文:http://blog.csdn.net/gxj1680/article/details/4061416

在此基础上做了修改。

版权声明:本文为博主原创文章,未经博主允许不得转载。

如何在MDI程序中把子窗体菜单合并到主窗体上

       这里只讲在MDI中,子菜单与父菜单合并的简单方法。 首先在MDI的主窗体中:1.  在主窗体构造函数中,添加如下代码,注意要在InitializeComponent调用之后,如:    ...
  • Knight94
  • Knight94
  • 2006年03月16日 16:00
  • 8544

C#MDI打开子窗体去掉自动生成的菜单栏

C#在DMI中打开子窗体时自动生成了菜单栏,怎么去掉菜单栏呢呢? 先在父窗体的加载事件中打开子窗体并使它最大化 private void MDIParent1_Load(object send...
  • shiyangkai
  • shiyangkai
  • 2017年05月09日 16:00
  • 900

VC在MDI方式下自由生成自定义的子窗口

本文介绍如何删除由MFC AppWinzard工程中产生的文档/视图结构,同时根据自己的实际需要创建子窗口界面。 Visual C++ 开发系统中应用程序向导的标准设置允许应用程序开发者方便简单地创...
  • vlily
  • vlily
  • 2012年03月22日 12:01
  • 4086

mdi子窗口在父窗口其他控件之上显示

做个东西用到mdi父子窗口,但是子窗口总是出现在父窗口其他控件的下面,不能显示出来。 通过引用win32 api可以解决。 1, 添加引用using System.Runtime.InteropS...
  • xiao_rory
  • xiao_rory
  • 2013年04月10日 17:27
  • 1888

MFC桌面右下角弹窗不抢当前窗口焦点同时不抢父窗口焦点

这段时间还是在新公司写小程序练手,我的水平是菜鸟中的菜鸟那种水平。     现在需要写的功能我简单说一下,类似腾讯QQ右下角弹出的新闻框那种,有两点细节我特别强调一下,仅有父窗口时不能抢父窗口焦点,父...
  • panshiqu
  • panshiqu
  • 2013年07月30日 16:08
  • 2831

弹出子窗口时设置主窗口不可点击

1.让QMainWindow窗口在QDialog窗口上面置顶层,默认是置QDialog窗口的底层 setWindowFlags(Qt::Dialog); 或者 子窗口名:userMa...
  • yhc166188
  • yhc166188
  • 2017年11月01日 09:43
  • 152

C#中MDI子窗体的创建方法

C#中去掉了窗体的MDIChild属性,如果要为MDI主窗体添加一个子窗体的话,现在要用代码来实现假如新建了一个名为NewForm的窗体来做为子窗体,那么要在显示这个窗体的地方加入如下代码:NewFo...
  • xiaoxinghappy
  • xiaoxinghappy
  • 2006年12月18日 06:49
  • 5774

MFC主窗口出现之前弹出子窗口与子窗口交互问题

本文介绍MFC窗口应用程序如何在主窗口出来之前弹出子窗口,并与主窗口进行数据交互。...
  • Chuxiangming1993
  • Chuxiangming1993
  • 2015年05月12日 18:30
  • 1466

MDI子窗体在父窗体中居中显示的设置

MDI子窗体在父窗体中居中显示的设置
  • furturerock
  • furturerock
  • 2010年06月22日 22:25
  • 3401

关于MFC将一个窗体嵌入另一个窗体的方法

 将一个窗体嵌入另一个窗体,也就是相当于把一个
  • zedyqer
  • zedyqer
  • 2014年08月27日 13:17
  • 2512
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC MDI 子窗口或嵌入窗体获得焦点后,用Alt快捷键弹出主窗口菜单无响应以及
举报原因:
原因补充:

(最多只允许输入30个字)