Visual c programming how to draw
This presentation is the property of its rightful owner.
Sponsored Links
1 / 41

Visual C++ Programming How to draw? PowerPoint PPT Presentation


  • 135 Views
  • Uploaded on
  • Presentation posted in: General

Visual C++ Programming How to draw?. Department of Digital Contents Sang Il Park. Outline. Review How to draw with MFC. The simplest MFC application. VC++ Framework. CFrameWnd. CChildView. CDocument. 윈도우의 프레임 ( 틀 ) 을 관리. 데이터를 보여주는 윈도우. 데이터를 저장 , 처리 ( 눈에 안보임 ).

Download Presentation

Visual C++ Programming How to draw?

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Visual c programming how to draw

Visual C++ ProgrammingHow to draw?

Department of Digital Contents

Sang Il Park


Outline

Outline

  • Review

  • How to draw with MFC


The simplest mfc application

The simplest MFC application


Vc framework

VC++ Framework

CFrameWnd

CChildView

CDocument

윈도우의 프레임(틀)을 관리

데이터를 보여주는 윈도우

데이터를 저장, 처리(눈에 안보임)

CWinApp : 위의 세 오브젝트를 묶어 주고, 프로그램을 구동 시킴(눈에 안보임)

메시지루프를 돌림


Visual c programming how to draw

프로그램 내부 구조

theApp

(CSimpleApp : CWinApp)

m_pMainFrame

(CMainFrame : CFrameWnd)

m_wndView

(CChildView : CWnd)


Hungarian notation

Hungarian Notation

  • 변수의 이름을 짓는 방법:

    • 의미를 알 수 있게

    • 일관되게

  • Hungarian Notation:

    • Microsoft에서 따르는 변수 이름 작명법


Hungarian notation1

Hungarian Notation


Visual c programming how to draw

데이터 타입

정의

BOOL 또는 BOOLEAN

TRUE 또는 FALSE

BYTE, WORD, DWORD, LONG

8비트, 16비트, 32비트, 32비트(모두 unsigned)

U*

unsigned *

예) UCHAR, UINT, ULONG, ...

HANDLE

32비트 핸들

H*

*을 가리키는 핸들

예) HBITMAP(비트맵), HBRUSH(브러시),

HCURSOR(커서), HDC(디바이스 컨텍스트),

HFONT(폰트), HICON(아이콘),

HINSTANCE(인스턴스), HMENU(메뉴),

HPEN(펜), HWND(윈도우)

데이터 타입들

  • API 데이터 타입 - 기본형


Visual c programming how to draw

데이터 타입

정의

P* = LP*

* 에 대한 포인터

예1) PBOOL, PBYTE, PLONG, ...

예2) LPBOOL, LPBYTE, LPLONG, ...

(L)PSTR, (L)PCSTR

ANSI 문자열

(L)PTSTR, (L)PCTSTR

ANSI 또는 유니코드 문자열

COLORREF

32비트 RGB (red, green, blue 각각 8비트) 색상값

데이터 타입들

  • API 데이터 타입 - 기본형 (cont’d)


Visual c programming how to draw

응용 프로그램 실행순서

CSimpleApp theApp;

WinMain()// MFC 내부에 숨겨짐

{

theApp.InitInstance();// 초기화

theApp.Run();// 메시지 루프

theApp.ExitInstance();// 종료

}


How to draw with mfc

How to draw with MFC


Visual c programming how to draw

도스 시절 게임하기…

  • In 1980s, before the birth of the “windows 95”

    • MS-DOS (Disk Operating System)

    • Graphics Card: CGA(4색)/EGA(16색)/VGA(256색)

도스는 그래픽스 카드와 상관이 없다?

Device-Independent 개념의 시작

게임회사가 그래픽스 카드 드라이버를 각각 제공

CGA

CGA용 게임


Gdi 1 5

GDI와 디바이스 컨텍스트 (1/5)

  • 출력 시스템을 설계할 때 고려할 사항

    • Device-independent

      • 모니터, 비디오 카드, 프린터 등 출력에 사용되는 주변 장치가 변경되는 경우에도 프로그램을 수정할 필요가 없어야 한다.

    • Multi-tasking

      • 화면이나 기타 출력 장치를 직접 접근(Direct Access)하거나 독점해서 사용하는 것을 운영체제 차원에서 막아야 한다.


Gdi 2 5

GDI와 디바이스 컨텍스트 (2/5)

  • GDI(Graphics Device Interface)

    • 운영체제의 하위 시스템 중 하나

    • 응용 프로그램의 요청을 받아서 실제 출력 장치에 대한 출력을 담당

응용 프로그램

GDI

출력 장치

(화면, 프린터 등)

장치 독립적

장치 의존적


Gdi 3 5

GDI와 디바이스 컨텍스트 (3/5)

  • 화면 출력할 때 고려할 사항

    • 클라이언트 영역에 출력하려면 화면에 해당하는 윈도우 위치를 알아야 한다.

    • 화면에 여러 개의 윈도우가 있을 때 출력 결과가 다른 윈도우의 영역을 침범하지 않아야 한다.

    • 현재 출력할 화면이 다른 윈도우에 가려졌다면 출력을 할 수 없어야 한다.


Gdi 4 5

GDI와 디바이스 컨텍스트 (4/5)

  • 디바이스 컨텍스트(DC, Device Context)

    • GDI가 생성하고 관리하는 데이터 구조체

    • 멀티태스킹(멀티스레딩) GUI 환경에서 발생할 수 있는 여러 상황을 고려한 출력 가능


Gdi 4 51

GDI와 디바이스 컨텍스트 (4/5)

  • 윈도우 응용 프로그램의 출력 과정

    • 응용 프로그램: 디바이스 컨텍스트 요청

    • 운영체제(GDI): 디바이스 컨텍스트 생성 및 핸들(포인터) 제공

    • 응용프로그램: 디바이스 컨텍스트에 그림 그리기

    • 운영체제(GDI): 그림 그리는 상황 검토 후 출력


Gdi 5 5

응용 프로그램

디바이스

컨텍스트

GDI

장치

드라이버

출력 장치

(화면, 프린터 등)

GDI와 디바이스 컨텍스트 (5/5)

  • 윈도우 응용 프로그램의 출력 과정 (cont'd)


Visual c programming how to draw

그림 그리는 부분은 어디에?

  • WM_PAINT 메시지 핸들러 (OnPaint) 함수 속

  • 아무데나…


Visual c programming how to draw

화면 그리기 연습

  • Project 생성

    • Single Document

    • No Document/View Architecture Support

  • CChildView의 WM_PAINT 메시지 핸들러 수정

void CChildView::OnPaint()

{

CPaintDC dc(this);

dc.Rectangle(50,50,250,250);

dc.Ellipse(100,100,200,200);

}


Visual c programming how to draw

화면 그리기 연습


Wm paint

WM_PAINT??

  • WM: Windows Message

    • MFC에서 제공하는 기본 메시지

    • 화면 내 창이나 마우스, 키보드과 관련된 메시지

  • WM_PAINT

    • 화면을 다시 그릴 필요가 있다고 판단될 경우 발생되는 메시지

    • “무효영역(invalid region)이 생겼다!”


Visual c programming how to draw

무효 영역 (1/3)

  • 화면을 다시 그려야 하는 상황


Visual c programming how to draw

무효 영역 (2/3)

  • WM_PAINT 메시지 발생 상황

    • 윈도우가 생성될 때

    • 윈도우의 크기가 변경될 때

    • 최소화 또는 최대화 되었을 때

    • 다른 윈도우가 가렸다가 드러날 때

  • 무효 영역 생성을 강제로 발생

void CWnd::Invalidate (BOOL bErase = TRUE);

void CWnd::InvalidateRect (LPCRECT lpRect, BOOL bErase = TRUE);


Visual c programming how to draw

무효 영역 (3/3)

  • WM_PAINT 메시지 처리

    • API를 사용할 때

    • MFC를 사용할 때

hdc = BeginPaint(hwnd, &ps);

TextOut(hdc, 100, 100, “Hello, MFC”);

EndPaint(hwnd, &ps);

return 0;

void CMainFrame::OnPaint()

{

CPaintDC dc(this);

dc.TextOut(100, 100, “Hello, MFC”);

}


Visual c programming how to draw

출력 방법 비교

  • SDK

    • 윈도우 운영체제에게 디바이스 컨텍스트를 요청

      • BeginPaint(hwnd, &ps);

    • 얻어낸 디바이스 컨텍스트 핸들을 사용하여 출력

      • TextOut(hdc, 100, 100, “Hello, MFC”);

    • 운영체제에게 디바이스 컨텍스트 사용이 끝났음을 알림

      • EndPaint(hwnd, &ps);

  • MFC

    • 디바이스 컨텍스트 객체 생성 (this pointer 이용)

      • CPaintDC dc(this)

    • 객체의 멤버 함수를 호출하여 출력

      • dc.TextOut( … )


Visual c programming how to draw

클래스 이름

용도

CPaintDC

클라이언트 영역에 출력할 때

(WM_PAINT 메시지 핸들러에서만 사용)

CClientDC

클라이언트 영역에 출력할 때

(WM_PAINT 메시지 핸들러를 제외한

다른 모든 곳에서 사용)

CWindowDC

윈도우의 전체 영역(클라이언트 영역 +

비 클라이언트 영역)에 출력할 때

CMetaFileDC

메타 파일(Metafile)에 출력할 때

다양한 디바이스 컨텍스트 클래스


Visual c programming how to draw

클래스 계층도


Cpaintdc

CPaintDC 클래스

  • 오로지 WM__PAINT 메시지 핸들러에서만 사용

    • OnPaint()

  • CPaintDC 사용 예

void CChildView::OnPaint()

{

CPaintDC dc(this);

// ...

}


Visual c programming how to draw

이름

기능

Rectangle()

사각형을 그린다.

Ellipse()

사각형에 내접하는 타원을 그린다.

DC의 그리기 관련 맴버 함수

  • 도형 그리기

(x1, y1)

dc.Rectangle (x1, y1, x2, y2);

dc.Ellipse (x1, y1, x2, y2);

(x2, y2)


Cpaintdc1

CPaintDC 사용 연습

  • 다음과 같은 그림을 그려보자


Cclientdc

CClientDC 클래스

  • WM_PAINT 메시지 핸들러 이외의 부분에서 사용

  • CClientDC 사용 예

void CChildView::OnLButtonDown(UINT nFlags, CPoint point)

{

CClientDC dc(this);

// ...

}


Cclientdc1

CClientDC 사용 연습

  • 마우스 버튼이 눌렸을 때 그림을 그려보자!

    • 마우스 버튼이 눌리는 메시지 핸들러 추가

    • CClientDC 객체 생성

    • 생성된 DC객체를 이용하여 그리기


Cwindowdc

(0, 0) CWindowDC

(0, 0) CPaintDC, CClientDC

CWindowDC 클래스

  • CWindowDC 사용 방법

    • CPaintDC, CClientDC 클래스와 동일

  • 원점 위치


Cwindowdc1

CWindowDC 사용 연습

  • 다음과 같은 그림을 그려보자


Cmetafiledc

CMetaFileDC 클래스

  • 메타 파일(Metafile)

    • GDI 명령어를 저장할 수 있는 파일

  • CMetaFileDC 사용 방법

    • CMetaFileDC 객체를 만든 후 CMetaFileDC::Create() 호출

    • 메타 파일 객체를 일반적인 디바이스 컨텍스트 객체로 간주하고 출력 관련 멤버 함수를 호출

    • CMetaFileDC::Close()를 호출하면 윈도우 운영체제가 내부적으로 메타 파일을 만든 후 메타 파일 핸들(HMETAFILE 타입)을 리턴

    • CDC::PlayMetaFile()로 메타 파일을 실행


Visual c programming how to draw

이름

기능

GetPixel()

화면의 특정 위치에 해당하는 점의 색을 얻는다.

SetPixel()

화면의 특정 위치에 원하는 색의 점을 찍으며 원래의 점의 색을 리턴한다.

SetPixelV()

SetPixel과 기능은 동일하지만 SetPixel 함수와 달리 원래의 점의 색을 리턴하지 않으므로 속도가 더 빠르다.

그리기 함수 (1/3)

  • 점 찍기

COLORREF color = dc.GetPixel (x,y);

dc.SetPixelV(x,y, RGB(r,g,b));


Colorref

COLORREF

색을 저장하는 변수

32 bit DWORD: 0x00rrggbb 형식

여러가지 편한 매크로:

COLORREF color = RGB(r,g,b);

r = GetRValue (color);

g = GetGValue (color);

b = GetBValue (color);

38


Visual c programming how to draw

이름

기능

MoveTo()

현재 위치를 옮긴다.

LineTo()

현재 위치로부터 특정 위치까지 선을 그린 후 현재 위치를 갱신한다.

그리기 함수 (2/3)

  • 선 그리기

(x1,y1)

dc.MoveTo(x1,y1);

dc.LineTo(x2,y2);

(x2,y2)


Visual c programming how to draw

이름

기능

Rectangle()

사각형을 그린다.

Ellipse()

사각형에 내접하는 타원을 그린다.

그리기 함수 (3/3)

  • 도형 그리기

(x1, y1)

dc.Rectangle (x1, y1, x2, y2);

dc.Ellipse (x1, y1, x2, y2);

(x2, y2)

40


Visual c programming how to draw

이름

기능

TextOut()

특정 위치에 문자열을 출력한다.

DrawText()

사각형을 기준으로 문자열을 출력한다.

SetTextColor()

문자의 색을 바꾼다.

SetBkColor()

문자의 배경색을 바꾼다.

SetTextAlign()

기준 위치에 대한 문자열의 정렬 방식을 정한다.

텍스트 함수

  • 텍스트 출력 함수

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

dc.SetBkColor(RGB(0,255,0));

dc.SetTextAlign(TA_CENTER);

dc.TextOut(300,200,“Sejong University”);


  • Login