none
ATL ウインドウハンドルについて RRS feed

  • 質問

  • ATL DLLを使用してコントロールを作成しております。
    ATL DLL内で現在アクティブなコントロールのウインドウハンドルを取得する方法を探しておりますが
    そのような機構はATLに備わっていますでしょうか?


    使用環境:
    Visual Studio 2008 Sp1

    2009年4月28日 5:43

回答

  • > クライアントが複数のATLコントロールを作成したときに現在アクティブなコントロールのウインドウハンドルを
    > 取る必要がありまして投稿いたしました。

    何をもって「現在アクティブなコントロール」とみなすのですか?(”アクティブ”とは何のこと?)
    フォーカスがあること?プロパティやメソッドを呼び出した際に利用したコントロールのインスタンス?最後に追加したインスタンス?

    プロパティやメソッドを呼び出したときであるならば、コントロールからそのサブルーチンを呼ぶ際にウィンドウハンドルを渡せば良いのでは?
    # コントロールに対応するクラスの層でウィンドハンドルを取得する方法はご存知ですよね?


    > あるサブルーチンでPostMessageを使用してアクティブなATLコントロールのウインドウにメッセージを送信する処理がありまして
    > MFCのAfxGetMainWnd()のようなものがないか探しております。
    AfxGetMainWndって、グローバル関数ですよね?
    MFCのアプリケーションであれば、確かにメインとなるウィンドウは1つに限定できます。

    しかし、今回はActiveXコントロールであり、コントロールのインスタンスは複数存在する可能性があります。
    複数のインスタンスがあるとき、AfxGetMainWnd相当の関数は何を返したら良いと思いますか?
    そういった問題もあるので、存在しないが回答になるかと思います。 


    どこでも手軽にウィンドウハンドルを取りたいっていう意図の質問だと思いますが、そのスタンスは通用しないと言うことになります。
    面倒でも引数で渡していくか、サブルーチンをクラスのメンバー関数にして、コントロール毎にクラスのインスタンスを作って、メンバー変数にそれぞれのウィンドウハンドルを持たせておくか等の工夫をしましょう。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年4月30日 5:35
    モデレータ

すべての返信

  • 「現在アクティブなコントロール」とはどのようなイメージでしょうか?

    ご自身のコントロールを指しているのでしょうか?
    コントロール問わず、現在フォアグラウンドにいる(アクティブになっている)アプリケーションの、フォーカスを持っているコントロールということでしょうか?


    ATLになくてもWin32APIとかにあるというパターンもあれば、Win32APIを使っても無理ということも十分あります。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年4月28日 16:25
    モデレータ
  • 返信ありがとうございます。
    「現在アクティブなコントロール」ですが、
    クライアントが複数のATLコントロールを作成したときに現在アクティブなコントロールのウインドウハンドルを
    取る必要がありまして投稿いたしました。
    あるサブルーチンでPostMessageを使用してアクティブなATLコントロールのウインドウにメッセージを送信する処理がありまして
    MFCのAfxGetMainWnd()のようなものがないか探しております。
    ATLのフレームワークにはこのようなものはないのでしょうか。



    2009年4月30日 5:08
  • > クライアントが複数のATLコントロールを作成したときに現在アクティブなコントロールのウインドウハンドルを
    > 取る必要がありまして投稿いたしました。

    何をもって「現在アクティブなコントロール」とみなすのですか?(”アクティブ”とは何のこと?)
    フォーカスがあること?プロパティやメソッドを呼び出した際に利用したコントロールのインスタンス?最後に追加したインスタンス?

    プロパティやメソッドを呼び出したときであるならば、コントロールからそのサブルーチンを呼ぶ際にウィンドウハンドルを渡せば良いのでは?
    # コントロールに対応するクラスの層でウィンドハンドルを取得する方法はご存知ですよね?


    > あるサブルーチンでPostMessageを使用してアクティブなATLコントロールのウインドウにメッセージを送信する処理がありまして
    > MFCのAfxGetMainWnd()のようなものがないか探しております。
    AfxGetMainWndって、グローバル関数ですよね?
    MFCのアプリケーションであれば、確かにメインとなるウィンドウは1つに限定できます。

    しかし、今回はActiveXコントロールであり、コントロールのインスタンスは複数存在する可能性があります。
    複数のインスタンスがあるとき、AfxGetMainWnd相当の関数は何を返したら良いと思いますか?
    そういった問題もあるので、存在しないが回答になるかと思います。 


    どこでも手軽にウィンドウハンドルを取りたいっていう意図の質問だと思いますが、そのスタンスは通用しないと言うことになります。
    面倒でも引数で渡していくか、サブルーチンをクラスのメンバー関数にして、コントロール毎にクラスのインスタンスを作って、メンバー変数にそれぞれのウィンドウハンドルを持たせておくか等の工夫をしましょう。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年4月30日 5:35
    モデレータ
  • 返信ありがとうございました。


    >何をもって「現在アクティブなコントロール」とみなすのですか?(”アクティブ”とは何のこと?)
    >フォーカスがあること?プロパティやメソッドを呼び出した際に利用したコントロールのインスタンス?最後に追加したインスタンス?

    現在作成中のコントロールは描画機能があるビューのコントロールです。
    現在アクティブなコントロールとは、ユーザーが操作中のコントロールを意図しておりました。

    やはりAfxGetMainWndのような機能はATLにはないようですね。

    WM_MOUSEACTIVATEがイベントとして飛んでくるのを確認できましたので、こちらを使用することにします。

    大変ありがとうございました。

    2009年5月1日 7:14
  • こんにちは。中川俊輔です。

    Azuleanさん、詳しい回答ありがとうございます。

    nanasi120さん、フォーラムのご利用ありがとうございます。
    有用な情報と思われたため、勝手ながらAzuleanさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年5月15日 9:38