次の方法で共有


手順 6: プロパティ ページの追加

更新 : 2011 年 1 月

プロパティ ページは個別の COM オブジェクトとして実装されるため、必要な場合に共有できます。 この手順では、以下のタスクを実行してプロパティ ページをコントロールに追加します。

  • プロパティ ページ リソースの作成

  • プロパティ ページを作成および管理するコードの追加

  • コントロールへのプロパティ ページの追加

プロパティ ページ リソースの作成

コントロールにプロパティ ページを追加するには、クラスの追加ウィザードを使用します。

プロパティ ページを追加するには

  1. ソリューション エクスプローラーで、Polygon を右クリックします。

  2. ショートカット メニューのをクリックします追加、し クラスの追加

  3. テンプレートの一覧で [ATL プロパティ ページ] を選択し、[追加] をクリックします。

  4. ATL プロパティ ページ ウィザードが表示されたら、入力PolyProp として、 短い名。

  5. クリックして文字列 を開くには、 文字列 ページし、入力 & 多角形 として、 タイトル

    タイトルのプロパティ ページのタブ ページに表示される文字列です。 ドキュメント文字列プロパティ フレームを使用して、ステータス ラインまたはツール ヒントの説明です。 現在、標準的なプロパティ フレームではこの文字列は使用されないため、既定の内容のままにできます。 ヘルプ ファイルはここでは生成しないため、[ヘルプ ファイル] ボックスのエントリは消去します。

  6. クリックして終了、およびプロパティ ページ オブジェクトが作成されます。

次の 3 つのファイルが作成されます。

ファイル

説明

PolyProp.h

プロパティ ページを実装する CPolyProp という C++ クラスが含まれています。

PolyProp.cpp

PolyProp.h ファイルをインクルードしています。

PolyProp.rgs

プロパティ ページ オブジェクトを登録するレジストリ スクリプトです。

コードも次のように変更されます。

  • Polygon.cpp のオブジェクト エントリ マップに新しいプロパティ ページが追加されます。

  • Polygon.idl ファイルに PolyProp クラスが追加されます。

  • プロジェクト リソースに PolyProp.rgs という新しいレジストリ スクリプト ファイルが追加されます。

  • プロパティ ページのプロジェクト リソースにダイアログ ボックス テンプレートが追加されます。

  • 指定したプロパティ文字列がリソース ストリング テーブルに追加されます。

ここで、プロパティ ページに表示するフィールドを追加します。

プロパティ ページにフィールドを追加するには

  1. ソリューション エクスプローラーで、Polygon.rc リソース ファイルをダブルクリックします。 リソース ビューが表示されます。

  2. リソース ビューで、[Dialog] ノードを展開し、[IDD_POLYPROP] をダブルクリックします。 表示されるダイアログ ボックスには、コントロールの挿入を指示するラベルだけが表示されています。

  3. そのラベルを選択し、それを読むに変更の側面:変更によって、キャプション テキストで、 のプロパティウィンドウ。

  4. [ラベル] ボックスは、テキストのサイズに合わせてにサイズ変更します。

  5. エディット コントロールをツールボックスからラベルの右側にドラッグします。

  6. 最後に、変更、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マクロは、関数の開始時)。

またことを示す、プロパティ ページのダーティ フラグを設定する必要があります、適用ボタンを有効にする必要があります。 値を変更する場合に発生します、側面ボックスを編集します。

[適用] ボタンを処理するには

  1. [クラス ビュー] で CPolyProp を右クリックし、ショートカット メニューの [プロパティ] をクリックします。

  2. [プロパティ] ウィンドウをクリックして、のイベントアイコン。

  3. 展開し、IDC_SIDESイベントの一覧のノード。

  4. 選択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コントロール。 OnEnChangeSidesSetDirty を呼び出して 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 ページに配置します。

手順 5 に戻る | 手順 7 に進む

参照

参照

ATL チュートリアル: Web ページ内の ActiveX コントロール

履歴の変更

日付

History

理由

2011 年 1 月

精度を更新します。

カスタマー フィードバック