プロパティ ページは、必要に応じて共有するプロパティ ページは個別の COM オブジェクトとして実装されています。プロパティ ページをコントロールに追加するには、ATL オブジェクト ウィザードを使用することができます。
ATL オブジェクト ウィザードを起動し、左側にカテゴリとしてコントロールを選択します。右側には、プロパティ ページを選択し、次をクリックしてください。
新しいオブジェクトの名前を入力することができますダイアログ ボックスが再び。オブジェクト PolyProp を呼び出すし、短い名前の編集] ボックスに名前を入力。

[インターフェイス] ボックスが淡色表示されている注意してください。カスタム インターフェイスを必要としないプロパティ ページです。
プロパティ ページのタイトルを設定するには [文字列] タブをクリックします。プロパティ ページのタイトルは、ページのタブに表示される文字列です。アンプを入力;多角形タイトルとして。ドキュメント文字列プロパティ フレームを使用して、ステータス ラインまたはツール ヒントの説明です。メモ標準のプロパティ フレームはこの文字列を現在使用しないが、とにかくそれを設定できます。つもりはない、現時点ではヘルプ ファイルを生成、ため、テキスト ボックス内のエントリを消去します。[Ok]と [プロパティ] をクリックしてページのオブジェクトが作成されます。(&A)。

次の 3 つのファイルが作成されます。:
| ファイル | 説明 |
| PolyProp.h | C++ クラスを含む CPolyProp 、プロパティ ページを実装します。 |
| PolyProp.cpp | PolyProp.h ファイルが含まれています。 |
| PolyProp.rgs | プロパティ ページ オブジェクトを登録するレジストリ スクリプト。 |
次のコード変更も加えられます:
PolyProp、Polygon.idl ファイルにクラスを追加。
現在、プロパティ ページに表示するフィールドを追加します。Polygon.rc で、ダイアログ ボックスがここでは、コントロールを挿入するよう指示するラベルを除いて空であることに注意してください。そのラベルを削除し、テキストを含む追加」側面:」。ラベルの横にエディット ボックスを追加し、ID の提供IDC_SIDES。

PolyProp.h ファイルの上部にある Polygon.h を含める:
#include"Polygon.h"nbsp;//IPolyCtl の定義(&N)
今すぐ有効にする、 CPolyProp [適用] ボタンが押されたとき、オブジェクトの辺の数を設定するクラス。変更、 Apply PolyProp.h のように機能。
STDMETHOD(Apply)(void){USES_CONVERSION;ATLTRACE(_T("CPolyProp::Apply\n"));(UINT I = 0; 私は lt; m_nObjects; i + +){CComQIPtr < IPolyCtl、& IID_IPolyCtl > pPoly(m_ppUnk[i]);短い nSides (short)GetDlgItemInt(IDC_SIDES); =失敗した場合 (pPoly - > put_Sides(nSides)){CComPtr <IErrorInfo> pError;CComBSTR strError;GetErrorInfo (0、& pError);pError - > GetDescription(&strError);MessageBox(OLE2T(strError)、_T("Error")、MB_ICONEXCLAMATION);E_FAIL を返す;}}m_bDirty = FALSE;S_OK を返す;}
プロパティ ページに、時に、接続されている 1 つ以上のクライアントができるので、 Apply 関数はループし、呼び出し put_Sides 各クライアントの値を取得、編集ボックスから。取得する各オブジェクトでQueryInterfaceを実行、 CComQIPtrクラスを使用している、 IPolyCtl インターフェイスIUnknownから (内、 m_ppUnk 配列)。
コードは現在、実際に働いた Sides プロパティの設定をチェックします。それが失敗した場合は、コードにIErrorInfoインターフェイスからのエラーの詳細を表示するメッセージ ボックスが表示されます。通常、コンテナー ISupportErrorInfoインターフェイスのオブジェクトを要求し、最初に、オブジェクトが設定エラー情報をサポートしているかどうかを確認するのにInterfaceSupportsErrorInfoを呼び出します。しかし、それをコントロールは、そのチェックを見送ることができます。
CComPtrインターフェイスをリリースを呼び出す必要はありませんので、参照カウントを自動的に処理するで役立ちます。SysFreeStringに対する最後の呼び出しを実行する必要はありませんのでCComBSTR 、 BSTRを処理と、役立ちます。必要な場合 (これが私たちUSES_CONVERSIONマクロ関数の先頭に追加する理由です)、 BSTRを変換することができますので、また各種の文字列変換のクラスの 1 つ使用します。
[適用] ボタンを有効にする必要があることを示すために、プロパティ ページのダーティ フラグを設定することもする必要があります。ユーザー側の編集ボックスの値が変更されたときに発生します。クラス ビューでプロパティ ページ クラス (CPolyProp) を右クリックし、[ショートカット menu.nbsp からWindows メッセージ ハンドラーの追加... ] を選択;を IDC_SIDES [オブジェクト] ボックスから選択し、EN_CHANGE メッセージを追加(&N)。
今の Polyprop.h に次のコードを追加、 OnChangeSides 関数 (ウィザードをそこに任意のコードを削除する):
LRESULT OnChangeSides(WORD wNotify, WORD wID, HWND hWnd, BOOLamp; bHandled){Setdirty (true);0 を返します。}(&A)
OnChangeSidesEN_CHANGE通知をWM_COMMANDメッセージが送信されるときに呼び出されます、 IDC_SIDES コントロール OnChangeSides 次 SetDirty とプロパティ ページは汚れていると、[適用] ボタンを有効にする必要がありますを示すためにTRUEを渡します。
現在、プロパティ ページをコントロールに追加します。プロジェクトに複数のコントロールがあるため、ATL オブジェクト ウィザードこのを自動的に実行されません。PolyCtl.h を開き、この行をプロパティ マップに追加:
ただし (「側面」、1, CLSID_PolyProp)
コントロールのプロパティ マップは、今このように見えます:
BEGIN_PROP_MAP(CPolyCtl)PROP_DATA_ENTRY (「_cx」m_sizeExtent.cx、VT_UI4)PROP_DATA_ENTRY (「_cy」m_sizeExtent.cy、VT_UI4)ただし (「FillColor」DISPID_FILLCOLOR、CLSID_StockColorPage)ただし (「側面」、1, CLSID_PolyProp)//例のエントリ・ ・ただし (「プロパティの説明」, dispid, clsid)//PROP_PAGE(CLSID_StockColorPage)END_PROP_MAP()
追加したが、 PROP_PAGE マクロを使用する場合は、プロパティ ページの CLSID を PROP_ENTRY 示すように、プロパティの値が、コントロールが保存されたときにも保存される側のマクロ。マクロの 3 つのパラメーターは、プロパティの説明、プロパティの DISPID、プロパティがプロパティ ページの CLSID です。たとえば、Visual Basic には、コントロールを読み込むし、辺の数がデザイン時に設定した場合は、これは便利です。辺の数が復元されます、Visual Basic プロジェクトを再読み込みすると、辺の数が保存されますので。
今は、コントロールをビルドし、 ActiveX コントロール テスト コンテナーに挿入します。次に、テスト コンテナーで、[編集] メニューのPolyCtl クラスのオブジェクトをクリックします。[プロパティ] ページが表示されます。[多角形] タブを選択。

[適用] ボタンは、最初に無効になります。開始側の値を入力するボックスを編集し、[適用] ボタンが有効になります。値の入力が完了したら、[適用] ボタンをクリックします。コントロールの表示の変更、[適用] ボタンは再び無効にします。無効な値を入力してから設定、エラーの説明を含むメッセージ ボックスを表示する必要があります、 put_Sides 関数。
次に、Web ページ上のコントロールをあげるよ。