2017-10-18 7 views
2

Ich habe diesen Code:innen bearbeiten Kontrolle 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; 
} 

Ursprünglich hatte ich 3 CEdit Kontrollen auf meinem Dialog. Wenn Sie diese Taste gedrückt haben, haben Sie eine Aktion wie oben für die Auswahl in den Bearbeitungssteuerelementen ausgeführt.

Ich habe die Steuerelemente von CEdit zu CComboBox geändert. Sie sind bearbeitbarer Typ. Ich habe EncodeText angepasst, um GetEditSel und SetEditSel zu verwenden.

Nur Problem ist jetzt, wenn ich Text in der Kombinationsfeld bearbeiten. Ich wähle einen Teil des Textes und drücke STRG + I und nichts passiert. Der PTM meines Dialogs wird nicht abgefangen.

Visuelles Beispiel

In dieser CEdit Kontrolle kann ich Text auswählen:

Select Text

Dann benutze ich eine des Hot-Keys, zB: CTRL + B und es funktioniert immer noch:

Results for CEdit

Aber, wenn ich wählen Sie einen Text in editierbaren CComboBox und verwenden die gleiche Hot-Key:

Use hot key on CComboBox

In diesem Fall ist es nicht funktioniert.

Ich habe angenommen, dass es ist, weil technisch ich in einem eingebetteten "Bearbeiten" Steuerelement der Combo bin. Wie erkenne ich die Hotkeys jetzt noch, wenn ich ausgewählten Text in einem Combo verwende?

Antwort

0

Ich landete Erstellen einer neuen Klasse CEncodedCombBox, von CComboBox abgeleitet, wie folgt aus:

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

Wie Sie sehen können, es enthält eine PreTranslateMessage und es funktioniert:

Hot keys now work

Wenn Es gibt einen besseren Weg als ich Ihre Kommentare oder Antworten begrüße.

aktualisiert

ich gegen den Bearbeitungssteuergriff zu prüfen hatte und nicht meinen eigenes Kombinationsfeld Griff für CDialog zu arbeiten:

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

Keine Klasse abgeleitete Combo mehr benötigt.

+0

Wenn das funktioniert. Legen Sie in Ihrer neuen PreTranslateMessage-Funktion einen Haltepunkt fest.Setzen Sie das Debugging fort, wenn eine Nachricht eintrifft und Ihre neue PreTranslateMessage weiter routet ... Sie sollten schließlich in die PreTranslateMessage des Dialogfelds wechseln. Wenn dies funktioniert, wird nicht erläutert, warum die PreTranslateMessage im Dialogfeld nicht funktioniert. – xMRi

+0

@xMRi Ich kann das Debuggen nicht fortsetzen, weil es besagt, dass 'wincore.cpp' nicht gefunden wurde. –

+0

Eine Nachricht in der Debug-Ausgabe? Das ist egal. Sie können immer debuggen, solange Sie Debug-Symbole für Ihren Code haben. Dies ist nur eine Warnung, dass Sie nicht in den Windows-Kern debuggen können ... Debugging ist wichtig ... – xMRi

2

Nicht sicher, ich mag die WM_KEYDOWN Hack. Wenn Sie echte Hotkeys haben, schlage ich vor, dass Sie sie richtig behandeln:

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

Danke. Interessant. Aber ich kann nicht sehen, wie ich hier einen Hotkey-Ansatz verwenden kann, da die Aktion auf einem von 4 Edit/Combo-Steuerelementen ausgeführt werden muss. Aber Sie haben mir ein gutes Konzept vorgestellt, das ich woanders verwenden könnte. –

+0

OK: Einige Fragen: Muss ich die 0x virtuellen Schlüsselcodes verwenden oder kann ich _TINT (_T ('X')) 'verwenden. Haben sie die gleichen Werte? Ist einer effizienter? Auch für die Schlüssel-ID-Werte, ist es Ok, nur bei 1 zu beginnen? –

+0

Die IDs müssen für ein bestimmtes Fenster eindeutig sein. Ich glaube, dass Sie bei 1 beginnen können. Die Verwendung des Charakters ist wahrscheinlich nicht so gut (zB was passiert, wenn Sie später einen weiteren 'X' gebundenen Hotkey wie Strg + Shift + X hinzufügen?) – l33t