1. 윈도우 영역
    1. 윈도우 영역의 구분
      1. 클라이언트(Client) 영역
      2. 비클라이언트(Non-client) 영역
    2. TextRgn 예제
      - 별도의 영역 만들기
    3. void CTextRgnView::OnPaint()

      {

      CPaintDC dc(this); // device context for painting

      // TODO: 여기에 메시지 처리기 코드를 추가합니다.

      // 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.

      //임의의 두 사각형을

      //각기 다른 색상(붉은색과 회색)으로 칠한다.

      CRect rectLeft = CRect(50, 50, 250, 150);

      CRect rectRight = CRect(250, 50, 450, 150);

      dc.FillSolidRect(&rectLeft, RGB(192, 0, 0));

      dc.FillSolidRect(&rectRight, RGB(192, 192, 192));


      //앞서 만든 두 사각형을 별도의 영역으로 만든다.

      CRgn rgnLeft, rgnRight;

      rgnLeft.CreateRectRgnIndirect(rectLeft);

      rgnRight.CreateRectRgnIndirect(rectRight);


      LOGFONT lf;

      ::ZeroMemory(&lf, sizeof(lf));

      lf.lfHeight = 72;

      wsprintf(lf.lfFaceName, _T("%s"), _T("Arial Black"));

      CFont NewFont;

      NewFont.CreateFontIndirect(&lf);

      CFont* pOldFont = dc.SelectObject(&NewFont);


      dc.SetBkMode(TRANSPARENT);

      //dc.TextOut(60, 65, TEXT("TEST STRING"));


      //왼쪽 영역을 선택하여 문자열을 출력한다.

      dc.SetTextColor(RGB(192, 192, 192));

      dc.SelectClipRgn(&rgnLeft);

      dc.TextOut(60, 65, TEXT("TEST STRING"));


      //오른쪽 영역을 선택하여 문자열을 출력한다.

      dc.SetTextColor(RGB(192, 0, 0));

      dc.SelectClipRgn(&rgnRight);

      dc.TextOut(60, 65, TEXT("TEST STRING"));


      //영역해제

      dc.SelectClipRgn(NULL);


      dc.SelectObject(pOldFont);

      }

      • CreateRectRgnIndirect()
        • 인자로 주어진 RECT 구조체의 정보를 근거로 새로운 윈도우 영역을 생성
      • CreateRectRgn()
        • CreateRectRgnIndirect()와 동일하지만 RECT 구조체의 주소가 아니라 네 개의 int형 값을 받으며, 각각은 사각형을 그리기 위한 좌표
      • SelectClipRgn()
        • 인자로 주어진 CRgn 클래스 객체로 윈도우 영역을 변경
        • SelectClipRgn() 함수 호출 코드를 수행한 직후에는 특정 영역을 벗어난 그리기 결과는 화면에 출력되지 않음
        • SelectClipRgn(NULL) 코드로써 영역해제
    4. FrameRgn 예제
      - 영역을 조합하기
    5. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

      {

      if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

      return -1;


      if (!m_wndStatusBar.Create(this))

      {

      TRACE0("상태 표시줄을 만들지 못했습니다.\n");

      return -1;      // 만들지 못했습니다.

      }

      m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));


      // 두 영역 및 조합된 영역을 주어진 좌표로 생성한다.

      m_RgnRect1.CreateRectRgn(0, 0, 100, 100);

      m_RgnRect2.CreateRectRgn(70, 70, 170, 170);


      // 이 영역은 조합된 결과가 저장될 영역이므로 좌표는 의미가 없다.

      m_RgnTotal.CreateRectRgn(0, 0, 0, 0);


      // 두 영역을 조합한 새로운 영역을 만든다.

      m_RgnTotal.CombineRgn(&m_RgnRect1, &m_RgnRect2, RGN_XOR);


      // 조합된 영역이 CMainFrame 윈도우의 영역이 되도록 한다.

      SetWindowRgn((HRGN)m_RgnTotal, TRUE);


      return 0;

      }

      • CombineRgn()
        • 두 영역을 조합한다.
        • RGN_XOR, RGN_OR, RGN_AND, RGN_DIFF, RGN_COPY 등이 있다.
      • SetWindowRgn()
        • 윈도우 자체의 영역을 바꾼다.
        • 반면에 SelectClipRgn()함수는 CDC 클래스의 멤버로 윈도우 자체의 영역을 변경하는 것이 아니라 그리기 결과가 출력되는 DC의 영역을 일시적으로 변경한다.
        • 메인 프레임 윈도우는 응용 프로그램에서 최상위 부모 윈도우가 되므로 이 윈도우의 영역을 변경하면 자식 윈도우들에게도 직접적으로 영향을 주게 된다.
  2. 그리기(Drawing) 모드
    - 펜을 이용한 그리기 코드를 실행할 때 출력 대상인 화면 DC의 이미지와 펜이 그린 이미지를 어떻게 조합할 것인지 설정
    1. DrawModeDemo 예제
      • SetCapture()
        • 마우스가 해당 윈도우를 벗어나도 메시지를 받을 수 있다.
      • GetCapture()
        • 마우스를 캡쳐하고 있는 윈도우의 핸들을 리턴한다.
        • 캡쳐하는 윈도우가 없으면 NULL
      • ReleaseCapture()
        • 캡쳐 해제
      • SetROP2()
  3. 매핑(Mapping) 모드
    - 좌표계 변경
    1. MapModeDemo 예제
      • SetMapMode()
      • SetWindowExt()
        • 윈도우와 연결된 DC의 논리적인 폭과 높이를 설정
      • SetViewportExt()
        • 뷰포트의 크기를 설정
        • SetWindowExt()함수로 DC의 크기를 가로/세로 100으로 설정했는데 뷰포트의 크기를 가로/세로 300으로 했다면 300% 확대하는 이치
      • SetViewportOrg()
        • 물리적으로 (0, 0)에 해당하는 좌표를 설정
        • 기본 값은 (0, 0) (왼쪽 위 구석)
        • SetViewportOrg(300, 300)으로 설정했다면 왼쪽 위 구석은 (-300, -300)이 됨
  4. 프린터 출력
    1. 기본적으로 모니터 출력과 프린터 출력은 크게 다르지 않다
    2. MFC의 문서/뷰(Document/View) 구조를 통한 구현
    3.  함수명

      설명 

       OnPaint()

      모니터 화면에 출력 

       OnPrint()프린터에 출력 
       OnDraw()

      모니터 화면과 프린터 모두에 출력 

    4. 프린터 출력과 상관없는 화면 출력은 OnPaint() 함수를 이용하는 것이 MFC가 권고하는 프로그래밍 기법
    5. 관련 함수들
      • IsPrinting()
        • CDC 클래스의 메서드로서 DC가 프린터 DC인지 아닌지를 BOOL형으로 반환
      • 문서/뷰 구조의 SDI 형식의 프로젝트 생성 시 기본 재정의 함수들
        • OnPreparePrinting()
          • 프린터 출력에 앞서 인쇄 대화 상자를 출력하기 직전에 호출
          • DoPreparePrinting() 함수를 호출하여 인쇄 대화 상자가 화면에 나타남
          • 프린터 출력에 앞서 인쇄할 전체 문서의 길이가 얼마나 되는지 계산하는 코드가 주로 들어감
          • CPrintInfo 구조체의 멤버 중에 SetMaxPage() 함수를 통해 출력 문서의 전체 길이 설정 가능
        • OnBeginPrinting()
          • 문서 출력 시작 시점에 호출
        • OnEndPrinting()
          • 문서 출력 완료 시점에 호출
    6. MFC의 프린터 출력 구조


+ Recent posts