如何在基于对话框的程序中添加自己的加速键? 我试了一下,在基于视图的程序中,只要在iDR_MAINFRAME中自己添加一个accerlate项就可以用了但是在基于对话框的程序中本来是没有Accerlate这个资源的,自己insert一个,加入一项加速健,却不能用,郁闷。 那位大虾帮帮忙啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Q222829 HOWTO: Using Accelerator Keys Within a Modal Dialog Box http://support.microsoft.com?kbid=222829 在对话框头文件中添加一变量HACCEL m_hAcc;在CXXXXDlg::OnInitDialog中加入m_hAcc = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINACCELERATOR)); //MAINACCELERATOR为加速键资源ID在CXXXXDlg::PreTranslateMessage中加一行if (TranslateAccelerator(GetSafeHwnd(), m_hAcc, pMsg))return TRUE; 实现如下,请参照#define MOD_ALT 0x0001#define MOD_CONTROL 0x0002#define MOD_SHIFT 0x0004#define MOD_WIN 0x0008class CXXXDlg : public CDialog{public: int m_nIDHotKey;public: void YourHotKeyProc(); //... //{{AFX_MSG(CXXXDlg ) //... afx_msg LRESULT OnHotKey(WPARAM wp, LPARAM); //}}AFX_MSG}BEGIN_MESSAGE_MAP(CHzDecodingDlg, CDialog) //{{AFX_MSG_MAP(CHzDecodingDlg) //... ON_MESSAGE(WM_HOTKEY, OnHotKey) //}}AFX_MSG_MAPEND_MESSAGE_MAP()BOOL CXXXDlg ::OnInitDialog(){ //... m_nIDHotKey = GlobalAddAtom(TEXT("YourAtomValue")); RegisterHotKey(m_hWnd, m_nIDHotKey, MOD_WIN, 'S'); }LRESULT CXXXDlg ::OnHotKey(WPARAM wp, LPARAM){ if ((int)wp==m_nIDHotKey) { YourHotKeyProc(); } return 0;}void CXXXDlg ::YourHotKeyProc(){ //...} 方法一:http://support.microsoft.com/?kbid=2228291 插入一个新的Accelerator到资源里,把加速键和对应的响应控件(如一个按钮)关联2 在对话框头文件中声明: HACCEL m_hAccel;3 在对话框的构造函数里初始化m_hAccel m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));4 然后重载对话框的PreTranslateMessage函数,在BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) { if (m_hAccelTable) { if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg)) { return(TRUE); } } return CDialog::PreTranslateMessage(pMsg);}方法二:1 声明热键消息处理函数原型 在.h中消息映射声明处(AFX_mSG字样之后)加入如下语句: LRESULT OnHotKey(WPARAM wParam,LPARAM lParam); 2. 消息与相应处理函数相关联 在.Cpp中加入消息映射宏,使消息与相应处理函数发生关系, ON_MESSAGE(WM_HOTKEY,OnHotKey); 3. 为方便以后的操作 预先在类中创建一个响应WM_CREATE和WM_DESTROY消息的函数 OnCreate()与OnDestroy()的框架4.向系统登记热键 在OnCreate()函数中加入如下代码以向系统登记热键,本例子的热键设为 Ctrl+Shift+A. RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_SHIFT,'A'); RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_SHIFT,'a'); 5.处理热键 在消息处理函数OnHotKey()中对热键进行处理,并可加入用户希望运行的程序代码 LRESULT C****::OnHotKey(WPARAM wParam,LPARAM lParam) if(wParam==1001||wParam==1002) CWnd::SetForegroundWindow();//使得被激活窗口出现在前景 MessageBox("Hello!"); //用户可在此添加代码 return 0; 6.程序运行完毕后解除热键 在OnDestroy()中通过UnRegisterHotKey()解除热键登记,释放系统资源. UnRegisterHotKey(m_hWnd,1001); UnRegisterHotKey(m_hWnd,1002); 7.编译并运行程序 代码注入的三种方法 钩子(HOOK) 关于循环计时获取同一张网页的问题 如何让组合框显示水平滚动条? 路径“c:\program files\xxx”中到空格被截断 简单问题 急,在线等。 如何获得系统密码? dll 进程内组件中如何使用自定义的对话框? 如何实现获得客户区中某一区域在整个屏幕中的绝对坐标??? 如何在CFormView上面使用CSpinButtonCtrl 问一个关于做帮助文件的问题 是不是我的安装程序有问题? ATL控件与外面接口如何传递指针
http://support.microsoft.com?kbid=222829
在CXXXXDlg::OnInitDialog中加入
m_hAcc = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINACCELERATOR)); //MAINACCELERATOR为加速键资源ID
在CXXXXDlg::PreTranslateMessage中加一行
if (TranslateAccelerator(GetSafeHwnd(), m_hAcc, pMsg))return TRUE;
#define MOD_CONTROL 0x0002
#define MOD_SHIFT 0x0004
#define MOD_WIN 0x0008class CXXXDlg : public CDialog
{
public:
int m_nIDHotKey;
public:
void YourHotKeyProc(); //...
//{{AFX_MSG(CXXXDlg )
//...
afx_msg LRESULT OnHotKey(WPARAM wp, LPARAM);
//}}AFX_MSG}BEGIN_MESSAGE_MAP(CHzDecodingDlg, CDialog)
//{{AFX_MSG_MAP(CHzDecodingDlg)
//...
ON_MESSAGE(WM_HOTKEY, OnHotKey)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()BOOL CXXXDlg ::OnInitDialog()
{
//...
m_nIDHotKey = GlobalAddAtom(TEXT("YourAtomValue"));
RegisterHotKey(m_hWnd, m_nIDHotKey, MOD_WIN, 'S');
}
LRESULT CXXXDlg ::OnHotKey(WPARAM wp, LPARAM)
{
if ((int)wp==m_nIDHotKey)
{
YourHotKeyProc();
}
return 0;
}
void CXXXDlg ::YourHotKeyProc()
{
//...
}
http://support.microsoft.com/?kbid=222829
1 插入一个新的Accelerator到资源里,把加速键和对应的响应控件(如一个按钮)关联
2 在对话框头文件中声明:
HACCEL m_hAccel;
3 在对话框的构造函数里初始化m_hAccel
m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));
4 然后重载对话框的PreTranslateMessage函数,在
BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg)
{
if (m_hAccelTable)
{
if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg))
{
return(TRUE);
}
}
return CDialog::PreTranslateMessage(pMsg);
}
方法二:
1 声明热键消息处理函数原型
在.h中消息映射声明处(AFX_mSG字样之后)加入如下语句:
LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
2. 消息与相应处理函数相关联
在.Cpp中加入消息映射宏,使消息与相应处理函数发生关系,
ON_MESSAGE(WM_HOTKEY,OnHotKey);
3. 为方便以后的操作
预先在类中创建一个响应WM_CREATE和WM_DESTROY消息的函数
OnCreate()与OnDestroy()的框架
4.向系统登记热键
在OnCreate()函数中加入如下代码以向系统登记热键,本例子的热键设为
Ctrl+Shift+A.
RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_SHIFT,'A');
RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_SHIFT,'a');
5.处理热键
在消息处理函数OnHotKey()中对热键进行处理,并可加入用户希望运行的程序代码
LRESULT C****::OnHotKey(WPARAM wParam,LPARAM lParam)
if(wParam==1001||wParam==1002)
CWnd::SetForegroundWindow();//使得被激活窗口出现在前景
MessageBox("Hello!");
//用户可在此添加代码
return 0;
6.程序运行完毕后解除热键
在OnDestroy()中通过UnRegisterHotKey()解除热键登记,释放系统资源.
UnRegisterHotKey(m_hWnd,1001);
UnRegisterHotKey(m_hWnd,1002);
7.编译并运行程序