Ярлыки WPF активируются при наборе в элементе управления расширенного редактирования HwndHost - PullRequest
1 голос
/ 06 апреля 2011

Я пишу приложение WPF, которое оборачивает старый редактор MFC richtext.Я обернул текстовый редактор в HwndHost.Элемент управления HwndHost находится рядом с WPF TabControl.

Снимок экрана запущенного приложения на http://www.kempy.co.uk/code/Test.png

Помимо проблем с фокусировкой и навигацией (вверх / вниз / влево / вправо / вкладка/ enter), который мне удалось решить, у меня все еще есть одна проблема с показом всплывающих окон:

Всякий раз, когда символ вводится в элементе управления расширенного текста, который является сочетанием клавиш на панели, ярлык активируется, а элемент управления richeditникогда не получит этого персонажа.Прилагается простой тестовый проект, демонстрирующий поведение при http://www.kempy.co.uk/code/Test.zip. Нажатие кнопки P или C в элементе управления расширенного редактирования приведет к фокусировке на панели или к нажатию кнопки, даже если элемент управления расширенного текста имеет фокус клавиатуры.

FYI, вот код, который позволяет элементу управления rich edit обрабатывать Tab, Enter, Up, Down, Left, Right

#undef TranslateAccelerator
virtual bool TranslateAccelerator (System::Windows::Interop::MSG% msg, ModifierKeys modifiers) = IKeyboardInputSink::TranslateAccelerator
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    if (msg.message == WM_KEYDOWN)
    {
        // we want tabs when the rich edit is focused, send rich edit control a tab WM_CHAR 
        if (msg.wParam == (IntPtr)VK_TAB)
        {
            if (GetFocus() == m_pRichEdit->GetSafeHwnd())
            {
                m_pRichEdit->SendMessage(WM_CHAR, '\t', 0);
                return true;
            }
            else
            {
                return false;
            }
        }
        else if (
            msg.wParam == (IntPtr)VK_UP
            || msg.wParam == (IntPtr)VK_DOWN
            || msg.wParam == (IntPtr)VK_LEFT
            || msg.wParam == (IntPtr)VK_RIGHT
            || msg.wParam == (IntPtr)VK_RETURN)
        {
            // need cursor keys and enter/return, send KEYDOWN messages to rich edit control
            m_pRichEdit->SendMessage(msg.message, msg.wParam.ToInt32(), msg.lParam.ToInt32());
            return true;
        }

    }
    return false;
}

1 Ответ

0 голосов
/ 03 июня 2011

Вам нужно переопределить OnMnemonic?

Статья доктора Добса о взаимодействии ...

http://drdobbs.com/windows/197003872?pgno=3

...