Click here to visit our sponsor

ActiveX Control をホストするコンテナの作成 (MFC篇)


MFC でコントロールを使う

コントロールをダイアログに張り付けるは簡単なのでやりません。
ここでは 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);
}

おわりに

このページの満足度は・・・

素晴らしい!
まあまあ、良いかも
自己満足感がよくわかるページですね
まったくもって説明不足


Visual C++ページトップ

HOME

兄弟ページ 姉妹ページ
Click here to visit our sponsor