본문 바로가기
IT창고/API

특정 영역 무효화와 무효화 된 화면 다시 그리기

by 창구창고 2007. 1. 22.
반응형
#include<windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrev,
				   LPSTR lpCmdLine,
				   int nShowCmd)
{
	//1. 위도우 클래스 만들기 (10가지를 다 정확히 입력하지 않으면 화면이 뜨지 않는다.)
	WNDCLASS wc;		//미리정의된 10개 항목을 채우는 클래스 (WNDCLASSEX 12개 항목 10개 항목에 작은 아이콘, 구조체 크기를 포함한다.)

	MSG Message;

	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground	=	(HBRUSH)GetStockObject(	WHITE_BRUSH);

	wc.hCursor		=	LoadCursor	(	0, IDC_CROSS);
	wc.hIcon		=	LoadIcon	(	0, IDI_WINLOGO	);
	wc.hInstance	=	hInstance;
	wc.lpfnWndProc	=	WndProc;
	wc.lpszClassName=	"First";
	wc.lpszMenuName	=	0;
	wc.style		=	0;

	//2. 윈도우 클래스 등록하기.
	RegisterClass( & wc	);	// 등록을 하는 함수도 2가지가 있다. RegisterClass와 RegisterClassEx가 있다.
	//WNDCLASS로 만들었으면 RegisterClass로 등록하고 WNDCLASSEX로 만들었으면 RegisterClassEx로 등록

	//3. 등록된 클래스를 사용해서 윈도우 만들기.
	// typedef long HWND;	//	윈도우의 번호를 담을때 사용
	HWND hwnd	=	CreateWindowEx(WS_EX_RIGHT ,			// 확장 윈도우 스타일
									"First",				// 윈도우 클래스 이름
									"안녕",					// 창이름
									WS_OVERLAPPEDWINDOW,	// 기본 Window Styles : & ~ 연산으로 기존스타일 제거하기
															// WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX
									CW_USEDEFAULT,	0,	CW_USEDEFAULT,	0,	// X,Y,W,H
									0,						// 부모 윈도우 핸들( 번호 )
									0,						// 메뉴 핸들( 번호 )
									hInstance,				// 인스턴스 핸들
									0);						// 생성인자.( MDI 만들때 사용 )
	//							   

	//CreateWindowEx는 CreateWindow가 가지는 11개에 확장 윈도우 스타일 1가지 인자를 더 가져서 12가지 인자를 가진다.

	//4. 윈도우 보여주기
	ShowWindow(hwnd, nShowCmd);


	while(GetMessage(&Message,0,0,0))	//메시지 큐에 가서 메시지를 꺼내오고 가져온 메시지를 윈도우 클래스에 등록된 메세지 처리함수로 전달한다.
	{
		TranslateMessage(&Message);
		DispatchMessage(&Message);//가져온 메시지를 윈도우 클래스에 등록된 메시지 처리함수로 전달한다.
	}
	
	MessageBox(0, "알겠나요?","물음",MB_OKCANCEL);//종료되지 않게 하기 위해
	return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	RECT rc ;
	GetClientRect(hwnd,&rc);


	static POINTS buf[1000];
	static int count;
	switch(iMessage){
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0 ;

		//화며이 지워질때 나오는 메시지 - 이 메시지가 Defxxx로 가면 배경이 지워진다.
		//많은 상업용 프로그램을 - 떨림을 막기 위해 이 메시지를 막는다.

		//효율적으로 그리기 
		//	1. 꼭 필요한 것만 그리자.
		//	2. 배경을 꼭 지워야 하는가?
		//	3. 좌표를 보관하지 말고 비트맵을 사용하자.


	case  WM_ERASEBKGND:
		return 0;
	case WM_LBUTTONDOWN:
		{
			POINTS pt = MAKEPOINTS(lParam);
			
			HDC hdc	=	GetDC(hwnd);
			
			//DC속성을 변경한다.
			SetTextColor(	hdc,RGB(255,0,0));
			SetBkColor(		hdc,RGB(255,255,0));
			
			TextOut(hdc,0,0,"Hello",5);
			Ellipse(hdc,pt.x, pt.y,pt.x+50,pt.y+50);
			ReleaseDC(hwnd,hdc);

			buf[count++]	=	pt;
		}
		return 0;

	case WM_RBUTTONDOWN:
		{
			// 강제로 특정 영역을 무요화 한다.
			RECT rc	=	{	100,	100,	200,	200	};
			InvalidateRect(hwnd, &rc, TRUE);
		
		}
		return 0;

	case WM_PAINT:
		{
			//HDC	hdc	=	GetDC(hwnd);
			//ValidateRect(hwnd,0);			//무효화 영역을 유효화 영역으로 
			//위의 2줄의 코드를 대신하는게 아래이 코드이다
			PAINTSTRUCT ps;
			HDC hdc	=	BeginPaint(hwnd,&ps);

			for(int i = 0; i < count ; ++i)
			{
				Ellipse(hdc,buf[i].x,buf[i].y,buf[i].x+50,buf[i].y+50);
			}
			ReleaseDC(hwnd,hdc);
		}
		return 0;

	}
	//꺼내온 메시지를 처리하지 않은경우 -> 바드시 아래 함수를 처리한다.
	return(DefWindowProc(hwnd,iMessage,wParam,lParam));
}
//		
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."