コントロールが初期化/アクティブ化された後、ActiveXコントロールのHWNDを取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/413425

  •  03-07-2019
  •  | 
  •  

質問

Visual Studio 2008を使用して、C ++でATL 8.0ベースのActiveXコントロールを作成しています。サブウィンドウを作成し、ActiveXコントロールにアタッチする必要があります。

ActiveXコントロールが所有するHWNDにアクセスするにはどうすればよいですか?

コントロールのウィンドウが作成された後にHWNDを使用するために、どのATL関数をオーバーライドできますか?

役に立ちましたか?

解決 2

いくつかの試行錯誤の後、私が求めていた答えを見つけました。

ATL ActiveXコントロールのコンストラクターで、次のコード行を追加します。

m_bWindowOnly = true;

これにより、(親ウィンドウのHWNDを単に再利用するのではなく)コントロールのウィンドウが作成されます。この後、コントロールクラスのm_hWndメンバーを使用して、コントロールのウィンドウのHWNDにアクセスできます。

他のヒント

ActiveXを使用すると、独自のインターフェイスで独自のメソッドを定義することができます(ブリアンの仮定に対処するため)が、ここでは役に立たない可能性があります。 ActiveXコントロールは、別のコンポーネントによって作成される可能性があります。 ATLも無関係です-これは、COMインターフェイスをラップするC ++テンプレートライブラリです。

ここで必要な関数はIOleWindow :: GetWindowです。 「ATL関数をオーバーライドしてHWMDを使用する」とはどういう意味かわかりません。 HWNDを取得したら、HWNDを使用する関数に渡すことができます。たとえば、SetParent(child、parent)の親として

[完全開示]:私はActiveXやATLにそれほど詳しくはありませんが、これが少なくともいくらか役立つことを願っています。

ActiveXでオブジェクトの任意のメソッドを定義できる場合は、HWNDの値を返すだけの関数を公開してみてください(コントロールはほぼ確実に独自のHWNDを知っています)。このようにして、必要なハンドルを取得するために GetActiveXHwnd()を呼び出すことができます。これはその後の操作に使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top