您的位置:逆风者 VC++ 正文
 添加时间:2007-10-22 原文发表:2007-10-22 人气:326 来源:vckbase.com

作者:苍竹先生

下载源代码

  MFC中基于SDI和MDI的程序,默认情况下有快捷键资源,直接建立快捷键与消息的映射,就能实现程序的快捷键,而基于对话框的程序默认情况下没有快捷键资源,鉴于网友问到这个问题,下面我就分别用两种方法来实现。
逆风编程技术

  一是在PreTranslateMessage函数中,判断键盘的按键消息,比如快捷键是Ctrl + Q,我们就检测按键消息的Ctrl键和Q是否同时按下就可以了。

//用PreTranslateMessage的方法,判断Ctrl+Q是否按下,按下就执行快捷键对应的操作
if(pMsg->message == WM_KEYDOWN && pMsg->wParam == 'Q' && IsCTRLPressed())
{
	AfxMessageBox("Ctrl + Q 被按下");
	return TRUE;
}


  二是在PreTranslateMessage函数中,通过载入快捷键资源,并建立快捷键与消息的映射的方法来实现。先插入快捷键资源,通过下面的代码来载入该资源。
HACCEL hAcc;
hAcc = LoadAccelerators(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
  在PreTranslateMessage函数中进行快捷键的翻译,如果是WM_KEYDOWN和WM_SYSKEYDOWN消息就翻译,翻译成功返回TRUE。
BOOL CAccelerator2Dlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	int iResult;
	//针对WM_KEYDOWN消息和WM_SYSKEYDOWN消息,翻译快捷键
	switch(pMsg->message)
	{
	case WM_KEYDOWN:
	case WM_SYSKEYDOWN:
		iResult = TranslateAccelerator(m_hWnd,hAcc,pMsg);
		//翻译快捷键成功,返回TRUE
		if(iResult)
			return TRUE;
	}
	return CDialog::PreTranslateMessage(pMsg);
}
  下面处理快捷键对应的响应,在该实例中,快捷键表中建立了Ctrl +Q,Shift + Q,Alt + Q,Ctrl + Shift + Q,Ctrl + Alt + Q,Shift + Alt + Q,Ctrl + Shift + Alt + Q六个快捷键分别进行测试。
void CAccelerator2Dlg::OnCtrlQ() 
{
	// TODO: Add your control notification handler code here
	AfxMessageBox("你按下了定义的快捷键");	
}


  两种方法的比较:第一中方法显然比较直接,仅应用于快捷键比较少的程序。第二种方法比较实用。

  上述两种方法都在Windows XP和Visual C++6.0下调试成功。
相关文章

让你的软件界面更漂亮(五)
BMP图象解析
VC实用小知识总结 (二)
VC实用小知识总结 (一)
超强仿QQ自动伸缩窗口
WIN32程序挂钩SetLastError,输出错误描述到
Spy++原理初探
汉诺塔游戏的设计
关于控件注册和使用许可问题的解决办法
基于MFC对话框的NT服务程序框架
用递归的方法画分形图
利用IJG JPEG Library压缩图像为jpg格式
软件框架的利器、TangramMini组件应用教程六
让你的软件界面更漂亮(六)-- 仿QQ主界面之L
对OpenCV中的平面划分相关函数使用探索
探讨性能测试中的计时问题
用命令模式实现对象存储——对象与关系数据
DynamicLayout-VC 6.0对话框动态布局解决方
文件过滤系统驱动开发Filemon学习笔记
I2C通信

相关评论


本文章所属分类:首页 VC++

  热门关键字: