質問者
VC++で作成したActiveXコントロールをVB6で使用する

質問
-
質問させてください。
VC++2005にて、「新しいプロジェクト」の「MFC ActiveX コントロール」のテンプレートを利用して、(メインフォームにボタンやらピクチャボックスやらをペタペタ貼り付けて)OCXを作成しました。
regsvr32コマンドによりOCXをレジストリ登録(>regsvr32 C:\~.ocx)した後、いざVB6で使用してみようと思い、VB6の「プロジェクト」「コンポーネントの追加」にて該当OCXを追加してフォームにコントロールを貼り付けてみたところ、「白地に円が書かれただけのオブジェクト」が表示されただけで、ユーザコントロールとして実装したはずのボタンやらピクチャボックスやらが全く表示されません。
作成したイベントやプロパティも無効のようでして、色々試してみましたがどうにも正常に表示されません。基本のテンプレートにボタンを追加しただけのユーザコントロールでも同様の現象が出ましたので、恐らく酷く初歩的な部分を理解できていないのだと思います。
大変恐縮なのですが、アドバイスいただけると助かります。
すべての返信
-
ねりなさん回答ありがとうございました。
とりあえずその方法でコントロールのデバッグはできるのですが、その画面でも「白地に黒で円が書かれただけのオブジェクト」が表示されています。
これって「呼び出し側のアプリケーション」からしてみれば、このOCXの中身が無効な状態だから貼り付けたボタン類は表示されずにこんな表示になっているのでしょうか。大変すいませんが何か情報、もしくは良さそうな書籍がありましたら紹介していただけると非常に助かります。
手持ちの入門編の本には「コントロールの作成」は何とか載ってるものもありますが、OCXにしてどうこう、となるとどの本にも載っていなかったものでして……。 -
回答ありがとうございます。
説明不足で申し訳ありません。
「メインフォーム」とはVB6の(スタートアップの)フォームであり、今回C++で作成したOCXを(コンポーネントの追加で)そこに貼り付けました。コンポーネントの追加をしてフォームに配置しただけですので、VB6側でクラスに関しても特に何も記述しておりません。ところで最初に教えていただいたActiveX コントロール テスト コンテナですが、コンテナのメイン?ウィンドウには意図したボタン類が表示されない(コントロールサイズの楕円が表示されるだけ)のですが、メニュー[編集][プロパティ]でプロパティを開くと希望の画面(C++のデザイナで作成したOCXの画面)が表示されています。かつ、希望の動作(ここでは、「テスト的に配置したボタンを押すとメッセージボックスを表示」という動作)も行われます。
これというのはテストコンテナ的には正常な動作(OCXそのものは正常)なのでしょうか。だとするとVB6で表示されない理由がやはり解らず、頭を抱えています。
度々の質問で申し訳ありません。
-
「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;
}以上のような感じでできると思います。