MFC快捷键功能使用总结

目录

使用方式1:系统全局快捷键。

使用方式2:软件全局快捷键。

使用方式3:软件指定界面快捷键。

示例工程下载


使用方式1:系统全局快捷键。

只要程序运行,全局快捷键可以在系统的任何地方被启用。

添加方式:

        (1)向系统注册快捷键:

	// 向系统注册热键
	if (!RegisterHotKey(m_hWnd, 1001, MOD_CONTROL | MOD_SHIFT, 'S'))
	{
		AfxMessageBox(_T("Ctrl + Shift + S 快捷键冲突!"));
	}
	if (!RegisterHotKey(m_hWnd, 1002, MOD_CONTROL | MOD_SHIFT, 'H'))
	{
		AfxMessageBox(_T("Ctrl + Shift + H 快捷键冲突!"));
	}

一般在使用窗口类的初始化函数中,或者OnCreate函数中

        (2)在窗口类中响应WM_HOTKEY消息

在窗口类的.h中添加下面2个函数中任意一个函数的申明

	afx_msg LRESULT OnHotKey(WPARAM wParam, LPARAM lParam);
	afx_msg void OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2);

在窗口类的BEGIN_MESSAGE_MAP/END_MESSAGE_MAP中间添加下面2个响应消息中的任一一个

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
	ON_WM_HOTKEY()//ON_WM_HOTKEY与WM_HOTKEY同时存在时,谁在BEGIN_MESSAGE_MAP的前面就响应谁
	ON_MESSAGE(WM_HOTKEY, OnHotKey)
END_MESSAGE_MAP()

在窗口类的.cpp中添加下面两个函数定义中的任意一个

LRESULT CMainFrame::OnHotKey(WPARAM wParam, LPARAM lParam)
 {
 	//处理热键
 	if (wParam == 1001)
 	{
		AfxMessageBox(L"xixixi");
 	}
 	else if(wParam == 1002)
	{
		AfxMessageBox(L"hhh");
 	}
 
 	return  0;
 }

void CMainFrame::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)//处理热键
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (nHotKeyId == 1001 && nKey1 == (MOD_CONTROL | MOD_SHIFT) && nKey2 == 'S')
	{
		ShowWindow(SW_SHOW);
		SetFocus();
	}
	else if (nHotKeyId == 1002 && nKey1 == (MOD_CONTROL | MOD_SHIFT) && nKey2 == 'H')
	{
		ShowWindow(SW_HIDE);
	}

	CMDIFrameWndEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}

注意:使用的函数定义、申明和消息映射必须是配套的。下面的结构就是一套的,其余的是另一套的。
 

afx_msg LRESULT OnHotKey(WPARAM wParam, LPARAM lParam);

ON_MESSAGE(WM_HOTKEY, OnHotKey)

LRESULT CMainFrame::OnHotKey(WPARAM wParam, LPARAM lParam)
 {
     //处理热键
     if (wParam == 1001)
     {
        AfxMessageBox(L"xixixi");
     }
     else if(wParam == 1002)
    {
        AfxMessageBox(L"hhh");
     }
 
     return  0;
 }

        (3)软件关闭后释放全局快捷键。一般在窗口的OnClose函数中使用

	// 程序运行完毕后解除热键
	UnregisterHotKey(m_hWnd, 1001);
	UnregisterHotKey(m_hWnd, 1002);

以上就是MFC的全局快捷键使用。

使用方式2:软件全局快捷键。

快捷键只能在当前软件中被响应,但是可以在任意窗口响应。(多见于单/多文档类型的软件)。注意:弹出模态对话框时快捷键消息会被阻断

添加方式:

        (1)添加菜单中新的菜单项

MFC快捷键功能使用总结_第1张图片

        (2) 添加菜单项的事件处理函数

MFC快捷键功能使用总结_第2张图片


afx_msg void OnShortCut3();//声明

ON_COMMAND(ID_SHORT_CUT3, &CShortcutTestDoc::OnShortCut3)//消息映射

void CShortcutTestDoc::OnShortCut3()//定义
{
	AfxMessageBox(L"ShortCut3 Ctrl + G");
	m_bShortCut3 = !m_bShortCut3;
}

             (3)在新建的MFC文档视图的工程中,一般程序会添加一个默认的快捷键资源IDR_MAINFRAME。

MFC快捷键功能使用总结_第3张图片

在IDR_MAINFRAME中添加一个新的快捷键,然后将快捷键的ID设置成ID_SHORT_CUT3即可。

MFC快捷键功能使用总结_第4张图片

使用方式3:软件指定界面快捷键。

快捷键只能在我们预设的窗口中被响应。当窗口失去焦点时,快捷键无法被响应。

添加方式:

                (1)添加新的菜单项和菜单项的事件处理函数。添加方式同使用方式2:软件全局快捷键。

                (2)在工程的资源窗口新建一个快捷键资源

MFC快捷键功能使用总结_第5张图片

然后在新的快捷键资源表中添加 快捷键

                (3)在预设窗口类中添加变量

HACCEL m_hAccel;

在窗口类的初始化函数里添加

m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1)); 

                (4)重写窗口类的 BOOL PreTranslateMessage(MSG* pMsg)虚函数,并在其中添加如下代码即可

BOOL CShortcutTestView::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	if (m_hAccel && ::TranslateAccelerator(GetSafeHwnd(), m_hAccel, pMsg))
		return TRUE;

	return CView::PreTranslateMessage(pMsg);
}

示例工程下载

下载地址:https://download.csdn.net/download/qq_23992597/85681721

你可能感兴趣的:(MFC学习,mfc,c++,快捷键)