2017-11-18 182 views
0

我试图在note注释编辑控件中实现ctrl + A:m_editNoteTypeView这是类NoteDialog中cEdit的实例。 我的注释编辑像下面一样创建。PreTranslateMessage方法没有被调用,以便实现C + +中的Ctrl + A

NoteDialog::initDialog() 
{ 
    m_editNoteTypeView.CreateEx(::GetWindowLong(m_editSubject.m_hWnd, GWL_EXSTYLE), "edit", "", dwStyle | ES_READONLY, CRect(0, 0, 0, 0), this, 0); 
    m_editNoteTypeView.SetSel(0,-1,TRUE); 
} 

NoteDialog类是从名为Sdialog另一类最后从CDialog得出的。

我在SDialog定义PreTranslateMessage(MSG* pMsg)但控制不会的PreTranslateMessage,因此我的我无法核对的关键我当时正在按键板上在笔记上打字编辑。

bool Sdialog::PreTranslateMessage(MSG* pMsg) 
{ 
    if (GetFocus() == this) 
    { 
     if (pMsg->message == WM_CHAR) 
     { 
      if ((LOWORD(pMsg->wParam) & VK_CONTROL) == VK_CONTROL) 
      { 
       //SetSel(0, -1); 
      } 
     } 
    } 

    return CDialog::PreTranslateMessage(pMsg); 
} 
+0

如果编辑控件具有焦点时,会不会是处理按键?你尝试过'WM_KEYDOWN'吗? –

回答

1

return类型PreTranslateMessage应该是BOOL,否则你在MFC中得到一个编译错误。

if (pMsg->message == WM_CHAR) 
    if ((LOWORD(pMsg->wParam) & VK_CONTROL) == VK_CONTROL) 
     {...} 

WM_CHAR消息不wParam携带VK_CONTROL

要拦截Ctrl键 +

  • 等待WM_KEYDOWN消息
  • 检查
  • 检查Ctrl键键被按下

这样:

BOOL Sdialog::PreTranslateMessage(MSG* pMsg) 
{ 
    static int i = 0; 
    CString s; 

    if(pMsg->message == WM_KEYDOWN) 
    { 
     if(GetKeyState(VK_CONTROL) & 0x8000) 
     { 
      if(pMsg->wParam == 'A') 
      { 
       ... 
      } 
     } 
    } 

    return CDialog::PreTranslateMessage(pMsg); 
} 

此外,你可以添加这些辅助宏:

// Handy functions 
#define IsCTRLpressed() (GetKeyState(VK_CONTROL) & 0x8000) 
#define IsSHIFTpressed() (GetKeyState(VK_SHIFT) & 0x8000) 
//15 = sizeof(SHORT) * 8 - 1 
//0000 0000 0000 0001 = 1 
//1000 0000 0000 0000 = 15 << 1 

然后,它可以是简单的:

if (IsCTRLpressed() && 
    pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('A'))) 
{ 
    // Do whatever 

    // Eat it. 
    bNoDispatch = TRUE; 
    bDealtWith = TRUE; 
} 

请记住,你必须决定是否你仍然想运行基本实现。如果你自己实际处理这个消息并处理它,那么你应该返回TRUE。否则,让基类处理它。

例子:

BOOL Sdialog::PreTranslateMessage(MSG* pMsg) 
{ 
    BOOL bNoDispatch, bDealtWith; 

    bDealtWith = FALSE; 

    if (IsCTRLpressed() && 
     pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('A'))) 
    { 
     // Deal with it 

     // Eat it. 
     bNoDispatch = TRUE; 
     bDealtWith = TRUE; 
    } 

    if (!bDealtWith) 
     bNoDispatch = CDialogEx::PreTranslateMessage(pMsg); 

    return bNoDispatch; 
} 
+0

@AndrewTruckle我认为这应该是'0x8000 = 15 << 1',而不是'0x1E = 1 << 15' –

+0

代码是由Chris Maunder从CodeProject的CGridCtrl类数据文件中提取的。 –

+0

@AndrewTruckle即使在编辑中我也再次写错了。我打算编写'(GetKeyState(VK_CONTROL)&(15 << 1))',但这仍然是不必要的混淆,只需使用GetKeyState(VK_CONTROL)&0x8000'或GetKeyState(VK_CONTROL)<0'来检查高阶如文档中所述。 '1 <<(sizeof(SHORT)* 8 - 1)'是错误的。 –