刚学vc不久。
mfc dialog编程中,回车键会激活默认按钮的click事件。
我把默认按钮的default button属性去掉了,可是还是会激活该事件。因此要在文本框中输入回车,只能按ctrl+回车,
所以我想捕获用户的回车键,替换成ctrl+回车。网上找过一些资料,已经知道如果捕获键入了:
BOOL CCnTransDlgDlg::PreTranslateMessage(MSG* pMsg) 
{
  int nVirtKey;
  BYTE KeyState[256];
  if(pMsg->message==WM_KEYDOWN)
  {
    nVirtKey=int(pMsg->wParam);
    
    //捕获在文本框中的回车键入。
    CWnd* pcwnd=this->GetFocus();
    if ((pcwnd->GetDlgCtrlID()==IDC_EDIT_InputStr)&&(nVirtKey==VK_RETURN))
    {
      if (GetKeyState(VK_CONTROL)==1) 
      {    
        MessageBox(_T("要在此文本框中输入回车请按住Ctrl键再输入回车。"),_T("提示信息"));
        return TRUE;
      }
    }
  }
  return CDialog::PreTranslateMessage(pMsg);
}
尝试了以下两种方法想把MessageBox语句出转换用户输入: /*GetKeyboardState((PBYTE)KeyState);
        KeyState[VK_RCONTROL]=!KeyState[VK_RCONTROL];
        SetKeyboardState(KeyState);
        CDialog::PreTranslateMessage(pMsg);
        KeyState[VK_RCONTROL]=!KeyState[VK_RCONTROL];
        SetKeyboardState(KeyState);*/
以及/*keybd_event( VK_CONTROL,0,0,0 ); 
        CDialog::PreTranslateMessage(pMsg);
        keybd_event( VK_CONTROL,0,KEYEVENTF_KEYUP,0 ); */   好像都不见效果。不知哪位高人可不吝指教,谢谢。

解决方案 »

  1.   

    你可以屏蔽掉Dialog的Enter键啊。
    重载CYouDlg::OnOK();
    保证在其中不调用CDialog::OnOK();就行了。
    屏蔽掉Esc键:
    重载CYouDlg::OnCancel();
    保证在其中不调用CDialog::OnCancel();就行了。
      

  2.   

    Return键是可以屏蔽掉的,象楼上说的那样就可以了。
    不用那么麻烦去搞一个Ctrl+Return
      

  3.   

    可以到我的网站去看看,也许会对你有所帮助,VC在线(www.vczx.com)
      

  4.   

    查了些资料,我已经知道屏蔽掉回车。现在的问题是我在文本框中
    要输入回车键的时候,必须敲ctrl+回车才能输入一个回车。
    我想敲回车键就输入回车。
    谢谢大家。
      

  5.   

    不会,你用的是什么方法屏蔽掉回车的。如果是 ddszhan(高等数学)的方法应该不会啊。
      

  6.   

    把文本框的风格设为“多行”,好象还有“WANT”
      

  7.   

    我现在的做法是直接在CEDIT的焦点出插入\r\n.回复【icedot(小雨) 】,屏蔽按键的方法:重载PreTranslateMessage函数。BOOL CCnTransDlgDlg::PreTranslateMessage(MSG* pMsg) 
    {
      int nVirtKey;
      if (pMsg->message==WM_KEYDOWN)
      {
        CWnd* EditWnd=this->GetFocus();
        nVirtKey=int(pMsg->wParam);    if (nVirtKey==VK_RETURN)
        {
          if (EditWnd->GetDlgCtrlID()==IDC_EDIT_InputStr)
          {
            //if (GetKeyState(VK_CONTROL)==1)//回车
            int nStart,nEnd;
            m_CEditInput.GetSel(nStart,nEnd);
            m_CEditInput.SetSel(nStart,nEnd);
            m_CEditInput.ReplaceSel(_T("\r\n"));
            //MessageBox(_T("要在此文本框中输入回车请按住 Ctrl 键再输入回车。"),_T("提示信息"));
            return TRUE;
          }
          else
          {
            //不是在文本框里面的回车,屏蔽掉
            return TRUE;
          }
        }
        else if (nVirtKey==VK_ESCAPE) 
        { 
          // 屏蔽ESC,按ESC键不退出
          return TRUE;
        }
        else if ((GetKeyState(VK_CONTROL)<0)&&
          ((nVirtKey=='A')||(nVirtKey=='a'))&&
          (EditWnd->GetDlgCtrlID()==IDC_EDIT_InputStr))
        {
          //在文本框键入Ctrl+A
          m_CEditInput.SetSel(0,m_CEditInput.SendMessage(WM_GETTEXTLENGTH));
          return TRUE;
        }
      }
      return CDialog::PreTranslateMessage(pMsg);
    }
    还是希望有人能提供将用户输入的回车转换为CTRL+回车的方法。
    我尝试了以下两种方法都不见效: /*GetKeyboardState((PBYTE)KeyState);
            KeyState[VK_RCONTROL]=!KeyState[VK_RCONTROL];
            SetKeyboardState(KeyState);
            CDialog::PreTranslateMessage(pMsg);
            KeyState[VK_RCONTROL]=!KeyState[VK_RCONTROL];
            SetKeyboardState(KeyState);*/
    以及/*keybd_event( VK_CONTROL,0,0,0 ); 
            CDialog::PreTranslateMessage(pMsg);
            keybd_event( VK_CONTROL,0,KEYEVENTF_KEYUP,0 ); */