手順 6: プロパティ ページの追加
プロパティ ページは、必要に応じて共有できるようにする別の COM オブジェクトとして実装されます。この手順では、コントロールにプロパティ ページを追加します:次のタスクを実行します。
プロパティ ページのリソースの作成
プロパティ ページを作成および管理するためのコードを追加します。
コントロールへのプロパティ ページの追加
プロパティ ページのリソースの作成
コントロールのプロパティ ページを追加するには、ATL クラス追加ウィザードを使用します。
プロパティ ページを追加するには
ソリューション エクスプローラーで、多角形を右クリックします。
ショートカット メニューの [追加] をポイントし、[クラスの追加] をクリックします。
テンプレートを選択します [ATL プロパティ ページ]、をクリック 追加の一覧のをクリックします。
ATL プロパティ ページのウィザードが表示されたら、短い の名前として PolyProp を入力します。
[文字列] のページを開き、**[タイトル]**として *** &Polygon *** に入るときに [文字列] をクリックします。
プロパティ ページの [タイトル] はそのページのタブに表示される文字列です。[ドキュメント文字列] はプロパティ フレームがステータス ラインまたはツール ヒントに設定する説明します。標準のプロパティ フレームが現在この文字列を使用しないため、既定のコンテンツをそのままにすることに注意してください。[ヘルプ ファイル] を、生成しません。そのため、そのテキスト ボックスのエントリを削除します。
**[完了]**をクリックすると、プロパティ ページ オブジェクトが作成されます。
次の 3 種類のファイルが作成されます:
File |
説明 |
---|---|
PolyProp.h |
プロパティ ページを実装する C++ クラス CPolyPropが含まれています。 |
PolyProp.cpp |
PolyProp.h ファイルが含まれています。 |
PolyProp.rgs |
プロパティ ページ オブジェクトを登録するレジストリ スクリプト。 |
次のコード変更は、変更されます:
新しいプロパティ ページは Polygon.cpp のオブジェクトのエントリ マップに追加されます。
PolyProp のクラスは Polygon.idl ファイルに追加されます。
新しいレジストリ スクリプト ファイル PolyProp.rgs は、プロジェクト リソースに追加されます。
ダイアログ ボックスのテンプレートは、プロパティ ページのプロジェクト リソースに追加されます。
指定したプロパティの文字列は、リソース文字列テーブルに追加されます。
これは、プロパティ ページに表示できするフィールドを追加します。
フィールドをプロパティ ページに追加するには
ソリューション エクスプローラーで、Polygon.rc のリソース ファイルをダブルクリックします。これにより、リソース ビューを開きます。
リソース ビューで、ダイアログ ボックスのノードを展開し、IDD_POLYPROP をダブルクリックします。ダイアログ ボックスのコントロールをここに挿入するように指示するラベルを除き、空であることに注意してください。
そのラベルを選択し、*** プロパティ *** のウィンドウの [キャプション] のテキストの変更によって 側: を読み込むように変更します。
テキストのサイズに合うように、ラベル ボックスのサイズを変更します。
ラベルの右側にツールボックスから編集コントロールをドラッグします。
最後に、プロパティ ウィンドウを使用して IDC_SIDES にエディット コントロールの *** ID *** を変更します。
これは、プロパティ ページのリソースを作成するプロセスを完了します。
プロパティ ページを作成および管理するためのコードを追加します。
プロパティ ページのリソースを作成したので、実装コードを記述する必要があります。
最初に [適用] のボタンを押すと、オブジェクトの辺の数を設定することを CPolyProp のクラスで使用できるようにします。
適用を辺の数を設定するように変更するには作用します。
次のコードで PolyProp.h の Apply 関数を置換します:
STDMETHOD(Apply)(void) { USES_CONVERSION; ATLTRACE(_T("CPolyProp::Apply\n")); for (UINT i = 0; i < m_nObjects; i++) { CComQIPtr<IPolyCtl, &IID_IPolyCtl> pPoly(m_ppUnk[i]); short nSides = (short)GetDlgItemInt(IDC_SIDES); if FAILED(pPoly->put_Sides(nSides)) { CComPtr<IErrorInfo> pError; CComBSTR strError; GetErrorInfo(0, &pError); pError->GetDescription(&strError); MessageBox(OLE2T(strError), _T("Error"), MB_ICONEXCLAMATION); return E_FAIL; } } m_bDirty = FALSE; return S_OK; }
プロパティ ページでは、一度にアタッチされた複数のクライアント Apply ための関数のループで、エディット ボックスから取得した値を使用して、各クライアントの put_Sides を呼び出します。IUnknown のインターフェイスから IPolyCtl のインターフェイスを実行 CComQIPtr のクラスを使用しています ( m_ppUnk の配列に格納されて取得するために、各オブジェクトのを QueryInterface。
コードは、Sides のプロパティを設定すると、実際に機能することを確認します。失敗した場合、コードは IErrorInfo のインターフェイスからエラーの詳細を表示するメッセージ ボックスを表示します。通常、コンテナーは ISupportErrorInfo のインターフェイスをオブジェクトに依存 InterfaceSupportsErrorInfo、最初にを呼び出して、オブジェクトが設定エラー情報をサポートするかどうかを確認する。このタスクを省略できます。
CComPtr は自動的に参照カウントを処理することによって、そのインターフェイスの Release を呼び出す必要はありません。CComBSTR が処理中である BSTR とために役立ちます SysFreeString の最終的な呼び出しを実行する必要はありません。また、さまざまな文字列変換クラスから 1 を使用しているため、BSTR を必要に応じて変換できます。そのために USES_CONVERSION のマクロは関数の先頭にあります)。
また [適用] のボタンを有効にする必要があることを示す場合は、プロパティ ページのダーティなフラグを設定する必要があります。これは、ユーザーが [側面] のエディット ボックスの値を変更した場合に発生します。
ボタンの適用を処理するには
クラス ビューで、CPolyProp を右クリックし、ショートカット メニューの *** プロパティ *** をクリックします。
[プロパティ]ウィンドウで、[イベント] のアイコンをクリックします。
イベントの一覧の IDC_SIDES のノードを展開します。
ドロップダウン メニューから右への EN_CHANGE、を選択し、をクリック Add *** OnEnChangeSides ***。OnEnChangeSides のハンドラーの宣言は、Polyprop.cpp への Polyprop.h とハンドラーの実装に追加されます。
次に、ハンドラーを変更します。
OnEnChangeSides のメソッドを変更するには
OnEnChangeSides のメソッドに Polyprop.cpp に次のコードを追加します (コードをそのに設定されているウィザード削除する) :
LRESULT CPolyProp::OnEnChangeSides(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { SetDirty(TRUE); return 0; }
OnEnChangeSides は WM_COMMAND のメッセージが IDC_SIDES のコントロールの EN_CHANGE 通知が送信されるときに呼び出されます。OnEnChangeSides は、SetDirty を呼び出し、プロパティ ページを示すパス TRUE は、変更されて、[適用] のボタンが有効になります。
コントロールへのプロパティ ページの追加
プロジェクトに複数のコントロールを持つことができるため、ATL のクラス追加ウィザードと ATL プロパティ ページのウィザードは、のコントロールのプロパティ ページを自動的に追加されません。コントロールのプロパティ マップにエントリを追加する必要があります。
プロパティ ページを追加するには
開いている PolyCtl.h は、プロパティ マップに次の行を追加し、:
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT)
コントロールのプロパティ マップは次のようになります。:
BEGIN_PROP_MAP(CPolyCtl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
#ifndef _WIN32_WCE
PROP_ENTRY_TYPE("FillColor", DISPID_FILLCOLOR, CLSID_StockColorPage, VT_UI4)
#endif
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
コントロールが保存されるときに保存、プロパティ ページの CLSID の PROP_PAGE のマクロ、または示すように PROP_ENTRY マクロを使用すると、Sides のプロパティ値を追加した場合があります。
マクロを 3 回パラメーターはプロパティの説明、プロパティの DISPID、およびのプロパティを持つプロパティ ページの CLSID です。これは便利です (Visual Basic にコントロールを読み込み、デザイン時に辺の数を設定します。辺の数が保存されるため、Visual Basic プロジェクトを再度読み込むと、辺の数が復元されます。
コントロールのビルドとテスト
次に、コントロールをビルドして ActiveX コントロール テスト コンテナーに挿入されます。テスト コンテナーで、[編集] のメニューのをクリック *** PolyCtl のクラス オブジェクト ***。プロパティ ページが表示されます; [多角形] のタブをクリックします。
[適用] のボタンは、最初に無効になります。[側面] ボックスの値の入力を開始すると [適用] のボタンが有効になるようにします。値の入力が完了した後 [適用] のをクリックします。コントロールの表示が変更され、[適用] のボタンが再び無効になります。無効な値を入力します。メッセージ ボックスをこと put_Sides の関数からの設定、エラーの説明が含まれていることがわかります。
次に、Web ページにコントロールを設定します。