手順 3:ActiveX コントロールへカスタム・プロパティーを追加する
この手順では、ActiveX コントロールにファイル名と背景色を追加する方法について説明します。ファイル名は、マネージャーによって読み込まれるファイルの名前です。デフォルトでこのファイルは data/browse.ilv で、これは手順 2 において .rc ファイルにインクルードしました。また背景色は、マネージャー・ビューの背景色になります。
ファイル名プロパティーの追加
1. 「プロジェクト ワークスペース」ウィンドウの「クラス ビュー」タブで DemoMFCLib を拡張し、_DDemoMFC をマウスの右ボタンでクリックして、「追加」 > 「プロパティの追加」を選択します。
2. 「プロパティ名」フィールドに、FileName と入力します。
3. 「Get/Set メソッド」オプションを選択します。
4. 「プロパティの種類」ドロップダウン・リストから、BSTR を選択します。
5. 「パラメータ」リストが空欄であることを確認します。
背景色プロパティーの追加
1. 「プロジェクト ワークスペース」ウィンドウの「クラス ビュー」タブで DemoMFCLib を拡張し、_DDemoMFC をマウスの右ボタンでクリックして、「追加」 > 「プロパティの追加」を選択します。
2. 「プロパティ名」フィールドに、Background と入力します。
3. オプション「Get/Set メソッド」を選択します。
4. 「プロパティーの種類」ドロップダウン・リストから、OLE_COLOR を選択します。
5. 「パラメータ」フィールドは空欄のままにします。
新しいプライベート・メンバー変数の追加
1. 「プロジェクト ワークスペース」ウィンドウの「クラス ビュー」タブで、CDemoMFCCtrl をマウスの右ボタンでクリックします。
2. 表示されるメニューから「追加」 > 「変数の追加」を選択します。
3. 「変数の種類」フィールドに CString、「変数名」フィールドに m_FileName と入力し、「OK」をクリックします。
4. 「追加」 > 「変数の追加」を再び選択します。
5. 「変数の種類」フィールドに OLE_COLOR、「変数名」フィールドに m_Background と入力し、「OK」をクリックします。
CDemoMFCCtrl コンストラクターの変更
ファイル DemoMFCCtl.cpp で CDemoMFCCtrl コンストラクターを次のように変更して、メンバー変数 m_FileName および m_Background を初期化します。
CDemoMFCCtrl()
// Added for Rogue Wave Views.
: m_Ctrl(0), m_FileName(), m_Background(-1)
// End Added for Rogue Wave Views.
{
InitializeIIDs(&IID_DDemoMFC, &IID_DDemoMFCEvents);
// TODO:Initialize your control?s instance data here.
}
setFileName メンバー関数の追加
このメンバー関数を DemoCtrl クラスに追加する必要があります。この関数には、新しいファイル名を示すタイプ const char* のパラメーターが 1 つあります。その目的は、対応ファイルのロードです。
1. DemoCtrl::setFileName の宣言を、ファイルDemoCtrl.h に追加します。
void setFileName(const char*);
2. DemoCtrl::setFileName の宣言を、ファイルDemoCtrl.cpp に追加します。
void
DemoCtrl::setFileName(const char* filename)
{
if (!filename || !*filename)
return;
IlvManager* manager = getManager();
if (!manager)
return;
manager->initReDraws();
manager->deleteAll(IlvTrue, IlvFalse);
manager->read(filename);
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. ウィザードによって生成された DemoMFCCtl.cpp ファイルにあるメンバー関数 CDemoMFCCtrl::SetFileName および CDemoMFCCtrl::GetFileName を、次のように変更します。
BSTR CDemoMFCCtrl::GetFileName()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString strResult;
// TODO:Add your property handler here
strResult = m_FileName;
return strResult.AllocSysString();
}
void CDemoMFCCtrl::SetFileName(LPCTSTR lpszNewValue)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:Add your property handler here
// Added for Rogue Wave Views.
if (!lpszNewValue || !*lpszNewValue)
return;
if (m_FileName != lpszNewValue) {
m_FileName = lpszNewValue;
if (m_Ctrl && m_FileName.GetLength())
m_Ctrl->setFileName(lpszNewValue);
}
// End Added for Rogue Wave Views.
SetModifiedFlag();
}
2. ウィザードによって生成された DemoMFCCtl.cpp ファイルにあるメンバー関数 CDemoMFCCtrl::SetBackground および CDemoMFCCtrl::GetBackground を、次のように変更します。
OLE_COLOR CDemoMFCCtrl::GetBackground()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your dispatch handler code here
return m_Background;
}
void CDemoMFCCtrl::SetBackground(OLE_COLOR nNewValue)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:Add your property handler code here
if (m_Background != nNewValue) {
m_Background = nNewValue;
if (m_Ctrl && (m_Background != -1))
m_Ctrl->setBackground(m_Background);
}
SetModifiedFlag();
}
CDemoMFCCtrl::OnCreate メンバー関数の変更
ファイル DemoMFCCtl.cpp のメンバー関数 CDemoMFCCtrl::OnCreate を変更し、対応プロパティーが定義される時点でファイル名および/または背景色を設定します。
int CDemoMFCCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
// Added for 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 Views.
return 0;
}
プロジェクト設定を変更する
1. プロジェクト プロパティ ページを開きます。
2. 「プロジェクトの設定」ダイアログ・ボックスで、「すべての構成」を選択して、「全般」タブをクリックします。
3. 文字セット で「マルチ バイト文字セットを使用する」を選択します。
プロパティーのテスト
Internet Explorer では、ファイル test.htm を変更して、JavaScript 言語が使用できます。ここでは FileName プロパティーをテストするため、3 つの定義済み選択肢を持つコンボ・ボックスを使用します。
メモ: この例では、Rogue Wave Views データ・ファイルがILVHOME または ILVPATH 環境変数パスにインストールされていることを前提にしています。 |
<HTML>
<HEAD>
<TITLE>Test page for object DemoMFCCtl</TITLE>
</HEAD>
<SCRIPT LANGUAGE = JavaScript>
function load(value)
{
DemoMFCCtrl.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="DemoMFCCtrl"
CLASSID="CLSID:3D31E7B8-400B-
11D3-B74F-00C04F68A89D"></OBJECT>
</BODY>
</HTML>
メモ: クラス ID が生成されるので、ご使用ファイルのクラス ID がこの例とは異なる場合があります。 |
Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.