Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9427647
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-04-23 22:07:28

MFC中基于对话框程序快捷键的实现

作者:



  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下调试成功。
阅读(1517) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~