<C언어와의 비교>
int main() --> WinMain(){ } & WinProc(){ }
printf() --> TextOut(), DC
GDI 오브젝트
Pen, Brush, Enhanced metafile, Font, Memory DC, Bipmap, Palette, Region...
- 사용 방법 2가지!
1. 운영체제에서 제공
2. 사용자가 직접 설정
스톡오브젝트
:: OS에서 제공하는 GDI 오브젝트를 사용하기 위한 함수
HGDIOBJ GetStockObject(int fnObject)
- fnObject
브러쉬 : BLACK_BRUSH, WHITE_BRUSH, DKGRAY_BRUSH, HOLLOW_BRUSH ..
펜 : BLACK_PEN, DC_PEN, WHITE_PEN ..
폰트 : ANSI_FIXED_FONT, ANSI_VAR_FONT
팔레트 : DEFAULT_PALLETTE
GDI 오브젝트 설정과 해제
HGDIOOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);
BOOL DeleteObject(HGDIOBJ hObject);
1) 펜
:: 선 색상, 선 굵기, 스타일 지정(점선, 실선 등)
핸들 명 : HPEN
HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);
- fnPenStyle : PS_SOLID(실선), PS_DASH(점선)...
<펜을 이용한 선 그리기 예제>
BOOL MoveToEx(HDC hdc, int X, int Y, LPPOINT lpPoint);
LineTo(HDC hdc, int nXEnd, intnYEnd);
① 펜 생성 : CreatePen() , GetStockObject()
② 펜 선택 : SelectObject()
③ 선 그리기 : MoveToEx(), LineTo()
④ 펜 제거 및 이전 펜 설정 : DeleteObject() - 스톡 오브젝트는 이를 사용할 필요 없음 , SelectObject()
사용자가 직접 지정(Create)하거나
운영체제에서 제공하는 것을 사용하는 방법(스톡 오브젝트)의 차이는
DeleteObject의 유무이다.
<펜을 이용한 도형 출력>
사각형, 원
BOOL Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
BOOL Ellipse(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
2) 브러쉬
:: 도형의 내부를 색상과 패턴으로 채우는 역할
- 사용 방법
1. 스톡 오브젝트 이용(GetStockObject())
2. 사용자 생성
- 브러쉬 생성 함수
CreateSolidBrush(), CreateHatchBrush(), CreatePatternBrush(), CreateBrushIndirect(),...
HBRUSH CreateSolidBrush(COLORREF crColor);
① 브러쉬 생성 : CreateSolidBrush() --> 핸들 얻기
② 브러쉬 설정 : SelectObject() --> 핸들 리턴
③ 도형 출력
④ 이전 브러쉬 복구 : SelectObject()
⑤ 생성한 브러쉬 제거 : DeleteObject()
3) 비트맵
- 이미지 종류
bmp, jpg, gif, tga 등
※ 비트맵을 다루는 두 가지 방법
1. 비트맵을 리소스에 등록하여 사용 (리소스에 추가하여 ID를 사용)
2. LoadImage() 함수를 이용하여 파일로부터 읽어내는 방법
① 비트맵의 핸들을 얻는다 : LoadBitmap(), LoadImage() 둘 중 하나
HBITMAP LoadBitmapA(
HINSTANCE hInstance,
LPCSTR lpBitmapName
);
HANDLE LoadImageA(
HINSTANCE hInst,
LPCSTR name,
UINT type,
int cx,
int cy,
UINT fuLoad
);
>>핸들 형변환(HANDLE --> HBITMAP) 후 사용
② 메모리 DC 생성 : CreateCompatibleDC()
메모리 DC ?
:: 화면과 동일한 특성을 가진 메모리의 일부.
- 컴퓨터는 이미지를 읽어서 바로 불러들이는 것이 아니라 이미지를 메모리에 올린 후 이것을 출력하는 방법을 택하고 있기 때문에 필요
HDC CreateCompatibleDC(HDC hdc);
③ 메모리 DC에 비트맵 적용 : SelectObject()
HGDIOOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);
메모리 DC(핸들)를 명시한 후 비트맵(OBJ)을 지정하면 비트맵의 내용이 메모리 DC에 쏙 들어가게 된다.
④ 비트맵 출력 : BitBlt()
BOOL BitBlt(
HDC hdc,
int nXDest,
int nYDest,
int nWidth,
int nHeight,
HDC hdcSrc, //메모리 DC
int nXSrc, //메모리 DC의 어디서부터 시작할지
int nYSrc,
DWORD dwRop
);
이미지의 헤더 정보를 알면 이 사이즈들을 다 알 필요가 없다!
typedef struct tagBITMAP {
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP, *PBITMAP, *NPBITMAP, *LPBITMAP;
int GetObject(
HGDIOBJ hgdiobj,
int cbBuffer, //메모리 버퍼 사이즈
LPVOID pv
);
--> 비트맵의 가로 세로 크기를 알 수 있다.
⑤ 메모리 DC와 비트맵 제거 : DeleteDC(), DeleteObject()
BOOL DeleteDC(HDC hdc);
BOOL DeleteObject(HGDIOBJ hObject);