更新 : 2011 年 1 月
プロパティ ページは個別の COM オブジェクトとして実装されるため、必要な場合に共有できます。 この手順では、以下のタスクを実行してプロパティ ページをコントロールに追加します。
プロパティ ページ リソースの作成
プロパティ ページを作成および管理するコードの追加
コントロールへのプロパティ ページの追加
プロパティ ページ リソースの作成
コントロールにプロパティ ページを追加するには、クラスの追加ウィザードを使用します。
プロパティ ページを追加するには
ソリューション エクスプローラーで、Polygon を右クリックします。
ショートカット メニューのをクリックします追加、し クラスの追加。
テンプレートの一覧で [ATL プロパティ ページ] を選択し、[追加] をクリックします。
ATL プロパティ ページ ウィザードが表示されたら、入力PolyProp として、 短い名。
クリックして文字列 を開くには、 文字列 ページし、入力 & 多角形 として、 タイトル。
タイトルのプロパティ ページのタブ ページに表示される文字列です。 ドキュメント文字列プロパティ フレームを使用して、ステータス ラインまたはツール ヒントの説明です。 現在、標準的なプロパティ フレームではこの文字列は使用されないため、既定の内容のままにできます。 ヘルプ ファイルはここでは生成しないため、[ヘルプ ファイル] ボックスのエントリは消去します。
クリックして終了、およびプロパティ ページ オブジェクトが作成されます。
次の 3 つのファイルが作成されます。
ファイル |
説明 |
---|---|
PolyProp.h |
プロパティ ページを実装する CPolyProp という C++ クラスが含まれています。 |
PolyProp.cpp |
PolyProp.h ファイルをインクルードしています。 |
PolyProp.rgs |
プロパティ ページ オブジェクトを登録するレジストリ スクリプトです。 |
コードも次のように変更されます。
Polygon.cpp のオブジェクト エントリ マップに新しいプロパティ ページが追加されます。
Polygon.idl ファイルに PolyProp クラスが追加されます。
プロジェクト リソースに PolyProp.rgs という新しいレジストリ スクリプト ファイルが追加されます。
プロパティ ページのプロジェクト リソースにダイアログ ボックス テンプレートが追加されます。
指定したプロパティ文字列がリソース ストリング テーブルに追加されます。
ここで、プロパティ ページに表示するフィールドを追加します。
プロパティ ページにフィールドを追加するには
ソリューション エクスプローラーで、Polygon.rc リソース ファイルをダブルクリックします。 リソース ビューが表示されます。
リソース ビューで、[Dialog] ノードを展開し、[IDD_POLYPROP] をダブルクリックします。 表示されるダイアログ ボックスには、コントロールの挿入を指示するラベルだけが表示されています。
そのラベルを選択し、それを読むに変更の側面:変更によって、キャプション テキストで、 のプロパティウィンドウ。
[ラベル] ボックスは、テキストのサイズに合わせてにサイズ変更します。
エディット コントロールをツールボックスからラベルの右側にドラッグします。
最後に、変更、ID エディット コントロールの ] を IDC_SIDES[プロパティ] ウィンドウを使用します。
これで、プロパティ ページ リソースの作成プロセスが完了しました。
プロパティ ページを作成および管理するコードの追加
プロパティ ページ リソースの作成が完了したので、次に実装コードを作成する必要があります。
最初に、有効にする、CPolyPropクラスのオブジェクトの辺の数を設定するとき、適用ボタンが押されました。
Apply 関数を変更して辺の数を設定するには
置き換える、ApplyPolyProp.h の機能を次のコード。
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 を呼び出して、エディット ボックスから取得された値を設定します。 使用している、ために CComQIPtrクラスは、実行、QueryInterfaceを取得するには、各オブジェクトに、IPolyCtlからインターフェイス、IUnknownインターフェイス (内、m_ppUnk配列)。
コードは、次に Sides プロパティの設定が実際に機能するかどうかを調べます。 それが失敗した場合は、コードからのエラーの詳細を表示するメッセージ ボックスが表示されます、IErrorInfoフェース。 通常、コンテナー オブジェクトを要求する、ISupportErrorInfoフェースと呼び出しInterfaceSupportsErrorInfo最初のオブジェクトが設定エラー情報をサポートしているかどうかを確認するには。 このタスクは省略することもできます。
CComPtrを呼び出す必要はありませんので、自動的に参照カウントを処理することによってことができますReleaseインターフェイス。 CComBSTRことができますBSTR決勝を実行する必要はありませんので、処理SysFreeStringを呼び出します。 変換することができますも、さまざまな文字列変換のクラスの 1 つ使用して、BSTR必要な場合 (これはなぜです、USES_CONVERSIONマクロは、関数の開始時)。
またことを示す、プロパティ ページのダーティ フラグを設定する必要があります、適用ボタンを有効にする必要があります。 値を変更する場合に発生します、側面ボックスを編集します。
[適用] ボタンを処理するには
[クラス ビュー] で CPolyProp を右クリックし、ショートカット メニューの [プロパティ] をクリックします。
[プロパティ] ウィンドウをクリックして、のイベントアイコン。
展開し、IDC_SIDESイベントの一覧のノード。
選択EN_CHANGE、し、右側のドロップ ダウン メニューから**<Add> OnEnChangeSides**。 OnEnChangeSides ハンドラーの宣言が Polyprop.h に追加され、ハンドラーの実装が Polyprop.cpp に追加されます。
次に、ハンドラーを変更します。
OnEnChangeSides メソッドを変更するには
Polyprop.cpp の次のコードを OnEnChangeSides メソッドに追加します。ウィザードによって挿入されたコードはすべて削除してください。
LRESULT CPolyProp::OnEnChangeSides(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { SetDirty(TRUE); return 0; }
OnEnChangeSides呼び出される、WM_COMMANDメッセージが送信されると、EN_CHANGEの通知をIDC_SIDESコントロール。 OnEnChangeSides は SetDirty を呼び出して TRUE を渡し、プロパティ ページに変更が加えられているため [適用] ボタンを有効にする必要があることを知らせます。
コントロールへのプロパティ ページの追加
プロジェクト内に複数のコントロールが存在することがあるため、クラスの追加ウィザードおよび 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 に読み込んで、デザイン時に Sides の数を設定する場合に便利です。 Sides の数が保存されるため、Visual Basic プロジェクトを再読み込みしたときに、Sides の数が復元されます。
コントロールのビルドと動作確認
ここで、コントロールをビルドし、ActiveX コントロール テスト コンテナーに挿入します。 テスト コンテナーでの編集 メニューのをクリックします PolyCtl クラス オブジェクト。 [プロパティ] ページが表示されます。 クリックして、ポリゴン タブ。
適用ボタンは最初は無効にします。 値を入力を開始、の側面 ボックス、 適用 ボタンが有効になります。 値の入力が完了したら、クリックして、適用ボタン。 コントロールの表示の変更、および、適用ボタンが無効になって再び。 無効な値の入力を試してください。 put_Sides 関数で設定したエラーの詳細を示すメッセージ ボックスが表示されます。
次の手順では、コントロールを Web ページに配置します。
参照
参照
ATL チュートリアル: Web ページ内の ActiveX コントロール
履歴の変更
日付 |
History |
理由 |
---|---|---|
2011 年 1 月 |
精度を更新します。 |
カスタマー フィードバック |