Views Foundation > 既存の Rogue Wave Views コードから ActiveX コントロールを作成する > MFC ライブラリーで ActiveX コントロールを作成する > 手順 4:ActiveX コントロールへカスタム・イベントを追加する
 
手順 4:ActiveX コントロールへカスタム・イベントを追加する
この手順では、カスタム・イベント (PointerPosition) を ActiveX コントロールに追加する方法を示します。ユーザーがマウス・ポインターを移動するたびに、ビュー・インタラクターのメンバー関数 handleEvent がこのイベントを実行して、コンテナーへ送ります。このイベントには 3 つのパラメーターがあります。
*BSTR パラメーターは、マウス・ポインターの下にオブジェクトがあれば、その名前を示します。
*OLE_XPOS_PIXELS および OLE_YPOS_PIXELS パラメーターは、IlvManagerView に対するマウスの相対的位置を示します。
次の処理を行います。
*新しいカスタム・イベントの定義
*メンバー関数 CDemoMFCCtrl::onCreate を変更する
*TrackInteractor クラスの定義
*m_Inter プライベート変数を DemoCtrl クラスに追加する
*クラス TrackInteractor を、クラス CDemoMFCCtrl のフレンドとして宣言する (ファイル DemoMFCCtl.h 内)。
*DemoCtrl コンストラクターの m_Inter 変数を初期化して、マネージャー経由でビューに付加する
*デストラクターを変更して、m_Inter に格納されたインタラクターを削除する
*プロパティーのテスト
新しいカスタム・イベントの定義
1. 「プロジェクト ワークスペース」ウィンドウの「クラス ビュー」タブで、DemoMFCCtrl インターフェースをマウスの右ボタンでクリックします。
2. 表示されるメニューから「追加」 > 「イベントの追加」を選択します。
3. ダイアログ・ボックスに次に示す値を入力します。
*PointerPosition を「イベント名」に、
*FirePointerPosition を「内部名」に、
*BSTR name」、「OLE_XPOS_PIXELS x」、「OLE_YPOS_PIXELS y」をパラメータにそれぞれ入力します。
4. プロジェクトを再構築します。
5. DemoMFCCtrl.h で、FirePointerPosition メソッドがパブリックとして宣言されていること、最初のパラメーターの種類が BSTR であることを確認します。
DemoCtrl クラスのコンストラクターを変更する
このコンストラクターを、CDemoMFCCtrl クラスの参照が 2 番目のパラメーターとして受け入れられるように変更します。CDemoMFCCtrl クラスのフォワード宣言をファイル DemoCtrl.h に追加して、ファイル stdafx.hDemoMFC.hDemoMFCCtl.h をファイル DemoCtrl.cpp にインクルードします。
メモ: これらのファイルは Rogue Wave Views ヘッダー・ファイルの前に含める必要があります。
メンバー関数 CDemoMFCCtrl::onCreate を変更する
メンバー関数 CDemoMFCCtrl::OnCreate (ファイル DemoMFCCtl.cpp) で、DemoCtrl コンストラクター呼び出しの 2 番目のパラメーターとして、*this を追加します。
TrackInteractor クラスの定義
ファイル DemoCtrl.cpp 内で、IlvViewManagerInteractor から派生する新しいクラス TrackInteractor を定義します。
class TrackInteractor :public IlvManagerViewInteractor
{
public:
TrackInteractor(IlvManager* m, IlvView* v, CDemoMFCCtrl& MFCCtrl)
: IlvManagerViewInteractor(m, v), m_MFCCtrl(MFCCtrl)
{
}
~TrackInteractor() {}
void handleEvent(IlvEvent& event)
{
if (event.getType() == IlvPointerMoved) {
IlvGraphic* obj =
getManager()->lastContains(IlvPoint(event.x(), event.y()),
getView());
CString mfcName;
if (obj) {
const char* name = getManager()->getObjectName(obj);
mfcName = name;
}
BSTR bstrName = mfcName.AllocSysString();
m_MFCCtrl.FirePointerPosition(&bstrName,
OLE_XPOS_PIXELS(event.x()),
OLE_XPOS_PIXELS(event.y()));
::SysFreeString(bstrName);
}
if (!getManager()->dispatchToObjects(event, getView()))
getManager()->shortCut(event, getView());
}
private:
CDemoMFCCtrl& m_MFCCtrl;
};
m_Inter プライベート変数を DemoCtrl クラスに追加する
この変数を追加するためには、手順 3:ActiveX コントロールへカスタム・プロパティーを追加するで説明したように、ウィザードが使用できます。TrackInteractor クラスのフォワード宣言を、DemoCtrl.h ファイルにインクルードすることを忘れないでください。
クラス TrackInteractor を、クラス CDemoMFCCtrl のフレンドとして宣言する (ファイル DemoMFCCtl.h 内)。
DemoCtrl コンストラクターの m_Inter 変数を初期化して、マネージャー経由でビューに付加する
DemoCtrl::DemoCtrl(HWND hWnd, CDemoMFCCtrl& MFCCtrl)
: Ctrl(_Display, reinterpret_cast<IlvSystemView>(hWnd)), m_Inter(0)
{
m_Inter = new TrackInteractor(getManager(), getManagerView(), MFCCtrl);
getManager()->setInteractor(m_Inter, getManagerView());
}
デストラクターを変更して、m_Inter に格納されたインタラクターを削除する
DemoCtrl::~DemoCtrl()
{
if (m_Inter) {
getManager()->setInteractor(0, getManagerView());
delete m_Inter;
m_Inter = 0;
}
 
}
プロパティーのテスト
関数 DemoMFCCtrl_PointerPosition が、PointerPosition イベント実行のたびに呼び出されます。この関数は、マウス・オーバーしているオブジェクトがあればその座標と、定義されていればその名前を表示します。
<HTML>
<HEAD>
<TITLE>Test page for object DemoMFCCtl</TITLE>
</HEAD>
 
<SCRIPT LANGUAGE = "javascript">
 
<!--
function load(value)
{
    DemoMFCCtrl.FileName = value;
}
 
-->
</SCRIPT>
 
<SCRIPT LANGUAGE = "VBScript">
 
<!--
Sub DemoMFCCtrl_PointerPosition(name, x, y)
text1.innerText = name & " (" & x & ", " & y & ")"
End Sub
 
-->
</SCRIPT>
 
<BODY>
 
<P>
<OBJECT WIDTH=400 HEIGHT=400 ID="DemoMFCCtrl" CLASSID="CLSID:3D31E7B8-400B-
11D3-B74F-00C04F68A89D"></OBJECT>
<P>
 
<INPUT id=text1 name=text1>
</P>
 
</BODY>
 
</HTML>
メモ: クラス ID が生成されるので、ご使用ファイルのクラス ID がこの例とは異なる場合があります。
Visual Basic でテストを実行する方法の例については、プロジェクト VB/testMFC.vbp を参照してください。関数 DemoMFCCtrl1_PointerPosition が、PointerPosition イベント実行のたびに呼び出されます。

Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.