2010-05-16 2 views
2

스크린 샷의 차트 영역은 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; 
    } 
}; 

답변

0

글쎄, msdn합니다 ... HwndHost 서브 클래스에

WndProc()를 오버라이드 (override) 할 필요에 대해 뭔가를 말한다