gpt4 book ai didi

WPF HwndHost 键盘焦点

转载 作者:行者123 更新时间:2023-12-05 08:02:55 26 4
gpt4 key购买 nike

屏幕截图中的图表区域是一个 HwndHost 控件,它承载一个在 C++/CLI 中实现并使用 Direct2D 绘制的 native Win32 窗口(具有自己注册的 WNDCLASS)。 HwndHost 托管在 WPF 边框控件中。

我遇到的问题是无法将键盘焦点设置到托管的 Win32 窗口。当用户单击图表区域时,我希望焦点移动到托管的 Win32 窗口。我尝试在 WM_LBUTTONDOWN 上调用 SetFocus,但这搞砸了应用程序其余部分的焦点。

目前,即使我点击 Win32 窗口,焦点仍然在左侧的 TreeView 上,如果我按上/下光标键, TreeView 将获取它们,而不是图表窗口。

如何让托管的 Win32 窗口从用户单击图表区域时接收键盘输入,直到它单击另一个控件(如 TreeView 或工具栏)?

alt text 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;
}
};

最佳答案

嗯,msdn说了一些关于必须重写 HwndHost 子类上的 WndProc()...

关于WPF HwndHost 键盘焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2844165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com