<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() 

 

WM_PAINT에 해당 부분 추가

사용자가 직접 지정(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()

 

WM_PAINT 새로 작성
결과


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);

 

 

'Project > WIN32 API' 카테고리의 다른 글

다이얼로그  (0) 2021.07.21
키보드, 마우스  (0) 2021.07.13
그래픽  (0) 2021.07.08
리소스  (0) 2021.07.07
WndProc  (0) 2021.06.26

+ Recent posts