Udostępnij za pośrednictwem


Zmiana kodu rysującego (ATL — Samouczek, część 4)

Domyślnie formantu rysunku kod wyświetla kwadrat i tekst PolyCtl.W tym kroku będzie zmienić kod, aby wyświetlić coś bardziej interesujące.Obejmuje następujące zadania:

  • Modyfikowanie pliku nagłówka

  • Modyfikowanie OnDraw funkcji

  • Dodanie metody obliczania punktów Wielokąt

  • Inicjowanie kolor wypełnienia

Modyfikowanie pliku nagłówka

Start, dodając obsługę funkcji matematycznych sin i cos, który będzie używany obliczyć punkty wielokąta i utworzenie tablicy do przechowywania pozycji.

Aby zmodyfikować plik nagłówka

  1. Dodawanie linii #include <math.h> do góry PolyCtl.h.U góry pliku powinna wyglądać następująco:

    #include <math.h>
    #include "resource.h"        // main symbols
    
  2. Gdy punkty Wielokąt są obliczane, będą przechowywane w tablicy typu POINT, więc dodać tablicy po definicji m_nSides w PolyCtl.h:

    POINT m_arrPoint[100];
    

Modyfikując metodę OnDraw

Teraz należy zmodyfikować OnDraw metody PolyCtl.h.Tworzy nowy pióra i pędzla, z którym Rysuj wielokąt na kod będzie dodać, a następnie wywołuje Ellipse i Polygon funkcji Win32 API do wykonania rzeczywistej rysunku.

Aby zmodyfikować funkcji OnDraw

  • Zastąpić istniejące OnDraw metodę w PolyCtl.h z następującego kodu:

    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;
    }
    

Dodanie metody obliczania punktów Wielokąt

Dodaj metodę o nazwie CalcPoints, która obliczy współrzędne punktów tworzących wielokąt obwodu.Te obliczenia będą oparte na zmiennej RECT, który jest przekazywany do funkcji.

Aby dodać metodę CalcPoints

  1. Dodać deklarację CalcPoints do IPolyCtl publicznej sekcji CPolyCtl klasy w PolyCtl.h:

    void CalcPoints(const RECT& rc);
    

    Ostatnia część sekcji publicznych CPolyCtl klasy będzie wyglądać następująco:

       void FinalRelease()
       {
       }
    public:
       STDMETHOD(get_Sides)(short* pVal);
       STDMETHOD(put_Sides)(short newVal);
       void CalcPoints(const RECT& rc);
    
  2. Ta implementacja dodać CalcPoints funkcji do końca 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;
       }
    }
    

Inicjowanie kolor wypełnienia

Inicjowanie m_clrFillColor z domyślnego koloru.

Aby zainicjować kolor wypełnienia

  • Użyj zielony jako kolor domyślny dodając ten wiersz, aby CPolyCtl Konstruktor w PolyCtl.h:

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

Konstruktor teraz wygląda następująco:

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

Tworzenie i testowanie formantu

Odbuduj formantu.Upewnij się, jeśli jest wciąż otwarty plik PolyCtl.htm jest zamknięte, a następnie kliknij Utworzyć wielokąt na budować menu.Można wyświetlić sterowania ponownie ze strony PolyCtl.htm, ale tym razem używać kontenera ActiveX kontroli badań.

Aby użyć kontenera ActiveX kontroli badań

  1. Budowanie i rozpocznij kontenera ActiveX kontroli badań.Aby uzyskać więcej informacji, zobacz TSTCON próbki: kontener testu formantu ActiveX.

  2. W kontenerze badania na Edytuj menu, kliknij Wstawić nowy formant.

  3. Zlokalizuj formantu, który zostanie wywołany PolyCtl Classi kliknij przycisk OK.Zostanie wyświetlony zielony trójkąt w okręgu.

Spróbuj zmienić liczbę boków, wykonując procedurę dalej.Aby zmodyfikować właściwości na podwójnym interfejsem z wewnątrz kontenera Test, użyj Invoke Methods.

Aby zmodyfikować właściwości formantu z wewnątrz kontenera badania

  1. Kliknij kontener testu Wywołania metody na kontroli menu.

    Wywołać metodę jest wyświetlane okno dialogowe.

  2. Wybierz PropPut wersji Sides właściwość z Nazwa metody pole listy rozwijanej.

  3. Typ 5 w Wartość parametru kliknij Ustaw wartośći kliknij przycisk Invoke.

Należy zauważyć, że formant nie zmienia.Chociaż liczba boków zostanie zmieniona wewnętrznie przez ustawienie m_nSides zmiennej, to nie był przyczyną sterowania do odświeżenia.Po przełączeniu do innej aplikacji i powrócić do kontenera Test, znajdziesz, że formant jest odowieżany i ma poprawną liczbę boków.

Aby rozwiązać ten problem, należy dodać wywołanie FireViewChange funkcję zdefiniowaną w IViewObjectExImpl, po ustawieniu liczbę boków.Jeśli formant jest uruchomiony w osobnym oknie, FireViewChange będzie wywoływać InvalidateRect metoda bezpośrednio.Jeśli formant jest uruchomiony bez okien, InvalidateRect będzie wywoływana metoda interfejsu witryny kontenera.Zmusza to do odświeżenia sam formant.

Aby dodać wywołanie FireViewChange

  • Aktualizacja PolyCtl.cpp przez dodanie wywołania FireViewChange do put_Sides metody.Po zakończeniu, put_Sides metoda powinna wyglądać następująco:

    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"));
       }
    }
    

Po dodaniu FireViewChange, przebudować i spróbuj ponownie w kontenerze Test formantu ActiveX formant.Tym razem, kiedy zmienić liczbę boków i kliknij przycisk Invoke, powinien zostać wyświetlony formant natychmiast zmienić.

W następnym kroku należy dodać zdarzenie.

Wróć do kroku 3 | Do kroku 5

Zobacz też

Zadania

Testowanie właściwości i zdarzeń za pomocą kontenera testu

Informacje

Biblioteka Active Template Library (ATL) — Samouczek