スクリーンショットのグラフ領域は、C++/CLI で実装され、Direct2D で描画されたネイティブ Win32 ウィンドウ (独自に登録された WNDCLASS を含む) をホストする HwndHost コントロールです。HwndHost は、WPF Border コントロールでホストされます。
私が抱えている問題は、ホストされている Win32 ウィンドウにキーボード フォーカスを設定できないことです。使用したチャート領域をクリックしたときに、ホストされている Win32 ウィンドウにフォーカスを移動したい。WM_LBUTTONDOWN で SetFocus を呼び出してみましたが、アプリケーションの残りの部分でフォーカスが台無しになります。
現在、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;
}
};