Visual Studio 2008 を使用して、C++ で ATL 8.0 ベースの ActiveX コントロールを作成しています。サブウィンドウを作成して ActiveX コントロールにアタッチする必要があります。
ActiveX コントロールが所有する HWND にアクセスするにはどうすればよいですか?
コントロールのウィンドウが作成された後に HWND を使用するために、どの ATL 関数をオーバーライドできますか?
試行錯誤の末、求めていた答えを見つけました。
ATL ActiveX コントロールのコンストラクターで、次のコード行を追加します。
m_bWindowOnly = true;
これにより、(親ウィンドウの HWND を再利用するだけでなく) コントロールのウィンドウが作成されます。この後、コントロール クラスの m_hWnd メンバーを使用して、コントロールのウィンドウの HWND にアクセスできます。
ActiveX を使用すると、独自のインターフェイスで独自のメソッドを定義できますが (Brian の仮定に対処するため)、ここではおそらく役に立ちません。ActiveX コントロールは、別のコンポーネントによって作成されている可能性があります。ATL も無関係です。これは、COM インターフェイスをラップする C++ テンプレート ライブラリです。
ここで必要な関数は IOleWindow::GetWindow です。「ATL関数をオーバーライドしてHWMDを使用する」という意味がわかりません。HWND を取得したら、HWND を使用する任意の関数に渡すことができます。たとえば、SetParent(child, parent) の親として
[完全公開]: 私は ActiveX や ATL にあまり詳しくありませんが、これが少しでも役立つことを願っています。
ActiveX でオブジェクトに任意のメソッドを定義できる場合は、HWND の値を返すだけの呼び出し可能な関数を公開してみてください (コントロールはほぼ確実に独自の HWND を認識しています)。GetActiveXHwnd()
そうすれば、必要なハンドルを取得するために呼び出すことができ、それをさらに操作するために使用できます。