본문 바로가기
코스웨어/15년 스마트컨트롤러

20151117 윤재희 #4. 그래픽

by 알 수 없는 사용자 2015. 11. 18.
728x90
반응형

==================================Outline====================================

그래픽

- 문자열 테이블

- GDI 오브젝트

- 스톡 오브젝트

- 펜

- 그리기 모드의 종류

- Ropmode

- 윈도우와 뷰포트

- 메모리 DC


----------------------------------------------------------------------------

 

엑셀레이터

 

 

단축키를 엑셀레이터라고 한다. 윈도우에서 사용하는 단축키의 개념은 다르기 때문에 엑셀레이터라고 부른다.

 

 

 

'Ctrl + A'를 누르면 단축키가 실행되어 다음의 화면이 뜬다.

 

 

문자열 테이블

 

윈도우즈에서는 문자열들도 리소스의 일종으로 취급된다. 리소스에 문자열을 정의해 두고 필요할 때마다 리소스에 문자열을 읽어와 사용한다. 문자열 리소스를 사용하는 예제를 만들어보자.





 

 

GDI 오브젝트

그래픽 출력에 사용되는 도구를 말한다.

 

 

 

GDI 오브젝트

핸들 타입

설명

디폴트

HPEN

선을 그을 때 사용된다.

검정색의 가는 선

브러시

HBRUSH

면을 채울 때 사용된다.

흰색

폰트

HFONT

문자 출력에 사용되는 글꼴

시스템 글꼴

비트맵

HBITMAP

비트맵 이미지

선택되지 않음

팔레트

HPALETTE

팔레트

선택되지 않음

영역

HRGN

영역

선택되지 않음

 

 

 

스톡 오브젝트

 

윈도우즈가 기본적으로 제공해주는 GDI 오브젝트를 말한다.

 

GetStockObject함수를 사용하여 사용할 스톡 오브젝트를 선택하고 이것을 적용할 때는 SelectObject함수가 사용된다.

 

HGDIOBJ GetStockObject( int fnObject );

HGDIOBJ SelectObject( HDC hdc, HGDIOBJ hgdiobj );

 

fnObject

설명

BLACK_BRUSH

검정색 브러시

GRAY_BRUSH

회색 브러시

NULL_BRUSH

투명 브러시

WHITE_BRUSH

흰색 브러시

DKGRAY_BRUSH

짙은 회색 브러시

LTGRAY_BRUSH

옅은 회색 브러시

BLACK_PEN

검정색 펜

WHITE_PEN

흰색 펜

NULL_PEN

투명 펜

ANSI_FIXED_FONT

고정폭 폰트

ANSI_VAR_FONT

가변폭 폰트

DEFAULT_PALETTE

시스템 팔레트

 

 

SelectObject 함수는 기능을 사용할 때 쓰인다. 중요한 것을 사용한 기능을 사용하고 나서는 기존의 기능으로 되돌려야 한다.

 

옅은 회색 브러시를 사용하여 사각형 안을 채워보자.

 

 

 

옅은 회색 브러시를 사용하여 사각형 안을 채워보자.

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,

WPARAM wParam,LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT ps;

HBRUSH MyBrush,OldBrush;

switch(iMessage) {

case WM_PAINT:

hdc=BeginPaint(hWnd,&ps);

MyBrush=(HBRUSH)GetStockObject(GRAY_BRUSH);

OldBrush=(HBRUSH)SelectObject(hdc,MyBrush);

Rectangle(hdc,50,50,300,200);

SelectObject(hdc,OldBrush);

EndPaint(hWnd,&ps);

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

}

return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

 

** SelectObject가 리턴하는 값은 새로 선택되는 오브젝트 이전에 선택되어 있던 같은 종류의 오브젝트 핸들이다.

 

 

//함수를 활용하여 프로그램을 작성하는 것이 응용프로그래밍이다.

 

 

 

 

펜은 동적할당을 받기 때문에 사용하고 난 후에는 지워주어야 한다. CreatePen을 사용하여 펜을 만들어주어야 한다.

 

HPEN CreatePen( int fnPenStyle, int nWidth, COLORREF crColor );

 

fnPenStyle

 

PS_SOLID

PS_DASH

PS_DOT

PS_DASHDOT

PS_DASHDOTDOT

nWidth

 

 

선의 두께를 의미한다.

 

crColor

 

선의 색상을 지정한다. COLORREF 형이므로 RGB 매크로 함수를 사용하면 된다.

브러쉬

 

도형의 내부를 채색하는 용도로 사용된다. 두 번째는 함수는 색상과 함께 무늬도 지정할 수 있다.

 

HBRUSH CreateSolidBrush( COLORREF crColor );

HBRUSH CreateHatchBrush( int fnStyle, COLORREF clrref );

 

설명

HS_BDIAGONAL

좌하향 줄무늬

HS_CROSS

바둑판 모양

HS_DIACROSS

좌하향 및 우하향 줄무늬

HS_FDIAGONAL

우하향 줄무늬

HS_HORIZONTAL

수평선

HS_VERTICAL

수직선

 

 

그리기 모드의 종류

 

 

int SetROP2( HDC hdc, int fnDrawMode );int GetROP2( HDC hdc ); 

첫번째 인수는 그리기 모드를 변경(또는 조사)하고자하는 DC의 핸들이며 SetROP2 함수의 두번째 인수에 다음과 같은 그리기 모드값을 넘겨준다.

 

 

 

그리기 모드

설명

R2_BLACK

항상 검정색이다.

R2_WHITE

항상 흰색이다.

R2_NOP

아무런 그리기도 하지 않는다.

R2_NOT

원래의 그림을 반전시킨다.

R2_COPYPEN

원래의 그림을 덮어버리고 새 그림을 그린다.

R2_NOTCOPYPEN

새 그림을 반전시켜 그린다.

R2_MERGEPEN

OR연산으로 두 그림을 합친다.

R2_MASKPEN

AND연산으로 겹치는 부분만 그린다.

R2_XORPEN

XOR연산으로 겹치는 부분만 반전시킨다.

 

 

 

Ropmode

 

 

 

반전모드를 사용하여 예제를 만들어 본다.

 

 

 

 

 

SetROP2 호출문을 삭제하면 선이 그려지는 모습이 표시된다.

 

 

 

 

 

윈도우와 뷰포트

 

원점을 변경 시킬수 있는 함수는 아래와 같다.

 

BOOL SetViewportOrgEx( HDC hdc, int X, int Y, LPPOINT lpPoint );

BOOL SetWindowOrgEx( HDC hdc, int X, int Y, LPPOINT lpPoint );

 

 

메모리 DC

 

비트맵 파일은 용량이 크기 때문에 메모리에 비트맵 파일을 올린 후 화면에 출력하면 비트맵 파일을 화면에 출력할 때보다 속도를 줄일 수 있다.

 

메모리 DC를 만들 때는 다음 함수가 사용된다.

 

HDC CreateCompatibleDC( HDC hdc );

 

메모리 DC를 만든 후에는 비트맵을 읽어온 후 이 비트맵을 메모리 DC에 선택해 준다. 선택하는 방법은 여타의 GDI 오브젝트와 마찬가지로 SelectObject 함수를 사용하며 비트맵을 읽어올 때는 LoadBitmap 함수를 사용한다.

 

HBITMAP LoadBitmap( HINSTANCE hInstance, LPCTSTR lpBitmapName );

 

BitBlt

 

BitBlt 함수는 DC간의 영역끼리 고속 복사를 수행한다. 메모리 DC의 표면에 그려져 있는 비트맵을 화면 DC로 복사함으로써 비트맵을 화면으로 출력한다. 원형은 다음과 같다.

 

BOOL BitBlt( HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop );

 

 

설명

BLACKNESS

대상영역을 검정색으로 가득 채운다.

DSTINVERT

화면을 반전시킨다.

MERGECOPY

소스 비트맵과 대상 화면을 AND 연산한다.

MERGEPAINT

소스 비트맵과 대상 화면을 OR 연산한다.

SRCCOPY

소스 영역을 대상 영역에 복사한다.

WHITENESS

대상영역을 흰색으로 채운다.

 

 

StretchBlt

 

BOOL StretchBlt( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop );

 

인자가 총 11개 이다. 앞에 인자 5개는 화면, 그 다음 5개는 비트맵


// visual studio에서 들려쓰기 줄 맞춤 단축키 Ctrl + K + F

 

졸라맨이 움직이도록 하는 코드를 만들어보자.

 

1. 경계검사

2. 창모양 고정(스크롤 바 제거) -

 

 

728x90