3

スクリーンショットのグラフ領域は、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;
    }
};
4

1 に答える 1

0

まあ、msdnWndProc()は、HwndHost サブクラスでオーバーライドする必要があることについて何か言います...

于 2010-11-17T00:00:32.807 に答える