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

プロパティ ページは、必要に応じて共有できるようにする別の COM オブジェクトとして実装されます。この手順では、コントロールにプロパティ ページを追加します:次のタスクを実行します。

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

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

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

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

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

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

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

  2. ショートカット メニューの [追加] をポイントし、[クラスの追加] をクリックします。

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

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

  5. [文字列] のページを開き、**[タイトル]**として *** &Polygon *** に入るときに [文字列] をクリックします。

    プロパティ ページの [タイトル] はそのページのタブに表示される文字列です。[ドキュメント文字列] はプロパティ フレームがステータス ラインまたはツール ヒントに設定する説明します。標準のプロパティ フレームが現在この文字列を使用しないため、既定のコンテンツをそのままにすることに注意してください。[ヘルプ ファイル] を、生成しません。そのため、そのテキスト ボックスのエントリを削除します。

  6. **[完了]**をクリックすると、プロパティ ページ オブジェクトが作成されます。

次の 3 種類のファイルが作成されます:

File

説明

PolyProp.h

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

PolyProp.cpp

PolyProp.h ファイルが含まれています。

PolyProp.rgs

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

次のコード変更は、変更されます:

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

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

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

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

  • 指定したプロパティの文字列は、リソース文字列テーブルに追加されます。

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

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

  1. ソリューション エクスプローラーで、Polygon.rc のリソース ファイルをダブルクリックします。これにより、リソース ビューを開きます。

  2. リソース ビューで、ダイアログ ボックスのノードを展開し、IDD_POLYPROP をダブルクリックします。ダイアログ ボックスのコントロールをここに挿入するように指示するラベルを除き、空であることに注意してください。

  3. そのラベルを選択し、*** プロパティ *** のウィンドウの [キャプション] のテキストの変更によって 側: を読み込むように変更します。

  4. テキストのサイズに合うように、ラベル ボックスのサイズを変更します。

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

  6. 最後に、プロパティ ウィンドウを使用して 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 のマクロは関数の先頭にあります)。

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

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

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

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

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

  4. ドロップダウン メニューから右への 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;
    }
    

OnEnChangeSidesWM_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 ページにコントロールを設定します。

手順 5 に戻します | 手順 7 ~

参照

関連項目

ATL チュートリアル