2017-11-18 107 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)'是錯誤的。 –

相關問題