블로그 이미지
이태원에서 사는 다섯식구의 무직 가장. 흰둥에미

카테고리

분류 전체보기 (184)
Itaewon (2)
ryu's?? (1)
20121210이전 (20)
20130827이전 (147)
soo'study (13)
Total40,648
Today1
Yesterday364

'SetROP2'에 해당되는 글 1건

  1. 2013.01.14 6장. 그래픽

GDI 오브젝트

- GDI(Graphic Device Interface)는 화면, 프린터 등의 모든 출력 장치를 제어하는 윈도우즈의 핵심 모듈 중 하나

  펜, 브러시, 비트맵, 폰트 등 GDI오브젝트를 모아놓은 것을 DC라 함.

  GDI 오브젝트의 종류

 GDI 오브젝트

핸들 타입   설명 디폴트 

HPEN

선을 그을 때 사용

검정색의 가는 실선
브러시 HBRUSH  면을 채울 때 사용  흰색 
 폰트 HFONT  문자 출력에 사용되는 글꼴  시스템 글꼴 
 비트맵 HBITMAP  비트맵 이미지 
 팔레트 HPALETTE  팔레트 
 리전 HRGN  화면상의 영역 

  GDI오브젝트를 생성하는 함수를 부르고 이 함수가 리턴하는 핸들을 받아서 사용.

  DC가 BeginPaint나 GetDC 함수에 의해 처음 만들어졌을 때, 위와 같은 디폴트 값을 갖고 있음.


스톡 오브젝트

- 윈도우즈가 기본적으로 제공하는 GDI 오브젝트

  HGDIOBJ GetStockObject(int fnObject);

  - fnObject 인수에는 사용하고자 하는 스톡 오브젝트를 지정(주로 브러시와 펜으로 ...._BRUSH, ...._PEN으로 정의되어 있음)

    DC_BRUSH와 DC_PEN은 각각 SetDCBrushColor, SetDCPenColor함수로 설정.

    여러 종류의 스톡 오브젝트를 리턴하므로, 원하는 타입(HBRUSH, HPEN등)으로 캐스팅 하여 사용.

  HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);

  - GDI 오브젝트를 DC에 선택할 때 사용하는 함수

    hdc - DC의 핸들

    hgdiobj - DC에서 새로 선택할 GDI오브젝트의 핸들

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

    원하는 GDI오브젝트 사용후, DC를 원래의 상태로 복원하기 위해 위 리턴값을 저장해 두어야 한다.


색상

- 색상 표현을 위해 COLORREF라는 데이터 형을 사용 ( typedef DWORD COLORREF )

  상위부터 8비트씩 X, Blue, Green, Red를 의미.

  RGB(r,g,b) 매크로를 이용하여, COLORREF형 값을 만듦.

  GetRValue(rgb), GetGValue(rgb), GetBValue(rgb) 는 COLORREF형 변수에서 각 색상 요소의 농도를 분리해내는 매크로.


- 선을 그을때 사용하는 GDI 오브젝트

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

  - 스톡 펜 이외의 펜을 생성할 때 사용하는 함수

    fnPenStyle - PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT 등의 선 모양

                      (굵기가 1일때만 효과 적용, 2이상이면 무조건 실선)

    nWidth - 선의 폭을 지정, 단 이 값이 0일 경우는 맵핑 모드에 상관없이 무조건 1픽섹 두께의 선이 생성됨.

    crColor - 선의 색상을 지정

    리턴값 - 새로 만든 펜의 핸들이 리턴

  BOOL DeleteObject(HGDIOBJ hObject);

  - GDI 오브젝트는 메모리를 사용하기 때문에, 사용한 후 반드시 이 함수를 이용하여 삭제해야 함.

    주의할 점은 DC에 현재 선택되어 있는 GDI 오브젝트는 살제할 수 없음.


브러시

- 채워지는 면을 채색하는 용도

  스톡 브러시 외의 브러시를 생성할 때 사용하는 함수 둘. 모두 생성한 브러시의 핸들을 리턴해 줌.

  HBRUSH CreateSolidBrush(COLORREF crColor);

  - 단색의 브러시를 생성.

  HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);

  - fnStyle - HS_BDIAGONAL(좌하향 줄무늬), HS_CROSS(바둑판 무늬), HS_DIAGCROSS(대각 바둑판)

                 HS_FDIAGONAL(우하향 줄무늬), HS_HORIZONTAL(수평선), HS_VERTICAL(수직선)


Old의 의미

- GDI 오브젝트를 생성후 사용하고 해제해 주기 위해, DC에 기존에 있던 GDI 오브젝트를 임시로 담아둠.


투명 오브젝트

- 스톡 오브젝트 중 NULL_BRUSH(=HOLLOW_BRUSH), NULL_PEN이 투명 오브젝트를 그리기 위한 GDI 오브젝트임.


흑백에서의 그리기 모드

- COPY - 새로 그려지는 그림이 기존 그림을 덮어버림.

  OR - 대응되는 비트를 OR연산하여 새로운 값을 만들어 그린다.

  AND - 대응되는 비트를 AND연산하여 새로운 값을 만들어 그린다.

  XOR - 대응되는 비트를 XOR연산하여 새로운 값을 만들어 그린다.


그리기 모드의 종류

- 윈도우즈에서 사용하는 디폴트 그리기 모드는 R2_COPYPEN 모드(그려지는 그림이 기존 그림을 덮어버림)

  int SetROP2(HDC hdc, int fnDrawMode);

  - 그리기 모드를 변경하는 함수로 hdc는 그리기 모드를 변경하고자 하는 DC의 핸들

    fnDrawMode - R2_BLACK(항상 검정색), R2_WHITE(항상 흰색), R2_NOP(아무것도 안그림), R2_NOT(원래 그림 반전)

                         R2_COPYPEN(원래 그림을 덮어 그림), R2_NOTCOPYPEN(새 그림을 반전), R2_NOTXORPEN(XOR결과의 반대로)

                         R2_MASKPEN(AND연산으로 겹치는 부분만), R2_XORPEN(XOR연산으로 겹치는 부분만 반전)

  int GetROP2(HDC hdc);

  - hdc의 그리기 모드를 구하는 함수.


그리기 모드

- 이미 그려진 그림을 보존하기 위해, 그리는 중의 선을 반전 모드로 그려 이 선이 지워질 때 원래대로 복구해 놓는다.

  그러기 위해서는 절대 색상으로 삭제, 그리기를 해서는 안되며 이미 그려진 그림과 논리 연산을 취하는 방법을 사용하며,

  위 SetROP2 함수를 이용한다.

  흑백에서는 R2_NOT 모드, 컬러에서는 R2_NOTXORPEN이 가장 완벽하다.


비트맵

- 그림 출력을 위해 비트맵을 사용. 이미지를 픽셀단위로 화면에 일일이 출력하는 건 무리수!

  복잡한 그림을 출력하는 용도 외에도 화면의 일정영역을 복사해서 옮기거나, 잠시 보관해 두기도 하며, 화려한 애니메이션에도 활용


메모리 DC

- 비트맵을 곧바로 화면 DC로 출력하는 함수는 없음. 비트맵을 직접 출력하는 것은 속도가 느리고, 여러 문제 발생의 여지가 있음

  미리 비트맵 화면을 준비하고, 출력할 때 이미 준비된 데이터를 화면으로 전송하는 방식.

  메모리 DC - 화면 DC와 동일한 특성을 가지며, 그 내부에 출력 표면을 가진 메모리 영역.

                   화면 DC에서 가능한 출력들은 물론 불가능 한것까지 가능

                   메모리 DC에 먼저 그림을 그린 후, 그 결과만을 화면으로 고속 복사하는 방법(더블 버퍼링)이 있음.

                   비트맵도 일종의 GDI 오브젝트이지만, 화면 DC에는 선택할 수 없고 메모리 DC만이 비트맵을 선택할 수 있음.

  HDC CreateCompatibleDC(HDC hdc);

  - 인수로 주어진 DC와 동일한 특성을 가지는 DC를 메모리에 만들고, 그 핸들을 리턴

  HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName);

  - hInstance - 비트맵 리소스를 가진 인스턴스의 핸들

    lpBitmapName - 비트맵 리소스의 이름

    위 함수에서 리턴된 비트맵 핸들을 SelectObject함수로 메모리 DC에 선택하면, 메모리 DC상에 비트맵이 그려진다.


BitBlt

- DC간의 영역끼리 고속 복사를 수행한다.

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

  - hdcDest - 복사 대상 DC

    그다음 네개의 인자 - 복사 대상의 X, Y, Width, Height

    hdcSrc - 복사원

    nXSrc, nYSrc - 복사원의 좌표 (BitBlt 는 비트맵의 크기를 변경하지 않음, 복사대상에 지정된 폭과 너비를, 복사원에서도 사용)

    dwRop - 래스터 연산 방법을 지정

                 BLACKNESS(대상영역을 검정색으로 채움), DSTINVERT(화면을 반전), MERGECOPY(소스 비트맵과 대상 화면을 AND)

                 MERGEPAINT(소스 비트맵과 대상 화면을 OR), SRCCOPY(소스 영역을 대상 영역에 복사), WHITENESS(흰색으로 채움)

  비트맵도 GDI 오브젝트 이므로, DeleteObject함수로 지우고,

  사용이 끝난 메모리 DC는 DeleteDC라는 함수를 이용해 해제한다.


StretchBlt

- DC간 비트맵을 전송하는데 확대 및 축소가 가능

  BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,

            HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);

  - 복사원(hdcSrc)의 지정한 영역이 복사 대상(hdcDest)의 지정한 영역의 크기만큼 확대(또는 축소)되어 출력

  원칙적으로 비트맵은 WM_CREATE에서 미리 읽어 두고, WM_PAINT에서는 출력 만을 해야함.

  WM_DESTROY에서는 비트맵을 해제해줘야 한다.

  * GetObject 함수는 GDI 오브젝트 핸들로부터 펜, 브러시, 비트맵 등의 정보를 조사하는 함수.

  * 비트맵 출력 절차중 가장 느린 함수는 LoadBitmap 함수이다.


비트맵 만들기

- 비트맵 편집기로 직접 제작할 수 있음.


폰트

- 폰트를 만들고 DC로 전송한 후 문자열을 출력하면 DC에 선택된 폰트를 사용하여 문자열을 출력


CreateFont

- HFONT CreateFont(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD fdwItalic,

             DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet, DWORD fdwOutputPrecision,

             DWORD, fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, LPCTSTR lpszFace);

  nHeight - 폰트의 높이를 논리적인 단위로 지정하며, 0일땐 디폴트 크기를 사용.

  nWidth - 폰트의 폭을 지정, 0이면 nHeight에 따라 폭을 자동으로 결정.

  lpszFace - 글꼴의 이름을 나타내는 문자열을 설정.


폰트 생성

- LOGFONT 구조체는 CreateFont 함수의 인수 전체를 멤버로 가짐.

  이 구조체에 원하는 값을 먼저 대입한 후 CreateFontIndirect 함수로 이 구조체의 번지를 넘겨 폰트를 생성할 수도 있음.

  HFONT CreateFontIndirect(CONST LOGFONT* lplf);

  - 전달되는 인수가 적으므로 CreateFont에 비해 빠름.

    여러벌의 폰트를 만들때에도 LOGFONT의 멤버중 일부만을 변경하여 재사용 가능

    뒤에 Indirect가 붙은 몇몇 함수들은 이런식으로 구조체의 주소를 받는 함수이다.


텍스트의 색상

- 폰트 오브젝트외에 출력되는 문자열에 영향을 주는 함수들.

  UINT SetTextAlign(HDC hdc, UINT fMode);

  COLORREF SetTextColor(HDC hdc, COLORREF crColor);

  - Text의 Color를 Set하는 함수

    GetTextColor가 반대의 함수.

  COLORREF SetBkColor(HDC hdc, COLORREF crColor);

  - 글자 뒤쪽의 배경 색상을 지정하는 함수

    GetBkColor가 반대의 함수.

  int SetBkMode(HDC hdc, int iBkMode);

  - 배경 색상을 사용할 방법을 지정

    iBkMode - OPAQUE(불투명한 배경을 사용, 디폴트)

                    TRANSPARENT(투명한 배경색상을 사용)


글자 회전시키기

- CreateFont의 세 번째 인수인 nEscapement를 변경하면 문자열의 각도를 바꿀수 있음.


'20130827이전 > WinAPI' 카테고리의 다른 글

8장. 대화상자  (0) 2013.01.15
7장. 컨트롤  (0) 2013.01.14
6장. 그래픽  (0) 2013.01.14
5장. 리소스  (0) 2013.01.13
4장. 입력  (0) 2013.01.13
3장. 출력  (0) 2013.01.12
Posted by 흰둥에미

최근에 달린 댓글

최근에 받은 트랙백

글 보관함