none
VC++で作成したActiveXコントロールをVB6で使用する RRS feed

  • 質問

  • 質問させてください。

    VC++2005にて、「新しいプロジェクト」の「MFC ActiveX コントロール」のテンプレートを利用して、(メインフォームにボタンやらピクチャボックスやらをペタペタ貼り付けて)OCXを作成しました。
    regsvr32コマンドによりOCXをレジストリ登録(>regsvr32 C:\~.ocx)した後、いざVB6で使用してみようと思い、VB6の「プロジェクト」「コンポーネントの追加」にて該当OCXを追加してフォームにコントロールを貼り付けてみたところ、「白地に円が書かれただけのオブジェクト」が表示されただけで、ユーザコントロールとして実装したはずのボタンやらピクチャボックスやらが全く表示されません。
    作成したイベントやプロパティも無効のようでして、色々試してみましたがどうにも正常に表示されません。

    基本のテンプレートにボタンを追加しただけのユーザコントロールでも同様の現象が出ましたので、恐らく酷く初歩的な部分を理解できていないのだと思います。
    大変恐縮なのですが、アドバイスいただけると助かります。

    2006年9月19日 10:33

すべての返信

  • ActiveX コントロール自体のデバッグでしたら、そのプロジェクトから[デバッグ開始]を実行すると、「デバッグ セッションの実行可能ファイル」ダイアログが表示されるので、[実行可能ファイル名]のコンボボックスのドロップダウンリストから[ActiveX コントロール テスト コンテナ]を選択して[OK]します。

    ActiveX コントロール テスト コンテナが起動しますので、メニュー[編集]|[新しいコントロールを挿入]で対象のコントロールを選択すればそのままデバッグできると思います。

    はずしてたらごめんなさい。

    2006年9月20日 3:44
  • ねりなさん回答ありがとうございました。

    とりあえずその方法でコントロールのデバッグはできるのですが、その画面でも「白地に黒で円が書かれただけのオブジェクト」が表示されています。
    これって「呼び出し側のアプリケーション」からしてみれば、このOCXの中身が無効な状態だから貼り付けたボタン類は表示されずにこんな表示になっているのでしょうか。

    大変すいませんが何か情報、もしくは良さそうな書籍がありましたら紹介していただけると非常に助かります。
    手持ちの入門編の本には「コントロールの作成」は何とか載ってるものもありますが、OCXにしてどうこう、となるとどの本にも載っていなかったものでして……。

    2006年9月21日 10:02
  • ごめんなさい。最初のご質問をよく読んでいませんでした。

     多賀 さんからの引用
    メインフォームにボタンやらピクチャボックスやらをペタペタ貼り付けて

    とありますが、ここでの「メインフォーム」とは何を指しておられるのでしょうか。

    また、プロジェクト作成時に自動生成されたクラス(派生元は COleControl クラス)との関係はどうなっているのでしょうか?

     

     

     

    2006年9月22日 0:45
  • 回答ありがとうございます。

    説明不足で申し訳ありません。
    「メインフォーム」とはVB6の(スタートアップの)フォームであり、今回C++で作成したOCXを(コンポーネントの追加で)そこに貼り付けました。コンポーネントの追加をしてフォームに配置しただけですので、VB6側でクラスに関しても特に何も記述しておりません。

    ところで最初に教えていただいたActiveX コントロール テスト コンテナですが、コンテナのメイン?ウィンドウには意図したボタン類が表示されない(コントロールサイズの楕円が表示されるだけ)のですが、メニュー[編集][プロパティ]でプロパティを開くと希望の画面(C++のデザイナで作成したOCXの画面)が表示されています。かつ、希望の動作(ここでは、「テスト的に配置したボタンを押すとメッセージボックスを表示」という動作)も行われます。

    これというのはテストコンテナ的には正常な動作(OCXそのものは正常)なのでしょうか。だとするとVB6で表示されない理由がやはり解らず、頭を抱えています。

    度々の質問で申し訳ありません。

     

    2006年9月25日 10:44
  • >「白地に円が書かれただけのオブジェクト」が表示されただけで

    は、ActiveX コントロールのプロジェクトを新規作成した時の雛形そのまんまの動作です。

    >regsvr32コマンドによりOCXをレジストリ登録(>regsvr32 C:\~.ocx)した後

    ボタン類の実装後、ちゃんとビルドしなおした .ocx を登録しましたか?

    あるいは、.ocx を取り出す時 Release/Debug フォルダを取り違えたとか。

    いずれにしろ、.ocx をビルドしなおして登録しなおせばいーんじゃないかと思います。

     

    2006年9月25日 22:41
  • 「C++のデザイナで作成したOCXの画面」とありますが、これはカスタムプロパティページのことだと思います。プロパティページは、VisualBasic等の開発ツールでのデザイン時に開発者がコントロールのプロパティを設定するためのコンポーネントであり、実行時のためのものではありません。

    ActiveXコントロール内に子のコントロールを置きたいのであれば、ダイアログテンプレートリソースならびにダイアログ派生クラスを別途用意する必要があると思います。

    ①リソースビューで「Dialog」ノードを右クリックして「Dialogを挿入」を実行して、新規ダイアログテンプレートリソースを作成します。作成したダイアログのプロパティで、Border=なし、Style=子、TitleBar=False,  Vislbe=True に設定します。

    ②ダイアログをダブルクリックすると、MFC クラスウィザードのダイアログが表示されるので、各項目を設定してダイアログ派生クラスのコードを生成します。

    ③ActiveX コントロールでこのダイアログを子ウィンドウとして作成するためのコードを記述します。ここでは、ダイアログリソーステンプレートのIDを"IDD_HOGE"、ダイアログのクラス名を"CHogeDlg"として作成してあるものとします。

    ・以下ActiveXコントロールのヘッダファイル

    #include "HogeDlg.h"

    class CTestActCtrl : public COleControl
    {

        ...


        CHogeDlg m_HogeDlg; // <-- 追加

        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // <-- 追加

    }

    ・以下ActiveXコントロールのソースファイル

    BEGIN_MESSAGE_MAP(CTestActCtrl, COleControl)

        ...
        ON_WM_CREATE() // <-- 追加
    END_MESSAGE_MAP()

    // 以下の関数を追加

    int CTestActCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (COleControl::OnCreate(lpCreateStruct) != 0)
             return -1;


        VERIFY(m_HogeDlg.Create(IDD_HOGE, this));

        return 0;
    }

    以上のような感じでできると思います。
     

    2006年9月26日 0:52
  • ねりなさん、渋木宏明さん、アドバイスありがとうございます。

    確かにダイアログでは無くプロパティにボタン類を置いておりました。なるほど本来表示すべき場所にボタン類を配置もしていなければそれを表示するようにクラスの設定もしていなかったから渋木宏明さんの仰る通り雛形が表示されるだけだったのですね。ねりなさんに教えて頂いた手順で問題無くVB6側で表示することが出来ました。
    お二方、どうもありがとうございました。

    2006年9月27日 8:32