4 단계: 그리기 코드 변경

다각형 포인트를 계산, 그래서 추가 죄 및 cos 함수를 사용 하는 그리기 코드에서 math.h Polyctl.h의 상단에 포함:

# include lt;math.h >
# include "resource.h" / 기본 / 기호

참고 릴리스 빌드만nbsp;??ATL COM 마법사 기본 프로젝트를 생성 하는 경우 매크로 _ATL_MIN_CRT정의 합니다. 이 매크로 정의 되므로 필요 하지 않으면 귀하의 코드에는 C 런타임 라이브러리를가지고 하지 않습니다. Polygon 컨트롤 부동 소수점 함수를 초기화 하는 C 런타임 라이브러리 시작 코드를 필요로 한다. 따라서, 릴리스 버전을 구축 하고자 하는 경우 _ATL_MIN_CRT 매크로 제거 해야 합니다. 매크로 제거 하려면 프로젝트 메뉴에서 설정 을 클릭 합니다. 에 에 대 한 설정: 드롭 다운 목록, 다중 구성을 선택 합니다. 나타나는 수정 프로젝트 configuration(&s) 선택 대화 상자에서 모든 4 릴리스 버전에 대 한 확인란을 클릭 한 다음 확인을 클릭 합니다. C/c + + 탭에서 일반 범주를 선택한 다음 전처리기 정의 편집 상자에서 _ATL_MIN_CRT 를 제거합니다。

POINT 형식의 배열을 Polyctl.h의 클래스 정의의 끝에 추가 하 여 포인트를 저장 하 되 면 다각형 포인트를 계산 하는:

   OLE_COLOR m_clrFillColor;
   짧은 m_nSides;
   포인트 m_arrPoint [100]

이제 변경 합니다 OnDraw 아래에 맞게 Polyctl.h의 기능. 참고 사각형 및 DrawText 함수에 대 한 호출을 제거 합니다. 또한 명시적으로 당신과 검정 펜 및 흰색 브러시를 선택 합니다. 컨트롤이 없는 실행 하는 경우이 작업을 수행 해야 합니다. 당신은 그리기 있을 거 야 하는 장치 컨텍스트에 대 한 가정을 만들 수 없습니다 자신의 창 없다면。

완료 OnDraw 이 처럼 보이는:

HRESULT CPolyCtl::OnDraw(ATL_DRAWINFOamp; di)
{
   RECT & rc = *(RECT*)di.prcBounds;
   HDC hdc = di.hdcDraw;

COLORREF colFore;
   HBRUSH hOldBrush, hBrush;
   HPEN hOldPen, hPen;

/ / COLORREF 형식으로 m_colFore 번역
   OleTranslateColor (m_clrFillColor, NULL, & colFore);

/ / 생성 하 고 동그라미 그릴 색상 선택
   hPen (HPEN)GetStockObject(BLACK_PEN); =
   hOldPen (HPEN) SelectObject (hdc, hPen); =
   hBrush (HBRUSH)GetStockObject(WHITE_BRUSH); =
   hOldBrush = (HBRUSH) SelectObject (hdc, hBrush);

타원 (hdc, rc.left, rc.top, rc.right, rc.bottom);

/ / 만들고 다각형을 작성 하는 데 사용 하는 브러쉬 선택
   hBrush = CreateSolidBrush(colFore);
   SelectObject (hdc, hBrush);

CalcPoints(rc);
   다각형 (hdc, & m_arrPoint [0], m_nSides);

/ / 다시 옛날 펜 및 브러시를 선택 하 고 우리가 만든 브러쉬 삭제
   SelectObject (hdc, hOldPen);
   SelectObject (hdc, hOldBrush);
   DeleteObject(hBrush);

return S_OK;
}

이제 호출 되는 함수를 추가 해야 CalcPoints , 그 선 intersections.nbsp; 좌표 계산 이러한 계산 RECT 변수를 함수에 전달 되는 것입니다.? 먼저 Polyctl.h의 IPolyCtl 클래스의 공용 섹션에 Calcpoints의 정의 추가 해야(&N):

voidnbsp;?? CalcPoints (const RECT & rc)

IPolyCtl 클래스의 공용 섹션을 지금 이렇게 보일:

/ / IPolyCtl
공개:
   STDMETHOD(get_Sides) (/ * [out, retval] * / 짧은 * newVal);
   STDMETHOD(put_Sides) (/ * [에] * / newVal 짧은);
   voidnbsp;?? CalcPoints (const RECT & rc)

다음의 구현을 추가 합니다 CalcPoints 함수를 PolyCtl.cpp 파일의 끝:

void CPolyCtl::CalcPoints (const RECTamp; rc)
{
   const 더블 pi 3.14159265358979; =
   포인트 ptCenter;
   이중 dblRadiusx = (rc.right-rc.left) / 2;
   이중 dblRadiusy = (rc.bottom-rc.top) / 2;
   이중 dblAngle = 3 * pi / 2;????????? / / 상단에서 시작
   이중 dblDiff = 2 * pi / m_nSides;?? / / 각 각도 사이드 만들 것입니다
   ptCenter.x = (rc.left + rc.right) / 2;
   ptCenter.y = (rc.top + rc.bottom) / 2;

/ / 각 측면에 대 한 포인트를 계산
   에 대 한 (int I = 0; 난 < m_nSides; i + +)
   {
      m_arrPoint [i].x = (긴) (dblRadiusx * cos(dblAngle) + ptCenter.x + 0.5);
      m_arrPoint [i].y = (긴) (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);
}

이제 컨트롤을 다시 작성 하 고 다시 시도 하십시오. ActiveX 컨트롤 테스트 컨테이너 를 열고 컨트롤을 삽입 합니다. 원 안에 녹색 삼각형이 표시 됩니다. 아래 단계를 수행 하 여 면 수를 변경해 보십시오. 테스트 컨테이너내에서 이중 인터페이스에 대 한 속성을 수정 하려면 메서드 호출 을 사용 하 여:

  1. 테스트 컨테이너에서 컨트롤 메뉴에서 메서드 호출 을 클릭 합니다.
    메서드 호출 대화 상자가 표시 됩니다.

  2. 메서드 이름 에서 양쪽 속성의 PropPut 버전 클릭。

  3. 매개 변수 값 편집 상자에 5를 입력 하 고 값 설정 을 클릭합니다 한 다음이 호출 을 클릭。

컨트롤 변경 되지 않습니다 확인 합니다. 무엇이 잘못되었나요? 설정 하 여 내부적으로 면 수를 변경 하는 있지만 해당 m_nSides 변수, 당신은 다시 칠하기 컨트롤을 발생 하지 않았다. 다른 응용 프로그램으로 전환 하 고 테스트 컨테이너 를 찾을 것입니다 다시 전환 하는 경우 컨트롤이 다시 그려집니다 있고 지금 측면의 올바른 번호를。

이 문제를 해결 하려면 추가 IViewObjectExImpl, 면 수를 설정 하면 정의 된 FireViewChange 함수를 호출 해야 합니다. 컨트롤을 자체 창에서 실행 하는 경우 FireViewChange InvalidateRect API를 직접 호출 됩니다. 컨트롤이 없는 실행 중인 InvalidateRect 메서드가 컨테이너의 사이트 인터페이스에 호출 됩니다. 이렇게 하면 자체를 다시 그릴 컨트롤。

새로운 put_Sides 방법은 다음과 같습니다.:

STDMETHODIMP CPolyCtl::put_Sides(short newVal)
{
   경우 (newVal gt; 2 & & newVal < 101)
   {
      m_nSides = newVal;
      FireViewChange();
      return S_OK;
   }
   다른
      오류 반환 (_T ("도형 있어야 3 위와 100 사이)");
}

FireViewChange를 추가한 후에 다시 작성 하 고 컨트롤을 다시 시도 하십시오. 즉시 변경 제어를 볼이 시간이 면 수를 변경 하 고 Invoke을 클릭합니다。

다음으로, 컨트롤에 이벤트를 추가 됩니다.

3 단계를 다시 |nbsp; 5 단계에(&N)

Index