大家好!
我在list control上面建立了一个右键菜单,使用的是静态的方法,就是在资源里建立一个菜单的资源,然后当点击右键的时候加载。
主要完成的功能就是选中list control中的若干行,点击右键菜单中的“复制”,把选中的内容复制到剪切板上。
我现在想加一个快捷键“Ctrl+C”,就是选中以后,按Ctrl+c可以实现和点“复制”一样的功能。
我VC刚起步,所以还请大家多帮忙。
谢谢。

解决方案 »

  1.   

    资源视图下Accelerator中的Ctrl+C和Ctrl+V快捷键
      

  2.   

    重载PreTranslateMessage
    在里面处理
    if(pMsg->message  == WM_KEYDOWN 
    && GetKeyState(VK_CONTROL) < 0
    &&(pMsg->wParam=='c' ||pMsg->wParam=='C'))   
    {
       DoMyCopy();
       return TRUE;
    }
      

  3.   

    在资源中加入加速列表HACCEL  m_hAccelTable;      //加速列表 定义为类成员m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME)); :OnInitDialog() 中加入BOOL CMainDlgDlg::PreTranslateMessage(MSG* pMsg)   <<重载消息
    {
    // TODO: Add your specialized code here and/or call the base class
    if (TranslateAcc(pMsg))  return TRUE;    return CDialog::PreTranslateMessage(pMsg);
    }
      

  4.   

    在ClassView中右击该类,选中Add Virtual Function... 
    添加虚函数重载PreTranslateMessage
      

  5.   

    BOOL CMSFLEXDlg::PreTranslateMessage(MSG* pMsg)   //该函数用来处理快捷键
    {
    // TODO: Add your specialized code here and/or call the base class
    if( pMsg->message == WM_KEYDOWN   )
    {    

    char nchar;
    nchar=pMsg->wParam;
    if(nchar=='V'&&(GetKeyState(VK_CONTROL)&0x80))          //按下Ctrl+V键
    {OnEditPaste();return 1;}
    else if(nchar=='X'&&(GetKeyState(VK_CONTROL)&0x80))     //按下Ctrl+X键
    {OnEditCut();return 1;}
     else if(nchar=='C'&&(GetKeyState(VK_CONTROL)&0x80))     //按下Ctrl+C键
    {OnEditCopy();return 1;}
            
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  6.   

    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.编译并运行程序
      

  7.   

    可以用加速键,也可以在PreTranslateMessage中处理。