U E D R , A S I H C RSS

5�용C++스터디/윈�우�그림그리기

GDI


GDI(Graphics Device Interface)란 윈ë�„ìš°ì�˜ í�´ë�¼ì�´ì–¸íЏ ì˜�ì—­ì—� 그리기를 하는ë�° 사용ë�˜ëŠ” 함수ì�´ë‹¤. 비디오 ìœë ¥ê³¼ 프린터ì—� 그래픽 ìœë ¥ì�„ 책임지고 있는 부분ì�´ë‹¤. 사용ìž�ê°€ Windows용으로 작성하는 ì�‘ìš© 프로그램ì�´ GDI를 사용하여 시ê°�ì �ì�¸ 정보를 ìœë ¥í•  ë¿� 아니ë�¼ Windows ìž�ì²´ë�„ GDI를 사용하여 메뉴, 스í�¬ë¡¤ ë°”, ì•„ì�´ì½˜, 그리고 마우스 커서 ê°™ì�€ 사용ìž� ì�¸í„°íŽ˜ì�´ìФ ì•„ì�´í…œì�˜ 시ê°�ì �ì�¸ ìœë ¥ì�„ 수행한다.

DC


DC(Device Context)는 GDI� �해 내부�으로 관리�는 ��터 구조체�며 그래픽 작업� 하기 위해서 필요한 것�다. 그림� 그리고� 할 때�는 반드시 먼저 DC� 대한 핸들� 얻어야 한다. 프로그램� � 핸들� 주는 것으로 Windows는 사용�가 그 장치를 사용할 수 있�� 허가해 준다. 그러면 핸들� GDI 함수� ��로 사용하여 현재 그리고� 하는 장치를 Windows가 �별할 수 있�� 한다.

  • 핸들 : 윈ë�„ìš° 핸들ì�´ë�¼ëŠ” ë§�ì�€ ë§�그대로 핸들ì�´ë‹¤.
    예를 들면 ��차를 운전할때 ��차핸들� 좌/우로 움��면서 ��차를 조작하듯� 윈�우�서 핸들� 윈�우를 조작하기 위한 것입니다.

DC 핸들 얻기


DC 핸들ì�„ 얻고 해제하는 가장 ì�¼ë°˜ì �ì�¸ 방법ì�€ WM_PAINT 메시지 처리 ë�„중 BeginPaint와 EndPaint 호ìœì�„ 사용하는 것ì�´ë‹¤.

hdc = BeginPaint (hwnd, &ps);
다른 명령들
EndPaint (hwnd, &ps);

첫번째 ��는 프로그램� 윈�우� 대한 핸들�다.
변수 ps는 PAINTSTRUCT 형�� 구조체�다. PAINTSTRUCT 구조체�는 윈�우 프로시저가 ���언트 �역� 그리는 � 사용할 수 있는 정보들� 저장�어 있다.

WM_PAINT


보통 프로그램ì�´ WinMainì—�서 UpdateWindow를 호ìœí•  때 ë°œìƒ�한다. ì�´ê²ƒì�€ 윈ë�„ìš° 프로시저로 하여금 í�´ë�¼ì�´ì–¸íЏ ì˜�ì—­ì—� 무엇ì�¸ê°€ë¥¼ 그리게 한다.

WM_PAINT 처리는 ê±°ì�˜ í•­ìƒ� BeginPaintì—� 대한 호ìœë¡œ 시작ë�œë‹¤.

hdc = BeginPaint (hwnd, &ps);

그리고 다ì�Œê³¼ ê°™ì�´ EndPaint를 호ìœí•˜ì—¬ ë��난다.

EndPaint (hwnd, &ps);

� 경우� 있어서 첫번째 ��는 프로그램� 윈�우� 대한 핸들�다. �번째 ��는 PAINTSTRUCT 형�� 구조체� 대한 ��터�다. PAINTSTRUCT 구조체�는 윈�우 프로시저가 ���언트 �역� 그리는 � 사용할 수 있는 정보들� 저장�어 있다.

WndProcì�€ BeginPaint를 호ìœí•˜ê³  난 후 GetClientRect를 호ìœí•œë‹¤.

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

  • CreatePen() : 펜ì�„ ìƒ�성하는 함수.
  • SelectObject() : CreatePen()으로 만든 펜ì�„ 사용하ë�„ë¡� 지정해준다.
  • LineTO() : ì„ ì�„ 그리는 ì—­í• .
  • DeleteObject() : CreatePen()함수로 ìƒ�성한 펜ì�„ 지우는 ì—­í• .

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:19
Processing time 0.0053 sec