BeginPaint

원형 HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint);
MFC 원형 CDC* CWnd::BeginPaint( LPPAINTSTRUCT lpPaint );
인수

▶hwnd:그리기를 할 윈도우 핸들. WndProc의 첫번째 인수로 전달된 hWnd핸들을 넘겨주면 된다.

▶lpPaint:그리기 정보를 리턴받기 위한 구조체이며 다음과 같이 선언되어 있다. BeginPaint는 조사된 정보를 이 구조체로 리턴해 주며 프로그램은 효율적인 그리기를 위해 이 구조체의 멤버를 참조한다.

typedef struct tagPAINTSTRUCT { 
  HDC  hdc; 
  BOOL fErase; 
  RECT rcPaint; 
  BOOL fRestore; 
  BOOL fIncUpdate; 
  BYTE rgbReserved[32]; 
} PAINTSTRUCT, *PPAINTSTRUCT; 

hdc는 그리기에 사용될 DC 핸들이며 fErase는 배경이 지워져야 할 것인지를 지정한다. 윈도우 클래스에 배경 브러시가 정의되어 있지 않으면 fErase가 TRUE가 되며 이때는 응용 프로그램이 직접 배경을 지워야 한다. rcPaint는 무효 영역의 좌표이며 최대한 그리기를 빠르게 하기 위해 이 영역만 그리면 된다. 나머지 세 멤버는 시스템이 내부적인 용도로 사용한다.

리턴 DC핸들을 리턴해 주는데 이 값은 PAINTSTRUCT 구조체의 hdc 멤버와 동일한 값이다. 에러 발생시 NULL을 리턴한다.
설명

윈도우즈 환경에서 화면이나 프린터로 출력을 하려면 DC를 먼저 구해야 한다. DC를 구하는 일반적인 방법은 두 가지가 있는데 GetDC와 ReleaseDC를 사용하는 방법이 있고 BeginPaint와 EndPaint를 사용하는 방법이 있다. BeginPaint와 EndPaint는 짝을 이루어 사용되며 반드시 WM_PAINT 메시지 내부에서만 사용해야 한다. WM_PAINT 함수는 일반적으로 다음과 같이 작성된다.

PAINTSTRUCT ps;
HDC hdc;
case WM_PAINT:
	hdc=BeginPaint(hWnd,&ps);
	각종 출력문에서 hdc를 사용한다.
	EndPaint(hWnd,&ps);

PAINTSTRUCT 구조체 ps와 HDC형 변수 hdc를 선언한 후 BeginPaint를 호출하여 DC핸들을 조사하고 이 핸들로 그리기를 한다. 그리고 EndPaint 함수로 그리기를 종료한다. BeginPaint 함수는 다음과 같은 중요한 일을 한다.

1.그리기를 위해 DC 핸들을 구한다. 이 핸들은 PAINTSTRUCT 구조체의 hdc멤버에도 대입되며 BeginPaint 함수의 리턴값으로 돌려지기도 한다.
2.그리기에 필요한 정보를 PAINTSTRUCT 구조체에 채운다. 이 구조체에는 최소한의 무효영역과 배경 삭제에 대한 정보, DC 핸들등이 기록되어 있으며 응용 프로그램은 이 정보를 참조하여 그리기를 더 빠르게 할 수 있다.
2.클리핑 영역을 조사하여 DC에 설정하여 클리핑 영역 바깥으로 출력되지 않도록 한다.
3.무효 영역을 유효화하여 다시 무효 영역이 생기기전에 WM_PAINT 메시지가 호출되지 않도록 한다.
4.캐럿이 있으면 캐럿을 숨겨 파괴되지 않도록 한다.
5.무효 영역이 배경을 지우도록 요청하면 WM_ERASEBKGND 메시지를 보내 배경을 지우도록 한다. 또한 WM_NCPAINT 메시지를 보내 비작업 영역을 그리도록 한다.

BeginPaint가 이런 중요한 일을 하기 때문에 WM_PAINT 메시지에서는 반드시 GetDC가 아닌 BeginPaint로 DC핸들을 조사해야 한다. GetDC는 클리핑 영역 계산이나 무효 영역 유효화를 해 주지 않으므로 WM_PAINT에서는 사용할 수 없다.

예제1

다음 예제는 WM_PAINT에서 타원 하나, 텍스트 하나를 출력한다.

long FAR PASCAL WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;

	switch(iMessage) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd,&ps);
		Ellipse(hdc,10,10,200,90);
		TextOut(hdc,100,100,"Beautiful Korea",15);
		EndPaint(hWnd,&ps);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

WM_PAINT로 DC 핸들을 발급받아 hdc변수에 대입하였으며 이 핸들은 Ellipse, TextOut 함수의 첫번째 인수로 사용된다.

참고함수 EndPaint, InvalidateRect, GetDC
플렛폼 95이상
참조

DC의 정의에 대해서는 3장을 참조한다.

그리기와 PAINTSTRUCT에 대해서는 12장을 참조한다.


written by http://www.winapi.co.kr