Condividi tramite


Passaggio 4: Modificare il codice di disegno

Per impostazione predefinita, il codice di disegno del controllo viene visualizzato un quadrato e il testo PolyCtl.In questo passaggio, verrà modificato il codice per visualizzare un nome più efficaci.Le seguenti attività interessate:

  • Modificare il file di intestazione

  • Modificare la funzione OnDraw

  • Aggiunta di un metodo per calcolare i punti del poligono

  • Inizializzare il colore di riempimento

Modificare il file di intestazione

L'inizio aggiunta del supporto per le funzioni matematiche sin e cos, che verranno utilizzati calcola i punti del poligono e creando una matrice per archiviare le posizioni.

Per modificare il file di intestazione

  1. Aggiungere la riga #include <math.h> all'inizio di PolyCtl.h.La parte superiore del file deve essere:

    #include <math.h>
    #include "resource.h"       // main symbols
    
  2. Una volta che i punti del poligono viene calcolata, verranno archiviati in una matrice di tipo POINT, in modo da aggiungere la matrice dopo la definizione m_nSides in PolyCtl.h:

    POINT m_arrPoint[100];
    

Modificare il metodo di OnDraw

Ora è necessario modificare il metodo OnDraw in PolyCtl.h.Il codice che si crea una nuova penna e pennello con cui disegnare il poligono e quindi chiama le funzioni Polygon e Ellipse API Win32 per eseguire il disegno effettivo.

Per modificare la funzione di OnDraw

  • Sostituire il metodo esistente OnDraw in PolyCtl.h con il codice seguente:

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

Aggiunta di un metodo per calcolare i punti del poligono

Aggiungere un metodo, chiamato CalcPoints, che calcolerà le coordinate di punti che costituiscono il perimetro del poligono.Questi calcoli si basano sulla variabile RECT passato alla funzione.

Per aggiungere il metodo di CalcPoints

  1. Aggiungere la dichiarazione CalcPoints la sezione pubblica IPolyCtl della classe CPolyCtl in PolyCtl.h:

    void CalcPoints(const RECT& rc);
    

    L'ultima parte della sezione pubblica della classe CPolyCtl risulterà simile alla seguente:

       void FinalRelease()
       {
       }
    public:
       STDMETHOD(get_Sides)(short* pVal);
       STDMETHOD(put_Sides)(short newVal);
       void CalcPoints(const RECT& rc);
    
  2. Aggiungere questa implementazione della funzione CalcPoints alla fine di 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;
       }
    }
    

Inizializzare il colore di riempimento

Inizializzare m_clrFillColor con un colore predefinito.

Per inizializzare il colore di riempimento

  • Utilizzare il verde come colore predefinito aggiungere questa riga nel costruttore CPolyCtl in PolyCtl.h:

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

Gli aspetti del costruttore sarà la seguente:

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

Compilazione e test il controllo

Ricompilare il controllo.Assicurarsi che il file PolyCtl.htm venga chiuso se è ancora aperto e quindi fare clic Poligono compilazione il menu Compilazione.È possibile visualizzare nuovamente il controllo dalla pagina PolyCtl.htm, ma questo utilizzo di compilazione del controllo ActiveX control Test Container.

Per utilizzare il controllo ActiveX control Test Container

  1. Compilare e avviare il controllo ActiveX control Test Container.Per ulteriori informazioni, vedere Esempio TSTCON: ActiveX control Test Container.

  2. In Test Container, scegliere dal menu Modifica, fare clic Inserisci nuovo controllo.

  3. Individuare il controllo, che verrà chiamato PolyCtl Classe scegliere OK.Verrà visualizzato un triangolo verde all'interno di un cerchio.

Provare a modificare il numero di lati seguendo la procedura descritta di seguito.Per modificare le proprietà di un'interfaccia duale interno di Test Container, utilizzare Invoke Methods.

Per modificare la proprietà di un controllo dall'interno di Test Container

  1. In Test Container, fare clic Richiama metodi il menu controllo.

    La finestra di dialogo Richiama metodo visualizzare.

  2. Selezionare la versione PropPut della proprietà Sides dall'elenco a discesa Nome metodo.

  3. Tipo 5 nella casella Valore parametro fare clic su, Imposta valoree scegliere Richiama.

Si noti che il controllo non cambia.Sebbene modificare il numero di lati internamente impostando la variabile m_nSides, questa non ha causato il controllo da aggiornare.Se si passa a un'altra applicazione e quindi passare di nuovo a Test Container, si scoprirà che il controllo ha aggiornato e il numero corretto dei lati.

Per risolvere il problema, aggiungere una chiamata alla funzione FireViewChange, definita in IViewObjectExImpl, dopo avere impostato il numero di lati.Se il controllo è in esecuzione in una finestra, FireViewChange chiamerà direttamente il metodo InvalidateRect.Se il controllo è in esecuzione senza finestra, il metodo InvalidateRect verrà chiamato sull'interfaccia del sito del contenitore.In questo modo il controllo di aggiornarsi.

Per aggiungere una chiamata a FireViewChange

  • Aggiornare PolyCtl.cpp aggiungendo la chiamata a FireViewChange al metodo put_Sides.Al termine, il metodo put_Sides dovrebbe risultare simile al seguente:

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

Dopo l'aggiunta FireViewChange, la ricompilazione e riprovare il controllo in ActiveX control Test Container.Questa volta quando si modifica il numero di lati e scegliere Invoke, verrà visualizzata la modifica di controllo immediato.

Nel prossimo passaggio, verrà aggiunto un evento.

Per tornare al passaggio 3 | Nel passaggio 5

Vedere anche

Attività

Proprietà ed eventi di test con Test Container

Riferimenti

L'esercitazione ATL