스크린 샷의 차트 영역은 C++/CLI로 구현되고 Direct2D로 그려진 기본 Win32 창 (자체 등록 된 WNDCLASS 포함)을 호스팅하는 HwndHost 컨트롤입니다. HwndHost는 WPF Border 컨트롤에서 호스팅됩니다.WPF HwndHost 키보드 포커스
문제점은 호스팅 된 Win32 창에 키보드 포커스를 설정할 수 없다는 것입니다. 사용 된 Win32 창으로 이동하려면 차트 영역에서 클릭을 사용할 때 포커스를 옮기고 싶습니다. WM_LBUTTONDOWN에 SetFocus를 호출 해 보았습니다. 그러나 나머지는 응용 프로그램의 포커스를 망칩니다.
현재, Win32 창을 클릭해도 왼쪽의 트리 뷰에 포커스가 유지되고 위쪽/아래쪽 커서 키를 누르면 트리 뷰에 차트 창이 표시되지 않습니다. .
사용자가 차트 영역을 클릭 할 때부터 다른 컨트롤 (예 : 트리보기 또는 도구 모음)을 클릭 할 때까지 호스트 된 Win32 창에서 키보드 입력을 받도록하려면 어떻게해야합니까?
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;
}
};