のエディットコントロール内でキーボードのホットキーを検出:もともとは、私はこのコードを持って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
をGetEditSel
とSetEditSel
に調整しました。
コンボボックスでテキストを編集しているときに問題が発生しました。テキストの一部を選択し、CTRL + Iを押しても何も起こりません。私のダイアログのPTMはインターセプトされていません。私はテキストを選択することができます。このCEdit
制御で
ビジュアル例
:
その後、私はホットキー、例えばのいずれかを使用します。CTRL + Bをし、それはまだ動作します:
しかし、私が編集可能な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
が含まれており、それが動作:
もし
これはいつ動作しますか?新しいPreTranslateMessage関数でブレークポイントを設定します。メッセージが到着し、新しいPreTranslateMessageがルーティングを続けるとデバッグを続行します。最後にダイアログのPreTranslateMessageに入る必要があります。これが機能するとき、なぜダイアログのPreTranslateMessageが機能しないのか説明しません。 – xMRi
@ xMRi 'wincore.cpp'が見つからないと言ってデバッグを続行できません。 –
デバッグ出力のメッセージ?それは問題ではない。コードのデバッグシンボルがある限り、いつでもデバッグできます。これはちょうど警告です、あなたはWindowsのコアにデバッグすることはできません...デバッグは不可欠です... – xMRi