2011-04-30 6 views

답변

14

GetDC는 장치 컨텍스트에 대한 핸들을 반환하기 만하면 언제든지 자신의 그리기를 수행 할 수 있습니다. 반면에 BeginPaint는 페인팅을위한 창을 준비하고 페인트해야 할 부분에 대한 정보 (예 : 배경을 다시 칠할 필요가 있는지, 그리고 그려야 할 직사각형과 같은 정보)를 제공합니다.

각 경우를 사용하는 예는? BeginPaint는 WM_PAINT 핸들러에서 가장 일반적으로 볼 수 있습니다 (MSDN : WM_PAINT 메시지에 대한 응답을 제외하고 응용 프로그램은 BeginPaint를 호출하면 안됩니다.) BeginPaint에 대한 각 호출에는 EndPaint 함수에 대한 호출이 있어야합니다. GetDC는 어디에서나 사용할 수 있으므로 외부 창에 그리려면 필요합니다. 기본적으로 언제든지 WM_PAINT 처리기에 없습니다. BeginPaint와 EndPaint는 캐럿에도 약간의 영향을줍니다. 자세한 내용은 msdn을 참조하십시오.

+0

귀중한 의견을 보내 주셔서 감사합니다. BeginPaint 대신 WM_PAINT 내에서 GetDC를 사용하면 문제가 발생합니다. –

+1

Hans Passant의 회신을 읽어보십시오. 이유에 대한 자세한 내용은 좋은 생각이 아닙니다. 새로운 비주얼 스튜디오 프로젝트를 만들 때 WM_PAINT 핸들러에 BeginPaint와 EndPaint가 이미 있습니다. 왜 GetDC를 사용하겠습니까? – Matt

7

BeginPaintWM_PAINT 메시지에 대해서만 호출 할 수 있습니다. 획득 한 디바이스 콘텍스트는 윈도우의 무효화 된 영역 (redrawn)을 가리킨다. 그런 다음 EndPaint을 사용하여 릴리스해야합니다.

GetDC 언제든지 호출 할 수 있습니다. 획득 한 디바이스 콘텍스트는 윈도우의 전체 클라이언트 영역을 가리킨다. 그것을 공개하려면 ReleaseDC으로 전화해야합니다.

7

GetDC()는 이 아니며은 Begin + EndPaint()를 대신합니다. 시도해 보면 UI 스레드가 100 % CPU 코어를 시작하고 WM_PAINT 핸들러가 반복적으로 호출된다는 것을 알 수 있습니다.

큰 것은 EndPaint()이며, 창의 업데이트 영역을 지 웁니다. PAINTSTRUCT.rcPaint의 값입니다. 창 관리자 또는 프로그램에서 명시 적으로 호출하는 프로그램에 의해 InvalidateRect() 호출에 의해 만들어지는 더티 사각형이있는 한 WM_PAINT가 생성됩니다. EndPaint()는이를 지 웁니다.

+0

감사합니다. EndPaint없이 CPU 사용률을 설명합니다. –

+1

참. EndPaint는 기본적으로 ValidateRect를 호출합니다. DefWindowProc (rect의 유효성을 검사 함)로 연기하거나 직접 ValidateRect를 호출 할 수 있습니다. –