WPF HwndHost фокус клавиатуры

Область диаграммы на снимке экрана представляет собой элемент управления HwndHost, в котором размещено собственное окно Win32 (с собственным зарегистрированным WNDCLASS), реализованное на C ++ / CLI и нарисованное с помощью Direct2D. HwndHost размещается в элементе управления WPF Border.

У меня проблема в том, что я не могу установить фокус клавиатуры на размещенное окно Win32. Я хочу, чтобы фокус перемещался в размещенное окно Win32, когда используемый щелкает по области диаграммы. Я попытался вызвать SetFocus для WM_LBUTTONDOWN, но это испортило фокус в остальной части приложения.

В настоящее время, даже если я нажимаю на окно Win32, фокус остается на древовидном представлении слева, и если я нажимаю клавиши курсора вверх / вниз, они будут отображаться в древовидном представлении, а не в окне диаграммы.

Как сделать так, чтобы размещенное окно Win32 получало ввод с клавиатуры с момента, когда пользователь щелкает область диаграммы, до тех пор, пока он не щелкнет другой элемент управления (например, древовидное представление или панель инструментов)?

http://dl.dropbox.com/u/190212/public/wpf_hwndhost.png

РЕДАКТИРОВАТЬ: Вот код C ++ / CLI для хоста окна:

template <typename T>
inline T intPtrToPtr(IntPtr value)
{
    return reinterpret_cast<T>(static_cast<void*>(value));
}

public ref class ChartWindowHost : public HwndHost, IKeyboardInputSink
{
private:
    ChartWindow* chartWindow;  // this is a C++ class doing the actual work

protected: 
    virtual HandleRef BuildWindowCore(HandleRef parent) override
    {
        chartWindow = new ChartWindow;
        const HINSTANCE hInstance = intPtrToPtr<HINSTANCE>(Marshal::GetHINSTANCE(Assembly::GetExecutingAssembly()->GetModules()[0]));
        const HWND parentWindow = intPtrToPtr<HWND>(parent.Handle);
        chartWindow->Create(hInstance, parentWindow);
        return HandleRef(this, IntPtr(chartWindow->GetHandle()));
    }

    virtual void DestroyWindowCore(HandleRef /*window*/) override
    {
        chartWindow->Destroy();
        delete chartWindow;
        chartWindow = NULL;
    }
};

person Meh    schedule 16.05.2010    source источник


Ответы (1)


Итак, msdn говорит что-то о необходимости переопределить WndProc() на HwndHost подкласс ...

person SamB    schedule 17.11.2010