MFC를 활용하여 GUI(User Interface) 구현 시, DC, CDC, HDC, HWND 등을 정확히 이해 못하고 활용할 때가 많습니다. Window GUI Programming에 핵심적인 개념으로 명확히 이해하고 있으면 MFC 기반 어플리케이션 개발이 쉬워질 수 있습니다.
- DC (Device Context) - 그리기 작업을 수행하기 위한 핸들 또는 구조체
- CDC - MFC에서 제공하는 HDC를 C++ Class 형태로 래핑한 Class
- HWND - 윈도우 핸들 Handle, MFC에서는 CWnd Class가 HWND를 래핑
1. DC: Device Context
윈도우에서 화면, 프린터 등 출력 장치에 텍스트나 그래픽을 출력할 때 사용되며, HDC라는 핸들로 윈도우 API 함수 GetDC와 ReleaseDC를 통해 가져오고 해제합니다. 메모리를 위한 DC는 CreateCompatibleDC 함수가 있습니다.
HDC hdc = ::GetDC(hWnd); // HDC: Handle to Device Context
TextOut(hdc, 30, 30, _T(”Device Context: DC !!!”), 10);
::ReleaseDC(hWnd, hdc);
2. CDC
HDC를 객체지향적으로 래핑한 MFC 클래스 입니다. 메서드를 통해 구조화된 방식으로 그리기 작업을 쉽게 할 수 있으며, HDC보다 더 다양한 멤버 함수를 제공합니다. MFC에서는 화면, 프린터, 메모리 등 다양한 DC를 파생 클래스로 나눠서 지원 합니다. 예를 들어 CClientDC는 클라이언트 영역 DC, CPaintDC는 WM_PAINT 메시지 핸들링, CWindowDC는 윈도우 전체 영역 그림, 그리고 CMemDC 등이 있습니다.
CClientDC dc(this); // this는 CWnd 포인터
dc.TextOut(30, 30, _T(”Device Context: DC !!!”));
3. HWND: Window Handle
윈도우에서 각 창을 고유하게 식별하기 위한 ID로 보면 됩니다. MFC에서는 CWnd 클래스가 HWND를 래핑합니다. GetSafeHwnd()로 HWND를 가져올 수 있습니다.
// HWND > HDC > CDC
HWND hWnd = this->GetSafeHwnd();
HDC hdc = ::GetDC(hWnd); // HDC: Handle to Device Context
TextOut(hdc, 30, 30, _T(”Device Context: DC !!!”), 10);
::ReleaseDC(hWnd, hdc);
정리하면 HWND는 윈도우 창 식별자로 특정 창에 접근할 때 사용하며, HDC는 디바이스 컨텍스트 핸들로 GDI로 그림 그릴때 사용합니다. CDC는 MFC의 DC 클래스로 그리기 함수 및 리소스를 관리합니다. 이 세가지가 맞물려서 MFC 기반 앱에서 시각적 요소들을 처리합니다. 비유하면, HWND는 화면위에 창문, HDC는 그 창문에 그림을 그릴 수 있게 해주는 붓, CD는 그 붓을 잘 다뤄주는 도구함이라고 생각해 볼 수 있습니다.
추가로 메모리 DC를 활용하면 화면 깜빡임 없는 출력이 가능합니다. 더블 버퍼링 Double-Buffering 기법이라고도 합니다.
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, 100, 100);
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
memDC.FillSolidRect(0, 0, 100, 100, RGB(255, 255, 255));
memDC.TextOutW(10, 10, _T("Off-screen drawing"));
dc.BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap);
'프로그래밍 기술' 카테고리의 다른 글
[MFC] BITMAP 이미지 구조 및 생성 과정 이해하고 활용하기 (0) | 2025.06.26 |
---|---|
[C++/MFC] 윈도우 API 유용한 함수 ShellExecute 기본과 활용 (0) | 2025.06.18 |
오래된 PC 하드 HDD에서 SSD로 교체, 윈도우 OEM 제품키 확인하기 (2) (0) | 2025.05.12 |
오래된 PC 하드 HDD에서 SSD로 교체, 윈도우 OEM 제품키 확인하기 (1) (0) | 2025.05.09 |
[C#] Winform 환경에서 메인 Main에서 서브 Sub 폼으로 이미지 전달하기 (0) | 2025.05.04 |