コントロールをダイアログに張り付けるは簡単なのでやりません。
ここでは SDI のビューに割り当てる方法をやってみます。
まずウイザードで SDI プロジェクト を作ります。
その時、"ActiveX コントロール" のチェック印を忘れずに。
(忘れた場合、CxxxApp::InitInstance() の頭の方に AfxOleInit() を入れます)
[プロジェクトの追加] メニューから
[コンポーネントおよびコントロール] -> [Registered ActiveX Controls]
で、使いたいコントロールを選択してクラスを作ります。
(ここでは CControl という名前にします)
ビューにコントロールのクラスを実装します。
class CxxxView ...
{
CControl m_Control;
};
そしてコントロールのインスタンスを作成します。
ここでは、ビューのウインドウ作成の時に一緒にインスタンス化してます。
#define CONTROL_ID 0
CxxxView::OnCreate()
{
m_Control.Create(NULL, WS_VISIBLE, CRect(0,0,100,100), this, CONTROL_ID);
...
}
(CONTROL_ID は適当な数値です)
後は、リサイズされた時にコントロールも合わせるとかして下さい。
ヘッダーにマクロ宣言をします。
class CxxxView ...
{
DECLARE_EVENTSINK_MAP()
};
ビューの .cpp に
BEGIN_EVENTSINK_MAP(CxxxView, CView)
//{{AFX_EVENTSINK_MAP(CxxxView)
ON_EVENT(CxxxView, CONTROL_ID, /*DISPID*/ 1, OnEventxxxx, VTS_I4)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
こんな感じでイベントを記述します。
ですが、結構めんどうなので、最初に(仮)ダイアログに貼り付けてイベントを実装し、
ウイザードの作ったソースに追加された部分を持ってくるといいでしょう。
コントロールをまともに使うには、これからが何かと大変です。(汗;
実装するインターフェイスと お友達 にならなくてはなりませんし・・・。
下記は、コントロールのアクセラレーターキー処理をさせるコードです。
BOOL CxxxView::PreTranslateMessage(MSG* pMsg)
{
IUnknown *pUnk = m_Control.GetControlUnknown();
if (pUnk) {
IOleInPlaceActiveObject *pActiveObject = NULL;
pUnk->QueryInterface(IID_IOleInPlaceActiveObject, (void**)&pActiveObject);
if (pActiveObject) {
if (pActiveObject->TranslateAccelerator(pMsg) == S_OK) {
pActiveObject->Release();
return TRUE;
}
pActiveObject->Release();
}
}
return CView::PreTranslateMessage(pMsg);
}