我在子对话框的一个按钮上设置caption为“&button1",为什么我使用“Alt+b”快捷键只能是第一次进入该子对话框时有效,而其他时候没效呢?(按了之后没有任何反映)。
我想要该按钮设置一个“F9”的快捷键,应该怎么做。
一定给分!!!

解决方案 »

  1.   

    重载对话框的PreTranslateMessge函数,在函数中如下处理
    BOOL CTeDlg::PreTranslateMessage(MSG* pMsg) 
    {
    if (pMsg->message == WM_KEYDOWN) {
    if (pMsg->wParam == VK_F9) {
    OnButton1();//调用button1的响应函数
    }
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  2.   


    1。定义全局变量:
    int id = ::GlobalAddAtom("#123");2。在对应窗体的消息循环中加入
    ON_MESSAGE(WM_HOTKEY,OnHotKey)
    3。定义处理函数
    void CMyDlg::OnHotkey(WPARAM wParam,LPARAM lParam)
    {
    ...
    }
    4。在初始化(如OnInitDialog等)中注册快捷键
    if(!::RegisterHotKey(GetSafeHwnd(),id,NULL,VK_F9))
       MessageBox("Hot Key regiser failed!");
    5。在退了程序之前注销快捷键
    ::UnregisterHotKey(GetSafeHwnd(),id);
    ::GlobalDeleteAtom( id );
    到此OK!
      

  3.   

    谢谢vcforever(霓裳羽衣),
    能解释一下“我在子对话框的一个按钮上设置caption为“&button1",为什么我使用“Alt+b”快捷键只能是第一次进入该子对话框时有效,而其他时候没效呢?(按了之后没有任何反映)。”的情况吗?
      

  4.   

    我~~~
    我是新手,
    为什么vcforever(霓裳羽衣)的办法那么简单,而vollin(林尚义) 的办法我基本看不懂~~
    两种办法的优缺点是什么?
      

  5.   

    >>>>>为什么我使用“Alt+b”快捷键只能是第一次进入该子对话框时有效,而其他时候没效呢?(按了之后没有任何反映)。按第一次有效是什么意思,弹出对话框之后,再关闭该弹出对话框,再按alt+b就不好使了吗?
      

  6.   

    不是这意思,而是在该子对话框开着的时候,只能使用一次alt+b,而用鼠标点击则没什么问题。如果关闭此对话框,然后再打开也还是只能使用一次。
      

  7.   

    你的子对话框打开的时候,主对话框就不是当前窗口了,就不会响应主对话框上的alt+b了!
      

  8.   

    我定义的是全局的快捷,也就是说不管你的焦点在什么地方,你按F9就会执行相应的函数。而
    vcforever(霓裳羽衣) 的方法只有在你所操作的窗口被激活的时候才能使用。
      

  9.   

    to:vcforever(霓裳羽衣)
    我说的 Alt+b 是在子窗口上的,而不是在主窗口上.
      

  10.   

    to:vcforever(霓裳羽衣)
    我说的 Alt+b 是在子窗口上的,而不是在主窗口上.
      

  11.   

    to:vcforever(霓裳羽衣) 忽然想起个问题,像您说的办法那样,对每一个按键都进行监视和判断,这种方法会造成程序的缓慢吗?(当然对这么小的一个程序是感觉不出来的 ,但是如果是在快捷键比较多,或是实时性要求比较严格的程序中是否会有很大的副作用呢?)
      

  12.   

    我试了一下,不会出现你所说的Alt_B只能使用一次的情况,你可以检查一下是不是因为你的处理函数使你的对话框失去了焦点,或者说激活了其它的窗体。