手順 3:ActiveX コントロールへカスタム・プロパティーを追加する
この手順では、ActiveX コントロールにファイル名と背景色を追加する方法について説明します。ファイル名は、マネージャーによって読み込まれるファイルの名前です。デフォルトでこのファイルは data/browse.ilv で、これは手順 2 において .rc ファイルにインクルードしました。また背景色は、マネージャー・ビューの背景色になります。
次の処理を行います。
ファイル名プロパティーの追加
1. 「プロジェクト ワークスペース」ウィンドウの「クラス ビュー」タブで、IDemoAtlCtrl をマウスの右ボタンでクリックして、「追加」 > 「プロパティの追加」を選択します。
2. 「プロパティ名」フィールドに、FileName と入力します。
3. 「プロパティの種類」ドロップダウン・リストから、BSTR を選択します。
4. 「パラメータ」フィールドが空欄であることを確認します。
5. 必要ならば、「Get 関数」、「Put 関数」、「PropPut」を選択します。
「PropPutRef」はチェックなしのままにします。属性は id および helpstring です。
6. 「OK」をクリックします。
背景色プロパティーの追加
1. 「プロジェクト ワークスペース」ウィンドウの「クラス ビュー」タブで、IDemoAtlCtrl をマウスの右ボタンでクリックして、「追加」 > 「プロパティの追加」を選択します。
2. 「プロパティ名」フィールドに、Background と入力します。
3. 「プロパティの種類」ドロップダウン・リストから、OLE_COLOR を選択します。
4. 「パラメータ」フィールドは空欄のままにします。
5. 必要ならば、「Get 関数」、「Put 関数」、「PropPut」を選択します。
「PropPutRef」はチェックなしのままにします。属性は id (値 2) および helpstring です。
6. 「OK」をクリックします。
新しいプライベート・メンバー変数の追加
1. 「プロジェクト ワークスペース」ウィンドウの「クラス ビュー」タブで、CDemoATLCtrl をマウスの右ボタンでクリックします。
2. 表示されるメニューから「追加」 > 「変数の追加」を選択します。
3. 「変数の種類」フィールドに CComBSTR、「変数名」フィールドに m_FileName と入力し、「OK」をクリックします。
4. 「追加」 > 「変数の追加」を再び選択します。
5. 「変数の種類」フィールドに OLE_COLOR、「変数名」フィールドに m_Background と入力し、「OK」をクリックします。
CDemoAtlCtrl コンストラクターの変更
ファイル DemoATLCtrl.h で CDemoATLCtrl コンストラクターを次のように変更して、メンバー変数 m_FileName および m_Background を初期化します。
CDemoATLCtrl()
// Added for Rogue Wave Views.
: m_Ctrl(0), m_FileName(), m_Background(-1)
// End Added for Rogue Wave Views.
{
m_bWindowOnly = TRUE;
}
setFileName メンバー関数の追加
このメンバー関数を DemoCtrl クラスに追加する必要があります。この関数には、新しいファイル名を示すタイプ const char* のパラメーターが 1 つあります。その目的は、対応ファイルのロードです。
1. DemoCtrl::setFileName の宣言を、ファイルDemoCtrl.h に追加します。
void setFileName(CComBSTR& fileName);
2. DemoCtrl::setFileName の宣言を、ファイルDemoCtrl.cpp に追加します。
void
DemoCtrl::setFileName(CComBSTR& fileName)
{
if (!fileName || !fileName.Length())
return;
IlvManager* manager = getManager();
if (!manager)
return;
manager->initReDraws();
manager->deleteAll(IlvTrue, IlvFalse);
size_t len = wcstombs(0, fileName.m_str, 10000) + 1;
char* path = new char[len];
wcstombs(path, fileName.m_str, len);
manager->read(path);
delete [] path;
manager->fitTransformerToContents(getManagerView());
manager->reDrawViews();
}
setBackground メンバー関数の追加
このメンバー関数を DemoCtrl クラスに追加する必要があります。この関数には、新しい色を示すタイプ OLE_COLOR のパラメーターが 1 つあります。その目的は、OLE_COLOR を Rogue Wave Views が解釈し、ビューを再描画できる IlvColor* に変更することです。
1. DemoCtrl::setBackground の宣言を、ファイルDemoCtrl.h に追加します。
void setBackground(OLE_COLOR);
2. DemoCtrl::setBackground の定義を、ファイルDemoCtrl.cpp に追加します。
void
DemoCtrl::setBackground(OLE_COLOR oleColor)
{
if (oleColor == -1)
return;
IlvManager* manager = getManager();
if (!manager)
return;
COLORREF colRef;
HPALETTE hPal = NULL;
if (getDisplay()->screenDepth() <= 8)
hPal = HPALETTE(getDisplay()->getPaletteHandle());
if (S_OK != OleTranslateColor(oleColor, hPal, &colRef))
return;
IlvIntensity red, blue, green;
getDisplay()->pixelToRGB((unsigned long)(colRef), red, blue, green);
IlvColor* color = getDisplay()->getColor(red, blue, green);
manager->initReDraws();
manager->setBackground(getManagerView(), color);
manager->reDraw();
manager->reDrawViews();
}
ウィザードで生成されたメンバー関数の変更
1. ウィザードによって生成された DemoATLCtrl.cpp ファイルにあるメンバー関数 CDemoATLCtrl::put_FileName および CDemoATLCtrl::get_FileName を、次のように変更します。
STDMETHODIMP CDemoATLCtrl::put_FileName(BSTR newVal)
{
// TODO:Add your implementation code here
// Added for Rogue Wave Views.
if (!newVal)
return S_OK;
if (m_FileName != newVal) {
m_FileName = newVal;
if (!m_FileName.Length())
m_FileName.Empty();
if (m_Ctrl && !!m_FileName)
m_Ctrl->setFileName(m_FileName);
}
// End Added for Rogue Wave Views.
return S_OK;
}
STDMETHODIMP CDemoATLCtrl::get_FileName(BSTR *pVal)
{
// TODO:Add your implementation code here
// Added for Rogue Wave Views.
return m_FileName.CopyTo(pVal);
// End Added for Rogue Wave Views.
return S_OK;
}
2. ウィザードによって生成された DemoATLCtrl.cpp ファイルにあるメンバー関数 CDemoATLCtrl::put_Background および CDemoATLCtrl::get_Background を、次のように変更します。
STDMETHODIMP CDemoATLCtrl::put_Background(OLE_COLOR newVal)
{
// TODO:Add your implementation code here
// Added for Rogue Wave Views.
if (m_Background != newVal) {
m_Background = newVal;
if (m_Ctrl && (m_Background != -1))
m_Ctrl->setBackground(m_Background);
}
// End Added for Rogue Wave Views.
return S_OK;
}
STDMETHODIMP CDemoATLCtrl::get_Background(OLE_COLOR *pVal)
{
// TODO:Add your implementation code here
// Added for Rogue Wave Views.
*pVal = m_Background;
// End Added for Rogue Wave Views.
return S_OK;
}
プロパティー・マップ・マクロにコード行を追加する
次の行を DemoATLCtrl.h ファイルの BEGIN_PROP_MAP/END_PROP_MAP マクロ宣言ブロックに追加します。
// Added for Rogue Wave Views.
PROP_ENTRY_TYPE("FileName", 1, CLSID_NULL, VT_BSTR)
PROP_ENTRY_TYPE("Background", 2, CLSID_NULL, VT_COLOR)
// End Added for Rogue Wave Views.
CDemoATLCtrl::OnCreate メンバー関数の変更
ファイル DemoATLCtrl.h のメンバー関数 CDemoATLCtrl::OnCreate を変更し、対応プロパティーが定義される時点でファイル名および/または背景色を設定します。
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO:Add Code for message handler.Call DefWindowProc if necessary.
// Added for Rogue Wave Views.
try {
m_Ctrl = new DemoCtrl(m_hWnd);
// Added for the FileName property.
m_Ctrl->setFileName(m_FileName);
// Added for the Background property.
m_Ctrl->setBackground(m_Background);
} catch (...) {
if (m_Ctrl) {
delete m_Ctrl;
m_Ctrl = 0;
}
}
// End Added for Rogue Wave Views.
return 0;
}
プロパティーのテスト
プロパティーのテストには、Internet Explorer を使用できます。Internet Explorer では、ファイル DemoATLCtrl.html を変更して、JavaScript 言語が使用できます。
ここでは FileName プロパティーをテストするため、3 つの定義済み選択肢を持つコンボ・ボックスを使用します。
メモ: この例では、Rogue Wave Views データ・ファイルが ILVHOME または ILVPATH 環境変数パスにインストールされていることを前提にしています。 |
<HEAD>
<TITLE>ATL 3.0 test page for object DemoATLCtrl</TITLE>
</HEAD>
<SCRIPT LANGUAGE = JavaScript>
function load(value)
{
DemoATLCtrl.FileName = value;
}
</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>
</BODY>
</HTML>
メモ: クラス ID が生成されるので、ご使用ファイルのクラス ID がこの例とは異なる場合があります。 |
Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.