Область диаграммы на снимке экрана - это элемент управления HwndHost, в котором размещено собственное окно Win32 (с собственным зарегистрированным WNDCLASS), реализованное в C ++ / CLI и нарисованное с помощью Direct2D. HwndHost размещается в пограничном элементе управления WPF.
Проблема в том, что я не могу установить фокус клавиатуры на размещенное окно 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;
}
};