共用方式為


步驟 4:變更繪圖程式碼

根據預設,控制項的繪圖程式碼顯示方形和文字 PolyCtl。 在這個步驟中,您會變更程式碼顯示更多的事情。 是包含下列工作的:

  • 修改標頭檔

  • 修改 OnDraw 函式

  • 將方法計算多邊形點

  • 初始化填滿色彩

修改標頭檔

藉由加入支援開始數學函式 sincos,將使用的建立陣列儲存位置計算多邊形、,和。

修改標頭檔

  1. 將線條 #include _<math.h_> 至 PolyCtl.h 頂端。 在檔案頂端看起來應該如下所示:

    #include <math.h>
    #include "resource.h"       // main symbols
    
  2. 一旦多邊形的計算,則會在陣列中儲存型別 POINT,所以,請在 m_nSides 的定義之後。PolyCtl.h 的將陣列:

    POINT m_arrPoint[100];
    

修改 OnDraw 方法

現在您應該修改在 PolyCtl.h 的 OnDraw 方法。 程式碼將建立自己的繪製多邊形,然後呼叫 EllipsePolygon Win32 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,會計算點座標組成周邊多邊形。 這些計算視傳遞至函式的變數。

將 CalcPoints 方法

  1. 將的宣告變更 CalcPointsCPolyCtl 類別的 IPolyCtl 公開部分在 PolyCtl.h 的:

    void CalcPoints(const RECT& rc);
    

    CPolyCtl 類別的 public 區段的最後一部分如下所示:

       void FinalRelease()
       {
       }
    public:
       STDMETHOD(get_Sides)(short* pVal);
       STDMETHOD(put_Sides)(short newVal);
       void CalcPoints(const RECT& rc);
    
  2. CalcPoints 函式的實作加入至 PolyCtl.cpp 的結尾:

    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並按一下 [確定]。 您會在圓圈中有一個綠色三角形。

嘗試變更邊數依照下一個程序。 若要修改在雙重介面的屬性從測試容器的內部,請使用 Invoke Methods

修改控制項的屬性從測試容器內

  1. 在測試容器,請按一下 [叫用方法] 在 [控制] 功能表。

    [叫用方法] 對話方塊隨即顯示。

  2. 選取 Sides 屬性的 PropPut 版本從 [方法名稱] 下拉式清單方塊。

  3. 在 方塊中輸入 [參數值] 的 5 [設定值],按一下 ,然後按一下 [叫用]。

請注意控制項並不會變更。 雖然您可以設定 m_nSides 變數內部變更的邊數,這不會導致控制項重新繪製。 如果您切換至其他應用程式再切換回測試容器,您會發現控制項重新繪製了其中的正確數目的。

若要修正這個問題,請將呼叫加入至 FireViewChange 函式,定義在 IViewObjectExImpl,因此,在設定之後的數目。 如果控制項在其視窗內執行, FireViewChange 會直接呼叫 InvalidateRect 方法。 如果控制項是無視窗 InvalidateRect 執行,則將呼叫容器的位置介面。 這會強制控制項重新自我繪製。

將呼叫加入至 FireViewChange

  • 藉由將呼叫加入至 PolyCtl.cpp 更新 FireViewChangeput_Sides 方法。 當您完成時, 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 控制項測試容器。 這次,當您變更邊數並按一下 Invoke時,應該立即看到控制項的變更。

在下一個步驟中,您會將事件。

回到步驟 3 | 在 [步驟 5

請參閱

工作

測試用測試容器屬性和事件

參考

ATL 教學課程