2017-10-18 85 views
2

的編輯控件內部鍵盤熱鍵我有這樣的代碼:檢測CComboBox

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

    bDealtWith = FALSE; 

    if (IsCTRLpressed() && 
     pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('I'))) 
    { 
     if (EncodeText(pMsg->hwnd, _T("i"))) 
     { 
      // Eat it. 
      bNoDispatch = TRUE; 
      bDealtWith = TRUE; 
     } 
    } 
    else if (IsCTRLpressed() && 
     pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('B'))) 
    { 
     if (EncodeText(pMsg->hwnd, _T("b"))) 
     { 
      // Eat it. 
      bNoDispatch = TRUE; 
      bDealtWith = TRUE; 
     } 
    } 

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

    return bNoDispatch; 
} 

本來,我對我的對話框3所CEdit控制。當你使用這個鍵時,按下它在編輯控件中的選擇上執行一個動作。

我將控件從CEdit更改爲CComboBox。它們是可編輯的類型。我調整了EncodeText以使用GetEditSelSetEditSel

現在只有問題是當我編輯組合框中的文本。我選擇了一些文本並按下CTRL + I,但沒有任何反應。我的對話框的PTM沒有被攔截。

視覺例

在這種CEdit控制,我可以選擇文本:

Select Text

然後我用熱鍵之一,例如:CTRL + B,它仍然有效:

Results for CEdit

但是,當我選擇在編輯CComboBox一些文本並使用相同的熱鍵:

Use hot key on CComboBox

在這種情況下,它不能正常工作。

我假設這是因爲技術上我是在組合的嵌入式「編輯」控件中。我現在如何檢測熱鍵現在我正在組合內使用選定的文本?

回答

0

我結束了創建一個新的類CEncodedCombBox,從CComboBox衍生,像這樣:

// EncodedComboBox.cpp : implementation file 
// 

#include "stdafx.h" 
#include "Meeting Schedule Assistant.h" 
#include "EncodedComboBox.h" 


// CEncodedComboBox 

IMPLEMENT_DYNAMIC(CEncodedComboBox, CComboBox) 

CEncodedComboBox::CEncodedComboBox() 
{ 

} 

CEncodedComboBox::~CEncodedComboBox() 
{ 
} 


BEGIN_MESSAGE_MAP(CEncodedComboBox, CComboBox) 
END_MESSAGE_MAP() 



// CEncodedComboBox message handlers 


BOOL CEncodedComboBox::PreTranslateMessage(MSG* pMsg) 
{ 
    BOOL bNoDispatch, bDealtWith; 
    DWORD dwSel = GetEditSel(); 
    CString strCode = _T(""), strText; 

    GetWindowText(strText); 

    bDealtWith = FALSE; 

    if (IsCTRLpressed() && 
     pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('I'))) 
    { 
     strCode = _T("i"); 

     bNoDispatch = TRUE; 
     bDealtWith = TRUE; 
    } 
    else if (IsCTRLpressed() && 
     pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('B'))) 
    { 
     strCode = _T("b"); 

     bNoDispatch = TRUE; 
     bDealtWith = TRUE; 
    } 

    if (bDealtWith) 
    { 
     CMeetingScheduleAssistantApp::EncodeText(strText, strCode, LOWORD(dwSel), HIWORD(dwSel)); 
     SetWindowText(strText); 
     SetEditSel(HIWORD(dwSel) + 7, HIWORD(dwSel) + 7); 
    } 

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

    return bNoDispatch; 
} 

正如你所看到的,它包括一個PreTranslateMessage和它的作品:

Hot keys now work

如果有一個更好的方法,那麼我歡迎你的評論或回答。

更新

我必須要測試的編輯控制手柄,而不是組合框手柄爲我自己CDialog工作:需要更多的

if (::GetParent(hWnd) == m_cbMaterialAssignment1.GetSafeHwnd()) 

沒有派生組合類。

+0

當這個工程。在新的PreTranslateMessage函數中設置斷點。當消息到達時繼續調試,並且新的PreTranslateMessage繼續路由......您應該最後進入對話框的PreTranslateMessage。當它工作時,它不能解釋爲什麼對話框中的PreTranslateMessage不起作用。 – xMRi

+0

@xMRi我無法繼續調試,因爲它表示找不到'wincore.cpp'。 –

+0

調試輸出中的消息?這並不重要。只要你有你的代碼的調試符號,你總是可以調試。這只是一個警告,你不能調試到Windows核心...調試是必不可少的... – xMRi

2

不確定我喜歡WM_KEYDOWN黑客。如果你有真正的熱鍵,我建議你正確處理:

BEGIN_MESSAGE_MAP(CEncodedCombBox, CCombBox) 
    ON_WM_HOTKEY() 
END_MESSAGE_MAP() 

void CEncodedCombBox::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2) 
{ 
    if (nHotKeyId == idForHotKey_I) 
     HandleCode(_T("i")); 
    else if (nHotKeyId == idForHotKey_B) 
     HandleCode(_T("b")); 
} 

void CEncodedCombBox::HandleCode(CString strCode) 
{ 
    DWORD dwSel = GetEditSel(); 

    CMeetingScheduleAssistantApp::EncodeText(strText, strCode, LOWORD(dwSel), HIWORD(dwSel)); 
    SetWindowText(strText); 
    SetEditSel(LOWORD(dwSel), HIWORD(dwSel) + 7); 
} 
+0

謝謝。有趣。但是我不明白我在這裏如何使用熱鍵方法,因爲這個動作必須在4個編輯/組合控件中的一個上執行。但是你已經向我介紹了一個我可以在其他地方使用的好概念。 –

+0

好的:有些問題:我必須使用0x虛擬鍵碼還是可以使用'_TINT(_T('X'))'。他們最終是否有相同的價值觀?更高效嗎?另外,對於密鑰ID值,從1開始可以嗎? –

+0

這些ID對於特定的窗口必須是唯一的。我相信你可以從1開始。使用字符的值可能不是很好(例如,如果你以後決定添加另一個'X'綁定的熱鍵,如Ctrl + Shift + X? – l33t