윈도우즈는 디바이스 콘텍스트의 수를 제한한다.
디바이스 컨텍스트 객체가 파괴될 때, 이와 관련된 모든 GDI 객체의 선택이 해제된다. // ???
WM_PAINT 메시지가 발생하였을 때
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hWnd, &ps); // DC의 핸들을 얻는다.
// DC 핸들을 가지고 작업을 한다.
EndPaint(hWnd, &ps); // 사용 후에는 DC를 반드시 반환한다.
윈도우의 클라이언트 영역에 그리(출력)고자 할 때
HDC hDC;
hDC = GetDC(hWnd); // DC의 핸들을 얻는다.
// DC 핸들을 가지고 작업을 한다.
ReleaseDC(hWnd, hDC); // 사용 후에는 DC를 반드시 반환한다.
윈도우 클라이언트 영역뿐만 아니라 윈도우 전체 영역에 그리고자 할 때
HDC hDC;
hDC = GetWindowDC(hWnd); // DC의 핸들을 얻는다.
// DC 핸들을 가지고 작업을 한다.
ReleaseDC(hWnd, hDC); // 사용 후에는 DC를 반드시 반환한다.
BeginPaint, GetDC, GetWindowDC 함수는 비디오 화면 장치에서 윈도우 영역에 대한 DC를 얻는 함수이다. 즉 윈도우 핸들(위에서 hWnd)이 인자로 필요하다. 다음 API 함수 CreateDC는 더 많은 장치에 대한 DC를 생성하여 핸들을 리턴해 준다.
화면 전체(바탕화면) 영역에 그리고자 할 때
HDC hDC;
hDC = CreateDC(TEXT(“DISPLAY”), NULL, NULL, NULL);
// 디스플레이 장치에 대한 DC를 생성한다.
// DC 핸들을 가지고 작업을 한다.
DeleteDC(hDC); // DeleteDC로 생성한 DC를 삭제한다.
프린터 장치에 출력하고자 할 때(Widnows 95/98/ME에서와 Windows NT/2000/XP에서 프린터 정보를 얻는 방법에는 약간의 차이가 있다.)
HDC hDC = NULL;
DWORD dwNeeded = 0;
DWORD dwReturned = 0;
If( GetVersion() & 0x80000000 ) // Windows 95/98/ME
{
PRINTER_INFO_5 printInfo5;
// Windows 95/98/ME 일 경우 PRINTER_INFO5 구조체를 사용한다.
// EnumPrinters 사용해서 프린터 정보를 받을 버퍼의 크기를 알아낸 후
// 다시 EnumPrinters로 프린터의 정보를 얻는다.
EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5, NULL, 0,
&dwNeeded, &dwReturned);
EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5, (PBYTE)&printInfo5,
&dwNeeded, &dwReturned);
hDC = CreateDC(NULL, printInfo5.pPrinterName, NULL, NULL);
}
Else // Windows NT/2000/XP
{
PRINTER_INFO_4 printInfo4;
// Windows NT/2000/XP일 경우 PRINTER_INFO_4 구조체를 사용한다.
EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4, NULL, 0,
&dwNeeded, &dwReturned);
EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4,
(PBYTE)&printInfo4, dwNeeded, &dwNeeded, &dwReturned);
hDC = CreateDC(NULL, printInfo4.pPrinterName, NULL, NULL);
}
// DC 핸들을 가지고 작업을 한다.
DeleteDC(hDC); // DC를 삭제한다.
그 밖의 장치(출력장치)에 대해서도 CreateDC로 DC를 생성하고, DeleteDC로 DC를 삭제한다(GetDC 함수 내에서도 CreateDC로 DC를 생성하여 핸들을 얻는다)
참조 사이트: