2017-10-18 4 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に変更しました。それらは編集可能なタイプです。 EncodeTextGetEditSelSetEditSelに調整しました。

コンボボックスでテキストを編集しているときに問題が発生しました。テキストの一部を選択し、CTRL + Iを押しても何も起こりません。私のダイアログのPTMはインターセプトされていません。私はテキストを選択することができます。このCEdit制御で

ビジュアル例

Select Text

その後、私はホットキー、例えばのいずれかを使用します。CTRL + Bをし、それはまだ動作します:

Results for CEdit

しかし、私が編集可能なCComboBoxにいくつかのテキストを選択し、同じホットキーを使用する場合:それは働いていません。この場合

Use hot key on 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

もし

答えて

0

は、私はこのようなCComboBoxから派生した新しいクラスCEncodedCombBoxを、作成してしまいましたあなたのコメントや答えを歓迎します。

アップデート私は編集コントロールハンドルに対してテストしなければならなかった

なく動作するように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つの編集/コンボコントロールのうちの1つで実行する必要があるため、ここではどのようにホットキーアプローチを使用できるか分かりません。しかし、あなたは私を他の場所で使うことができる良いコンセプトに導入しました。 –

+0

OK:いくつかの質問:0x仮想キーコードを使用する必要がありますか、 '_TINT(_T( 'X'))'を使用できますか。彼らは同じ値に終わるのでしょうか?もう一つ効率的ですか?また、キーID値については、1から始めるだけですか? –

+0

IDは特定のウィンドウで一意でなければなりません。私はあなたが1で始めることができると信じています。キャラクターの価値を使用することは、おそらくそれほど良くありません(例えば、Ctrl + Shift + Xのような別の 'X'バウンドホットキーを後で追加することにした場合)? – l33t

関連する問題