Partilhar via


Etapa 4: Alterar o código de desenho

Por padrão, o código de desenho do controle exibe um quadrado e o texto ATL 8.0 : PolyCtl. Nesta etapa, você irá alterar o código para exibir algo mais interessante.As seguintes tarefas estão envolvidas:

  • Modificando o arquivo de cabeçalho

  • Modificando o OnDraw Função

  • Adicionando um método para calcular os pontos do polígono

  • Inicializando a cor de preenchimento

Modificando o arquivo de cabeçalho

Comece adicionando suporte a funções de matemática sin e cos, que será usado calcular os pontos do polígono e criando uma matriz para armazenar posiciona.

Para modificar o arquivo de cabeçalho

  1. Adicionar a linha #include <math.h> na parte superior da PolyCtl.h:

    #include <math.h>
    #include "resource.h"       // main symbols
    
  2. Depois que os pontos do polígono são calculados, eles serão armazenados em uma matriz do tipo POINT, então, adicionar a matriz ao participante da definição de classe no PolyCtl.h:

    POINT m_arrPoint[100];
    

Modificando o método OnDraw

Agora você deve modificar o OnDraw método no PolyCtl.h. O código que você irá adicionar cria um nova caneta e pincel com a qual desenhar o polígono e, em seguida, chama o Elipse and Polígono Funções da API do Win32 para executar o desenho real.

Para modificar a função OnDraw

  • Substituir o existente OnDraw método em PolyCtl.h com o código a seguir:

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

Adicionando um método para calcular os pontos do polígono

Adicionar um método, chamado CalcPoints, que irá calcular as coordenadas dos pontos que compõem o perímetro de polígono. Esses cálculos se baseará na variável de RECT passada para a função.

Para adicionar o método CalcPoints

  1. Adicione a declaração de CalcPoints para o IPolyCtl seção pública das CPolyCtl classe PolyCtl.h:

    void CalcPoints(const RECT& rc);
    

    A última parte da seção pública do CPolyCtl classe terá a seguinte aparência:

       void FinalRelease()
       {
       }
    public:
       STDMETHOD(get_Sides)(short* pVal);
       STDMETHOD(put_Sides)(short newVal);
       void CalcPoints(const RECT& rc);
    
  2. Adicionar essa implementação do CalcPoints função do PolyCtl.cpp participante:

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

Inicializando a cor de preenchimento

Inicializar m_clrFillColor com uma cor padrão.

Para inicializar a cor de preenchimento

  • Usar verde sistema autônomo a cor padrão adicionando esta linha à CPolyCtl construtor no PolyCtl.h:

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

O construtor agora fica assim:

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

Criando e testando o controle

Reconstrua o controle.Certifique-se de que o arquivo PolyCtl.htm esteja fechado se ele ainda está em aberto e, em seguida, clicar Criar polígono on the Compilação menu.Você pode exibir o controle novamente da página PolyCtl.htm, mas isso time usam o contêiner de teste do controle ActiveX.

Para usar o contêiner de teste do controle ActiveX

  1. Criar e iniciar o contêiner de teste do controle ActiveX.Para obter mais informações, consulte Exemplo TSTCON: Controlarar ActiveX Teste recipiente.

  2. No contêiner de teste, sobre o edição menu, clicar Insira o novo controle.

  3. localizar seu controle, que será chamado PolyCtl Classe clicar OK.Você verá um triângulo verde dentro de um círculo.

Tente alterar o número de lados, seguindo o procedimento a seguir.Para modificar propriedades em uma interface dupla de dentro do contêiner de teste, use Invocar métodos.

Para modificar a propriedade do controle de dentro do contêiner de teste

  1. No contêiner de teste, clicar Invocar métodos on the Controle menu.

    The Invocação de método caixa de diálogo é exibida.

  2. selecionar o PropPut o versãoLados propriedade a partir de de Nome do método caixa de listagem drop-down.

  3. Tipo de 5 no Valor de parâmetro clicarconjunto valore clicar Invoke.

Observe que o controle não é alterado.Embora você alterou o número de lados internamente, definindo o m_nSides variável, isso não causar controle redesenhado. Se você alterna para outro aplicativo e retorne ao contêiner de teste, você encontrará o que o controle foi redesenhado e tem o número correto de lados.

Para corrigir esse problema, adicione uma telefonar para o FireViewChange função, definida IViewObjectExImpl, depois de conjunto o número de lados. Se o controle estiver sendo executado em sua própria janela, FireViewChange chamará o InvalidateRect método diretamente. Se o controle estiver em execução sem janelas, a InvalidateRect método será chamado na interface do site do contêiner. Isso faz com que o controle para redesenhar propriamente dito.

Para adicionar uma telefonar para FireViewChange

  • Atualizar PolyCtl.cpp adicionando a telefonar para FireViewChange para o put_Sides método. Quando tiver terminado, a put_Sides método deve ter esta aparência:

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

Depois de adicionar FireViewChange, recompilar e tente o controle novamente no contêiner de teste de controle ActiveX. Dessa vez quando você alterar o número de lados e clicar em Invoke, você deve ver o controle altere imediatamente.

A próxima etapa, você adicionará um evento.

Voltar para etapa 3 | A etapa 5

Consulte também

Tarefas

Teste de propriedades e eventos com o contêiner de teste

Referência

Tutorial do ATL