次の方法で共有


手順 4: 描画コードの変更

更新 : 2011 年 1 月

既定では、コントロールの描画コードは、四角形と "PolyCtl" というテキストを表示します。 この手順では、コードを変更して他の形を表示します。 以下のタスクがあります。

  • ヘッダー ファイルの変更

  • OnDraw 関数の変更

  • 多角形の頂点を計算するメソッドの追加

  • 塗りつぶす色の初期化

ヘッダー ファイルの変更

最初に、多角形の頂点を計算する sincos などの数値演算関数のサポートを追加し、頂点の位置を格納する配列を作成します。

ヘッダー ファイルを変更するには

  1. 行を追加#include <math.h>PolyCtl.h の上に。 ファイルの先頭は次のようになります。

    #include <math.h>
    #include "resource.h"       // main symbols
    
  2. 多角形の点が計算されると、型の配列に格納されますPOINT、ので配列の定義後に追加m_nSidesPolyCtl.h の。

    POINT m_arrPoint[100];
    

OnDraw メソッドの変更

ここで PolyCtl.h の OnDraw メソッドを変更してください。 追加のコード、新しいペンとは、多角形を描画するブラシを作成し、EllipsePolygonWin32 API 関数の実際の描画を実行します。

OnDraw 関数を変更するには

  • PolyCtl.h の OnDraw メソッドを次のコードで置き換えます。

    HRESULT CPolyCtl::OnDraw(ATL_DRAWINFO& di)
    {
       RECT& rc = *(RECT*)di.prcBounds;
       HDC hdc  = di.hdcDraw;
    
       COLORREF    colFore;
       HBRUSH      hOldBrush, hBrush;
       HPEN        hOldPen, hPen;
    
       // Translate m_colFore into a COLORREF type
       OleTranslateColor(m_clrFillColor, NULL, &colFore);
    
       // Create and select the colors to draw the circle
       hPen = (HPEN)GetStockObject(BLACK_PEN);
       hOldPen = (HPEN)SelectObject(hdc, hPen);
       hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
       hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
    
       Ellipse(hdc, rc.left, rc.top, rc.right, rc.bottom);
    
       // Create and select the brush that will be used to fill the polygon
       hBrush    = CreateSolidBrush(colFore);
       SelectObject(hdc, hBrush);
    
       CalcPoints(rc);
       Polygon(hdc, &m_arrPoint[0], m_nSides);
    
       // Select back the old pen and brush and delete the brush we created
       SelectObject(hdc, hOldPen);
       SelectObject(hdc, hOldBrush);
       DeleteObject(hBrush);
    
       return S_OK;
    }
    

多角形の頂点を計算するメソッドの追加

多角形の辺を構成する頂点の座標を計算する、CalcPoints というメソッドを追加します。 この計算は、関数に渡す RECT 変数に基づいて行われます。

CalcPoints メソッドを追加するには

  1. PolyCtl.h の CPolyCtl クラスの IPolyCtl パブリック セクションに、CalcPoints という宣言を追加します。

    void CalcPoints(const RECT& rc);
    

    CPolyCtl クラスのパブリック セクションの最後の部分は、次のようになります。

       void FinalRelease()
       {
       }
    public:
       STDMETHOD(get_Sides)(short* pVal);
       STDMETHOD(put_Sides)(short newVal);
       void CalcPoints(const RECT& rc);
    
  2. PolyCtl.cpp の最後に CalcPoints 関数の次の実装を追加します。

    void CPolyCtl::CalcPoints(const RECT& rc)
    {
       const double pi = 3.14159265358979;
       POINT   ptCenter;
       double  dblRadiusx = (rc.right - rc.left) / 2;
       double  dblRadiusy = (rc.bottom - rc.top) / 2;
       double  dblAngle = 3 * pi / 2;          // Start at the top
       double  dblDiff  = 2 * pi / m_nSides;   // Angle each side will make
       ptCenter.x = (rc.left + rc.right) / 2;
       ptCenter.y = (rc.top + rc.bottom) / 2;
    
       // Calculate the points for each side
       for (int i = 0; i < m_nSides; i++)
       {
          m_arrPoint[i].x = (long)(dblRadiusx * cos(dblAngle) + ptCenter.x + 0.5);
          m_arrPoint[i].y = (long)(dblRadiusy * sin(dblAngle) + ptCenter.y + 0.5);
          dblAngle += dblDiff;
       }
    }
    

塗りつぶす色の初期化

既定の色で m_clrFillColor を初期化します。

塗りつぶす色を初期化するには

  • 既定の色を緑にするために、PolyCtl.h の CPolyCtl コンストラクターに次の行を追加します。

    m_clrFillColor = RGB(0, 0xFF, 0);
    

コンストラクターは、次のようになります。

CPolyCtl()
{
   m_nSides = 3;
   m_clrFillColor = RGB(0, 0xFF, 0);
}

コントロールのビルドと動作確認

コントロールを再度ビルドします。 PolyCtl.htm ファイルが閉じられる場合はそれが開いているかどうかを確認し、多角形構築 で、 ビルドメニュー。 コントロールを再度 PolyCtl.htm ページで表示することもできますが、ここでは ActiveX コントロール テスト コンテナーを使用します。

ActiveX コントロール テスト コンテナーを使用するには

  1. ActiveX コントロール テスト コンテナーをビルドして起動します。 詳細については、「TSTCON サンプル:ActiveX コントロール テスト コンテナ」を参照してください。

  2. テスト コンテナーの [編集] メニューの [新しいコントロールを挿入] をクリックします。

  3. 作成した PolyCtl Class コントロールを指定し、[OK] をクリックします。 円の中に緑の三角形が表示されます。

次の手順で辺の数を変更してみます。 使用してテスト コンテナー内のデュアル インターフェイスのプロパティを変更するには、Invoke Methods

テスト コンテナーでコントロールのプロパティを変更するには

  1. テスト コンテナーの [コントロール] メニューの [メソッドの呼び出し] をクリックします。

    [メソッドの呼び出し] ダイアログ ボックスが表示されます。

  2. 選択、PropPutのバージョンは、Sidesプロパティから、メソッド名ドロップダウン リスト ボックス。

  3. 型5 で、 パラメーター値 ボックス、] をクリックします 設定値、し 呼び出し

コントロールは変更されません。 m_nSides 変数を設定して内部的に辺の数を変更したにもかかわらず、コントロールの再描画が行われていません。 ここで、ほかのアプリケーションに切り替えてからテスト コンテナーに戻ると、コントロールの再描画が行われて、正しい辺の数になります。

この問題を解決するには、辺の数を設定した後で、IViewObjectExImpl で定義されている FireViewChange 関数呼び出しを追加します。 ウィンドウ内でコントロールを実行している場合は、FireViewChangeInvalidateRect メソッドを直接呼び出します。 コントロールをウィンドウなしで実行している場合は、コンテナーのサイト インターフェイスで InvalidateRect メソッドが呼び出されます。 これにより、コントロールが自動的に再描画されます。

FireViewChange の呼び出しを追加するには

  • put_Sides メソッドに対する FireViewChange 呼び出しを追加して、PolyCtl.cpp を更新します。 追加すると、put_Sides メソッドは次のようになります。

    STDMETHODIMP CPolyCtl::put_Sides(short newVal)
    {
       if (2 < newVal && newVal < 101)
       {
          m_nSides = newVal;
          FireViewChange();
          return S_OK;
       }
       else
       {
          return Error(_T("Shape must have between 3 and 100 sides"));
       }
    }
    

FireViewChange を追加した後で再度ビルドを行い、ActiveX コントロール テスト コンテナーでコントロールの動作を確認します。 今回は、辺の数を変更してから [呼び出し] をクリックすると、コントロールがすぐに変化します。

次の手順でイベントを追加します。

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

参照

処理手順

テスト コンテナーでのプロパティとイベントのテスト

参照

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

履歴の変更

日付

History

理由

2011 年 1 月

精度を更新します。

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