GDI ¶
GDI(Graphics Device Interface)란 윈ë�„ìš°ì�˜ í�´ë�¼ì�´ì–¸íЏ ì˜�ì—ì—� 그리기를 하는ë�° 사용ë�˜ëŠ” 함수ì�´ë‹¤. 비디오 ì¶œë ¥ê³¼ 프린터ì—� 그래픽 ì¶œë ¥ì�„ ì±…ìž„ì§€ê³ ìžˆëŠ” 부분ì�´ë‹¤. 사용ìž�ê°€ Windows용으로 작성하는 ì�‘ìš© 프로그램ì�´ GDI를 사용하여 시ê°�ì �ì�¸ ì •ë³´ë¥¼ ì¶œë ¥í• ë¿� 아니ë�¼ Windows ìž�ì²´ë�„ GDI를 사용하여 메뉴, 스í�¬ë¡¤ ë°”, ì•„ì�´ì½˜, ê·¸ë¦¬ê³ ë§ˆìš°ìŠ¤ 커서 ê°™ì�€ 사용ìž� ì�¸í„°íŽ˜ì�´ìФ ì•„ì�´í…œì�˜ 시ê°�ì �ì�¸ ì¶œë ¥ì�„ 수행한다.
DC ¶
DC(Device Context)는 GDIì—� ì�˜í•´ ë‚´ë¶€ì �으로 관리ë�˜ëŠ” ë�°ì�´í„° 구조체ì�´ë©° 그래픽 작업ì�„ 하기 위해서 필요한 것ì�´ë‹¤. 그림ì�„ ê·¸ë¦¬ê³ ìž� í• ë•Œì—�는 반드시 ë¨¼ì € DCì—� 대한 핸들ì�„ 얻어야 한다. 프로그램ì—� ì�´ 핸들ì�„ 주는 것으로 Windows는 사용ìž�ê°€ ê·¸ 장치를 ì‚¬ìš©í• ìˆ˜ 있ë�„ë¡� 허가해 준다. 그러면 핸들ì�„ GDI 함수ì�˜ ì�¸ìž�로 사용하여 현재 ê·¸ë¦¬ê³ ìž� 하는 장치를 Windowsê°€ ì‹�ë³„í• ìˆ˜ 있ë�„ë¡� 한다.
- 핸들 : 윈�우 핸들��는 �� �그대로 핸들�다.
예를 들면 ìž�ë�™ì°¨ë¥¼ ìš´ì „í• ë•Œ ìž�ë�™ì°¨í•¸ë“¤ì�„ 좌/우로 움ì§�ì�´ë©´ì„œ ìž�ë�™ì°¨ë¥¼ 조작하듯ì�´ 윈ë�„ìš°ì—�서 핸들ì�€ 윈ë�„우를 조작하기 위한 것입니다.
DC 핸들 얻기 ¶
DC 핸들ì�„ ì–»ê³ í•´ì œí•˜ëŠ” 가장 ì�¼ë°˜ì �ì�¸ 방법ì�€ WM_PAINT 메시지 처리 ë�„중 BeginPaint와 EndPaint 호출ì�„ 사용하는 것ì�´ë‹¤.
첫번째 ��는 프로그램� 윈�우� 대한 핸들�다.
변수 ps는 PAINTSTRUCT 형ì‹�ì�˜ 구조체ì�´ë‹¤. PAINTSTRUCT 구조체ì—�는 윈ë�„ìš° í”„ë¡œì‹œì €ê°€ í�´ë�¼ì�´ì–¸íЏ ì˜�ì—ì�„ 그리는 ë�° ì‚¬ìš©í• ìˆ˜ 있는 ì •ë³´ë“¤ì�´ ì €ìž¥ë�˜ì–´ 있다.
변수 ps는 PAINTSTRUCT 형ì‹�ì�˜ 구조체ì�´ë‹¤. PAINTSTRUCT 구조체ì—�는 윈ë�„ìš° í”„ë¡œì‹œì €ê°€ í�´ë�¼ì�´ì–¸íЏ ì˜�ì—ì�„ 그리는 ë�° ì‚¬ìš©í• ìˆ˜ 있는 ì •ë³´ë“¤ì�´ ì €ìž¥ë�˜ì–´ 있다.
WM_PAINT ¶
보통 프로그램ì�´ WinMainì—�서 UpdateWindow를 í˜¸ì¶œí• ë•Œ ë°œìƒ�한다. ì�´ê²ƒì�€ 윈ë�„ìš° í”„ë¡œì‹œì €ë¡œ 하여금 í�´ë�¼ì�´ì–¸íЏ ì˜�ì—ì—� 무엇ì�¸ê°€ë¥¼ 그리게 한다.
WM_PAINT 처리는 ê±°ì�˜ í•ìƒ� BeginPaintì—� 대한 호출로 시작ë�œë‹¤.
hdc = BeginPaint (hwnd, &ps);
ê·¸ë¦¬ê³ ë‹¤ì�Œê³¼ ê°™ì�´ EndPaint를 호출하여 ë��난다.
EndPaint (hwnd, &ps);
ë‘� 경우ì—� 있어서 첫번째 ì�¸ìž�는 프로그램ì�˜ 윈ë�„ìš°ì—� 대한 핸들ì�´ë‹¤. ë‘�번째 ì�¸ìž�는 PAINTSTRUCT 형ì‹�ì�˜ 구조체ì—� 대한 í�¬ì�¸í„°ì�´ë‹¤. PAINTSTRUCT 구조체ì—�는 윈ë�„ìš° í”„ë¡œì‹œì €ê°€ í�´ë�¼ì�´ì–¸íЏ ì˜�ì—ì�„ 그리는 ë�° ì‚¬ìš©í• ìˆ˜ 있는 ì •ë³´ë“¤ì�´ ì €ìž¥ë�˜ì–´ 있다.
GetClientRect(hwnd, &rect);
첫번째 ��는 프로그램 윈�우� 대한 핸들�다. �번째 ��는 RECT형�� 사�형 구조체� 대한 ��터�다.
ì˜ˆì œ ¶
~cpp
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
WNDCLASS wc;
MSG mSg;
char szTitleName[]="Drawing Line";
char szClassName[]="it is a class";
wc.cbClsExtra=NULL;
wc.cbWndExtra=NULL;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hInstance=hInst;
wc.lpfnWndProc=WndProc;
wc.lpszClassName=szClassName;
wc.lpszMenuName=NULL;
wc.style=NULL;
RegisterClass(&wc);
hWnd=CreateWindow(szClassName,szTitleName, WS_OVERLAPPEDWINDOW,100,90,320,240,NULL,NULL,hInst,NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&mSg,NULL,0,0))
{
TranslateMessage(&mSg);
DispatchMessage(&mSg);
}
return mSg.wParam;
}
LRESULT CALLBACK WndProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
HDC hDC;
HPEN hPen;
PAINTSTRUCT ps;
static int nSX,nSY,nEX,nEY;
static POINT pt;
static BOOL bTF;
switch(uMsg)
{
case WM_LBUTTONDOWN:
{
bTF = TRUE;
nSX=LOWORD(lParam);
nSY=HIWORD(lParam);
}
return FALSE;
case WM_LBUTTONUP:
{
bTF=FALSE;
nEX=LOWORD(lParam);
nEY=HIWORD(lParam);
InvalidateRect(hWnd,NULL,FALSE);
}
return FALSE;
case WM_PAINT:
{
if(bTF==FALSE)
{
hPen=CreatePen(PS_SOLID,0,RGB(0,0,0));
hDC=BeginPaint(hWnd,&ps);
SelectObject(hDC,hPen);
SelectObject(hDC, GetStockObject(NULL_BRUSH));
MoveToEx(hDC,nSX,nSY,&pt);
LineTo(hDC,nEX,nEY);
DeleteObject(hPen);
EndPaint(hWnd,&ps);
}
}
return FALSE;
case WM_DESTROY:
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
~cpp
hPen=CreatePen(PS_SOLID,0,RGB(0,0,0));
hDC=BeginPaint(hWnd,&ps);
Ellipse(hDC,nSX,nSY,nEX,nEY);
EndPaint(hWnd,&ps);










