다음을 통해 공유


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 메서드 수정

수정 하면 이제는 OnDraw Polyctl.h의 방법.추가 코드를 새 펜 및 브러시를 사용 하 여 다각형 그리기를 만들고 호출 하 고 있는 EllipsePolygon 실제 그리기를 수행 하는 Win32 API 함수입니다.

OnDraw 함수를 수정 하려면

  • 기존 대체 OnDraw PolyCtl.h 메서드에서 다음 코드를 사용 합니다.

    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. 변수의 선언 추가 CalcPointsIPolyCtl 공용 부분을 CPolyCtl Polyctl.h의 클래스:

    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. 이 구현을 추가 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 기본 색으로 합니다.

채우기 색을 초기화 하려면

  • 이 줄을 추가 하 여 녹색의 기본 색으로 사용 된 CPolyCtl Polyctl.h의 생성자:

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

이제 생성자는 다음과 같이 나타납니다.

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

빌드 및 컨트롤 테스트

컨트롤을 다시 빌드하십시오.PolyCtl.htm 파일 여전히 열 이면 닫혀 있는지 확인 하 고 다음을 클릭 빌드 다각형 에 있는 빌드 메뉴.다시 PolyCtl.htm 페이지에서에서 컨트롤을 볼 수 있지만이 이번 ActiveX 컨트롤 테스트 컨테이너를 사용 합니다.

ActiveX 컨트롤 테스트 컨테이너를 사용.

  1. 빌드 및 ActiveX 컨트롤 Test Container를 시작 합니다.자세한 내용은 TSTCON 샘플: 컨트롤 테스트 컨테이너 ActiveX.

  2. 테스트 컨테이너에서에 편집 메뉴를 클릭 새 컨트롤 삽입.

  3. 호출 되는 컨트롤을 찾아 PolyCtl Class를 클릭 하 고 확인.원 안에 녹색 삼각형이 표시 됩니다.

다음 절차에 따라 변의 수를 변경해 보십시오.테스트 컨테이너에서 이중 인터페이스의 속성을 수정 하려면 사용 Invoke Methods.

테스트 컨테이너 내에서 컨트롤의 속성을 수정.

  1. 테스트 컨테이너에서 클릭 메서드 호출 에 있는 컨트롤 메뉴.

    메서드 호출 대화 상자가 표시 됩니다.

  2. 선택의 PropPut 버전의 Sides 속성에서의 메서드 이름 드롭다운 목록 상자.

  3. 형식 5 에 매개 변수 값 상자에서 클릭 설정 값를 클릭 하 고 Invoke.

참고 컨트롤은 변경 되지 않습니다.설정 하 여 변의 수를 내부적으로 변경 했지만 m_nSides 변수에서이 컨트롤을 다시 발생 하지 않습니다.다른 응용 프로그램으로 전환한 다음 다시 테스트 컨테이너로 전환 하면 컨트롤 그려져 있고 올바른 변의 수가 있습니다.

이 문제를 해결 하려면 호출을 추가 FireViewChange 에 정의 된 함수를 IViewObjectExImpl, 변의 수를 설정한 후.컨트롤이 자체 창에서 실행 되는 경우 FireViewChange 를 호출 하 여 InvalidateRect 메서드를 직접.컨트롤, 창 없는 실행 하는 경우는 InvalidateRect 컨테이너의 사이트 인터페이스에서 메서드를 호출 합니다.이렇게 자동으로 다시 칠해집니다 컨트롤이 됩니다.

Fireviewchange에 호출을 추가 하려면

  • PolyCtl.cpp 호출을 추가 하 여 업데이트 FireViewChange 에 있는 put_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 자습서