2017-10-18 9 views
2

J'ai ce code:détecter raccourci clavier à l'intérieur modifier le contrôle de 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; 
} 

A l'origine, j'avais 3 CEdit contrôles sur ma boîte de dialogue. Lorsque vous avez utilisé cette touche, vous avez effectué une action comme ci-dessus sur la sélection dans les contrôles d'édition. J'ai changé les contrôles de CEdit en CComboBox. Ils sont type modifiable. J'ai ajusté EncodeText pour utiliser GetEditSel et SetEditSel.

Seul le problème est maintenant lorsque je suis en train de modifier du texte dans la zone de liste déroulante. Je sélectionne une partie du texte et appuie sur CTRL + I et rien ne se passe. Le PTM de ma boîte de dialogue n'est pas intercepté.

visuel Exemple

Dans ce contrôle CEdit je peux sélectionner le texte:

Select Text

Puis-je utiliser une des touches de raccourci, par exemple: CTRL + B et il fonctionne encore:

Results for CEdit

Mais, lorsque je sélectionne un texte dans le CComboBox et utiliser la même touche de raccourci modifiable:

Use hot key on CComboBox

Dans ce cas, il ne fonctionne pas. J'ai supposé que c'était parce que techniquement je suis dans un contrôle "Edit" intégré du combo. Comment puis-je encore détecter les raccourcis clavier maintenant que j'utilise du texte sélectionné dans un combo?

Répondre

0

Je fini par créer une nouvelle classe CEncodedCombBox, dérivé de CComboBox, comme ceci:

// 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; 
} 

Comme vous pouvez le voir, il comprend un PreTranslateMessage et cela fonctionne:

Hot keys now work

Si il y a un meilleur moyen alors j'accueille vos commentaires ou votre réponse.

Mise à jour

je devais tester contre la poignée de contrôle d'édition et de ne pas manipuler la boîte combo pour mon propre CDialog au travail:

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

classe combo Non dérivée nécessaire plus.

+0

Lorsque cela fonctionne. Définissez un point d'arrêt dans votre nouvelle fonction PreTranslateMessage.Poursuivez le débogage lorsqu'un message arrive et que votre nouveau PreTranslateMessage continue le routage ... Vous devez enfin entrer dans le PreTranslateMessage de la boîte de dialogue. Lorsque cela fonctionne, cela n'explique pas pourquoi le PreTranslateMessage dans la boîte de dialogue ne fonctionne pas. – xMRi

+0

@xMRi Je ne peux pas continuer le débogage car il dit que 'wincore.cpp' n'a pas été trouvé. –

+0

Un message dans la sortie de débogage? Cela n'a pas d'importance. Vous pouvez toujours déboguer, tant que vous avez des symboles de débogage pour votre code. Ceci est juste un avertissement, que vous ne pouvez pas déboguer dans le noyau de Windows ... Le débogage est essentiel ... – xMRi

2

Je ne suis pas sûr d'aimer le hack WM_KEYDOWN. Si vous avez de vraies touches de raccourci, je vous suggère de les manipuler correctement:

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

Merci. Intéressant. Mais je ne vois pas comment je peux utiliser une approche par raccourci ici car l'action doit être effectuée sur l'un des 4 contrôles edit/combo. Mais vous m'avez présenté un bon concept que je pourrais utiliser ailleurs. –

+0

OK: Quelques questions: Dois-je utiliser les codes de touches virtuelles 0x ou puis-je utiliser '_TINT (_T ('X'))'. Est-ce qu'ils finissent par les mêmes valeurs? Est-ce que c'est plus efficace? En outre, pour les valeurs d'ID de clé, est-il correct de commencer à 1? –

+0

Les ID doivent être uniques pour une fenêtre spécifique. Je crois que vous pouvez commencer à 1. L'utilisation de la valeur du caractère n'est probablement pas aussi bonne (par exemple si vous décidez d'ajouter une autre touche d'accès rapide 'X' comme Ctrl + Maj + X?) – l33t