Views Foundation > 既存の Rogue Wave Views コードから ActiveX コントロールを作成する > ATL ライブラリーで ActiveX コントロールを作成する > 手順 4:ActiveX コントロールへカスタム・イベントを追加する
 
手順 4:ActiveX コントロールへカスタム・イベントを追加する
この手順では、カスタム・イベント (PointerPosition) を ActiveX コントロールに追加する方法を示します。ユーザーがマウス・ポインターを移動するたびに、ビュー・インタラクターのメンバー関数 handleEvent がこのイベントを実行して、コンテナーへ送ります。このイベントには 3 つのパラメーターがあります。
*BSTR パラメーターは、マウス・ポインターの下にオブジェクトがあれば、その名前を示します。
*OLE_XPOS_PIXELS および OLE_YPOS_PIXELS パラメーターは、IlvManagerView に対するマウスの相対的位置を示します。
次の処理を行います。
*新しいカスタム・イベントの定義
*ファイル DemoATL.idl をコンパイルするか、プロジェクトを再構築する
*接続ポイント・インターフェースの実装
*CONNECTION_POINT_ENTRY マクロのパラメーターをチェックする
*DemoCtrl クラスのコンストラクターを変更する
*メンバー関数 CDemoATLCtrl::onCreate を変更する
*TrackInteractor クラスの定義
*m_Inter プライベート変数を DemoCtrl クラスに追加する
*DemoCtrl コンストラクターの m_Inter を初期化して、マネージャー経由でビューに付加する
*デストラクターを変更して、m_Inter に格納されたインタラクターを削除する
*プロパティーのテスト
新しいカスタム・イベントの定義
1. 「プロジェクト ワークスペース」ウィンドウの「クラス ビュー」タブで、DemoATLLib をクリックしてコンテンツを展開し、右マウス・ボタンで _IDemoATLCtrlEvents インターフェースをクリックします。
2. 表示されるメニューから「追加」 > 「関数の追加」を選択します。
3. ダイアログ・ボックスに次に示す値を入力します。「戻り型」には HRESULT、「メソッド名」には PointerPosition、パラメーターには BSTR nameOLE_XPOS_PIXELS xOLE_YPOS_PIXELS yがあります
ファイル DemoATL.idl をコンパイルするか、プロジェクトを再構築する
接続ポイント・インターフェースの実装
1. 「プロジェクト ワークスペース」ウィンドウの「クラス ビュー」タブで、CDemoATLCtrl をマウスの右ボタンでクリックします。
2. 表示されるメニューから「追加」 > 「接続ポイントの追加」を選択します。
3. Implement connection points」で、_IDemoATLCtrlEvents インターフェースを選択して「OK」をクリックします。
CONNECTION_POINT_ENTRY マクロのパラメーターをチェックする
1. DemoATLCtrl.h を開き、2 箇所にある __uuidof(_IDemoATLCtrlEvents)
次と置き換えます。
DIID__IDemoATLCtrlEvents
2. 「プロジェクト ワークスペース」ウィンドウの「クラス ビュー」タブで、Cproxy_IDemoATLCtrlEvents<T> をマウスの右ボタンでクリックします。
3. 表示されるメニューで Go To Definition を選択します。
_DemoATLCtrlEvents_CP.h ファイルが開きます。
4. 表示される
&__uuidof(_IDemoATLCtrlEvents) Çš
次と置き換えます。
&DIID__IDemoATLCtrlEvents
DemoCtrl クラスのコンストラクターを変更する
このコンストラクターを、CDemoATLCtrl クラスの参照が 2 番目のパラメーターとして受け入れられるように変更します。CDemoATLCtrl クラスのフォワード宣言をファイル DemoCtrl.h に追加して、ファイル stdafx.h および DemoATLCtrl.h をファイル DemoCtrl.cpp にインクルードします。
メモ: Rogue Wave Views および ATL はいずれも STRICT マクロの定義を強制しますが、これらのファイルは、Rogue Wave Views ヘッダー・ファイルの前にインクルードする必要があります。なお ATL は、このマクロがすでに定義されているかどうかをチェックしません。
メンバー関数 CDemoATLCtrl::onCreate を変更する
メンバー関数 CDemoATLCtrl::OnCreate (ファイル DemoATLCtrl.h) で、DemoCtrl コンストラクター呼び出しの 2 番目のパラメーターとして、*this を追加します。
TrackInteractor クラスの定義
ファイル DemoCtrl.cpp 内で、IlvViewManagerInteractor から派生する新しいクラス TrackInteractor を定義します。
class TrackInteractor :public IlvManagerViewInteractor
{
public:
TrackInteractor(IlvManager* m, IlvView* v, CDemoATLCtrl& ATLCtrl)
: IlvManagerViewInteractor(m, v), m_ATLCtrl(ATLCtrl)
{
}
~TrackInteractor() {}
void handleEvent(IlvEvent& event)
{
if (event.getType() == IlvPointerMoved) {
IlvGraphic* obj =
getManager()->lastContains(IlvPoint(event.x(), event.y()),
getView());
CComBSTR bstrName("");
if (obj) {
const char* name = getManager()->getObjectName(obj);
bstrName = name;
}
m_ATLCtrl.Fire_PointerPosition(bstrName.Detach(),
OLE_XPOS_PIXELS(event.x()),
OLE_XPOS_PIXELS(event.y()));
}
if (!getManager()->dispatchToObjects(event, getView()))
getManager()->shortCut(event, getView());
}
private:
CDemoATLCtrl& m_ATLCtrl;
};
Fire_PointerPosition 関数のインプリメント
1. 「プロジェクト ワークスペース」ウィンドウの「クラス ビュー」タブで、Cproxy_IDemoATLCtrlEvents<T> をマウスの右ボタンでクリックします。
2. Fire_PointerPosition パブリック関数を Cproxy_IDemoATLCtrlEvents クラスに追加します。
HRESULT Fire_PointerPosition(BSTR name, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y)
{
CComVariant varResult;
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[3];
int nConnections = m_vec.GetSize();
 
for (nConnectionIndex = 0; nConnectionIndex < nConnections;                                     nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp =
m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch =
reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantClear(&varResult);
pvars[2] = name;
pvars[1] = x;
pvars[0] = y;
DISPPARAMS disp = { pvars, NULL, 3, 0 };
pDispatch->Invoke(0x1, IID_NULL,                            LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp,                            &varResult, NULL, NULL);
}
}
delete[] pvars;
return varResult.scode;
}
m_Inter プライベート変数を DemoCtrl クラスに追加する
この m_Inter 変数は、タイプ TrackInteractor* である必要があります。
この変数を追加するためには、手順 3:ActiveX コントロールへカスタム・プロパティーを追加するで説明したように、ウィザードが使用できます。TrackInteractor クラスのフォワード宣言を、DemoCtrl.h ファイルにインクルードすることを忘れないでください。
DemoCtrl コンストラクターの m_Inter を初期化して、マネージャー経由でビューに付加する
DemoCtrl::DemoCtrl(HWND hWnd, CDemoATLCtrl& ATLCtrl)
: Ctrl(_Display, reinterpret_cast<IlvSystemView>(hWnd)), m_Inter(0)
{
m_Inter = new TrackInteractor(getManager(), getManagerView(), ATLCtrl);
getManager()->setInteractor(m_Inter, getManagerView());
}
デストラクターを変更して、m_Inter に格納されたインタラクターを削除する
DemoCtrl::~DemoCtrl()
{
if (m_Inter) {
getManager()->setInteractor(0, getManagerView());
delete m_Inter;
m_Inter = 0;
}
 
}
プロパティーのテスト
プロパティーのテストには、Internet Explorer を使用できます。Internet Explorer では、ファイル DemoATLCtrl.html を変更して、VBScript 言語が使用できます。
関数 DemoATLCtrl_PointerPosition が、PointerPosition イベント実行のたびに呼び出されます。この関数は、マウス・オーバーしているオブジェクトがあればその座標と、定義されていればその名前を表示します。
<HTML>
<HEAD>
<TITLE>ATL 3.0 test page for object DemoATLCtrl</TITLE>
</HEAD>
 
<SCRIPT LANGUAGE = "javascript">
 
<!--
function load(value)
{
DemoATLCtrl.FileName = value;
}
 
-->
</SCRIPT>
 
<SCRIPT LANGUAGE = "VBScript">
 
<!--
Sub DemoATLCtrl_PointerPosition(name, x, y)
text1.innerText = name & " (" & x & ", " & y & ")"
End Sub
 
-->
</SCRIPT>
 
<BODY>
 
<SELECT NAME=Files onchange = "load(value)" >
<OPTION Selected Value="data/browse.ilv">World
<OPTION Value="europe.ilv"> Europe
<OPTION Value="africa.ilv"> Africa
</SELECT>
 
<P>
<OBJECT WIDTH=400 HEIGHT=400 ID="DemoATLCtrl" CLASSID="CLSID:3B10417D-3E6C-
11D3-B74F-00C04F68A89D"></OBJECT>
<P>
 
<INPUT id=text1 name=text1>
</P>
 
</BODY>
 
</HTML>
メモ: クラス ID が生成されるので、ご使用ファイルのクラス ID がこの例とは異なる場合があります。

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