설비 환경 류: CDC 류, CPaintDC 류, CClientDC 류, CWindowDC 류 총괄
2. 모든 그리 기 호출 은 장치 환경 dc 를 통 해 이 루어 져 야 합 니 다.이 대상 들 은 선, 도형, 텍스트 를 그 리 는 Window API 를 패키지 합 니 다.
3. 설비 환경 허용 Window 는 장치 에서 장치 와 무관 하 게 그립 니 다.
4. 장치 환경 은 화면, 프린터 에 메타 파일 을 그 릴 수 있 습 니 다.
------------------------------------------------------------------------------------------------------------------
1. CDC 류
Window 는 장치 와 무관 한 장치 환경 dc 를 사용 하여 표시 합 니 다.MFC 기초 라 이브 러 리 는 설비 환경 대상 클래스 를 정의 합 니 다. CDC
:
CDC::CDC()
{
m_hDC = NULL;
m_hAttribDC = NULL;
m_bPrinting = FALSE;
}
:
CDC::~CDC()
{
if (m_hDC != NULL)
::DeleteDC(Detach());
}
주의해 야 할 것 은 CDC 대상 을 생 성 할 때 파생 클래스 처럼 구조 함수 에서 해당 하 는 Windows 장치 컨 텍스트 핸들 을 가 져 오 는 것 이 아 닙 니 다.
따라서: GetDC 등 함 수 를 사용 하여 장치 설명 표를 가 져 오지 않 고 BOOL Create CompatibleDC (CDC * pDC) 를 사용 하여 장치 설명 표를 만 드 는 것 이 좋 습 니 다.
... 에 있다 CDC 분석 함수 에서 장치 설명 표 핸들 이 비어 있 지 않 으 면 DeleteDC 를 사용 하여 삭제 합 니 다.이것 은 CDC 를 직접 사용 할 때 윈도 장치 설명 표를 만 드 는 것 이 가장 좋 은 이유 다.
장치 설명 표 가 생 성 되 지 않 았 다 면 분석 함수 가 호출 되 기 전에 장치 설명 표 핸들 을 분리 하고 사용 해 야 합 니 다.: RealeaseDC 방출, 방출 후 mhDC 가 비어 있 으 면 석조 함수 호출 시 실행 되 지 않 습 니 다: deleteDC.
물론 CDC 의 파생 클래스 인 석조 함수 가 CDC 의 석조 함 수 를 호출 하 는 것 은 걱정 할 필요 가 없다. 왜냐하면 CDC:: ~ CDC () 는 가상 석조 함수 가 아니 기 때문이다.
CDC 를 사용 하 는 방법 은 두 가지 가 있 습 니 다.
// 1. CWnd::GetDC() CDC
CDC *pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
// 2.CreateCompatibleDC(CDC* pDC ) CDC
// dc DC。
CDC dcMem;
dcMem.CreateCompatibleDC(&dc); //
pbmOld = dcMem.SelectObject(&m_bmBall); //
…//
dcMem.SelectObject(pbmOld); //
dcMem.DeleteDC(); // ,
2, CClientDC 클래스
CClientDC 클래스 는 구조 함수 에서 Window API 함수 GetDC () 를 호출 하고, 분석 함수 에서 ReleaseDC () 를 호출 합 니 다.
CClientDC 클래스 는 클 라 이언 트 구역 에서 만 그림 을 그 릴 수 있 습 니 다.면 이른바 클 라 이언 트 구역 이란 창 영역 에서 테두리, 제목 표시 줄, 메뉴 표시 줄, 도구 모음, 상태 표시 줄 등 이외 의 부분 을 제거 하 는 것 을 말한다.
그것 은 사용자 가 조작 할 수 있 는 구역 이다.
CClientDC 클래스 의 창 핸들 은 구성원 변수 m 에 저 장 됩 니 다.hwnd 는 CClientDC 를 구성 하기 위해 CWnd 를 매개 변수 로 구조 함수 에 전달 해 야 합 니 다.
CClientDC 를 사용 하여 그림 을 그 릴 때, 일반적으로 GetClient Rect () 함 수 를 호출 하여 클 라 이언 트 영역의 크기 를 가 져 옵 니 다.
//CClientDC : public CDC : GetDC() ReleaseDC
// CClientDC dc(GetParent()); GetParent view frame
CClientDC dc(this); // DC
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
3. CPaintDC 클래스
CPaintDC 창 다시 그리 기 메시지 (WM PAINT) 에 응답 하 는 그래 픽 출력 입 니 다.
CPaintDC 는 구조 함수 에서 BeginPaint () 를 호출 하여 장치 컨 텍스트 를 가 져 오고 분석 함수 에서 호출 합 니 다. EndPaint () 장치 컨 텍스트 를 방출 합 니 다.
EndPaint () 는 장치 컨 텍스트 를 방출 하 는 것 외 에 메시지 큐 에서 WM 를 제거 하 는 것 도 책임 집 니 다.PAINT 소식.
따라서 창 을 다시 그 릴 때 CPaintDC 를 사용 해 야 합 니 다. 그렇지 않 으 면 WMPAINT 메 시 지 는 메시지 큐 에서 지 울 수 없 으 며 끊 임 없 는 창 을 다시 그립 니 다.
CPaintDC 도 WM 에 만 사용 할 수 있 습 니 다.PAINT 메시지 처리 중 입 니 다.
// MFC CView WM_PAINT :
void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
// CPaintDC dc, ;
// , , , 。
// ,
CPaintDC *pDC;
pDC = new CPaintDC(this)
// , delete pDC:
delete pDC;
4, CWindowDC 클래스
CWindowDC 대상 구조 시 윈도 호출 API 함수 GetWindowDC, 분석 시 해당 API 함수 ReleaseDC 를 호출 합 니 다.
이 는 CWindowDC 대상 이 CWnd 가 가리 키 는 전체 화면 영역 에 접근 할 수 있 음 을 의미 합 니 다.
CWindowDC 는 모니터 의 임의의 위치 에 그림 을 그 릴 수 있 습 니 다.좌표 원점 은 전체 창의 왼쪽 상단 에 있다.
CWindowDC 를 사용 하여 그림 을 그 릴 때, 일반적으로 GetWindowRect 함 수 를 호출 하여 전체 프로그램의 창 영역 크기 를 가 져 옵 니 다.
CWindowDC 클래스 의 창 핸들 은 구성원 변수 m 에 저 장 됩 니 다.hwnd 는 CClientDC 를 구성 하기 위해 CWnd 를 매개 변수 로 구조 함수 에 전달 해 야 합 니 다.
// CWindowDC CDC 、 ClientDC 。
// CWindowDC dc(GetParent());
// CWindowDC dc(GetDesktopWindow());
CWindowDC dc(this); //
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
=================================================
첨부: 윈도 프로그램 설계 가 도형 기초 에 대한 설명:
1. 장치 컨 텍스트 핸들 가 져 오기
윈도 는 장치 상하 문 핸들 을 얻 는 몇 가지 방법 을 제공 했다.메 시 지 를 처리 할 때 장치 컨 텍스트 핸들 을 얻 었 다 면 창 함 수 를 종료 하기 전에 풀 어야 합 니 다 (또는 삭제).
일단 핸들 을 풀 면 그것 은 더 이상 효과 가 없다.프린터 장치 컨 텍스트 핸들 에 대해 서 는 규칙 이 이렇게 엄격 하지 않 습 니 다.
장치 컨 텍스트 핸들 을 가 져 오고 방출 하 는 데 가장 많이 사용 되 는 방법 은 WM 를 처리 하 는 것 입 니 다.PAINT 메시지 의 경우 BeginPaint 와 EndPaint 호출 을 사용 합 니 다.
hdc = BeginPaint(hwnd, &ps);
// 기타 조작
EndPaint(hwnd, &ps);
그 중에서 ps 는 PAINT STRUCT 구조 대상 이 고 이 구조의 hdc 필드 는 BeginPaint 가 전달 하 는 장치 컨 텍스트 핸들 이 며 PAINT STRUCT 구 조 는 rcPaint 라 는 RECT (사각형) 구 조 를 포함한다.
rcPaint 는 창 을 둘 러 싼 영역 이 잘못된 사각형 을 정의 합 니 다.BeginPaint 에서 얻 은 장치 컨 텍스트 핸들 을 사용 하여 이 영역 에서 만 그림 을 그 릴 수 있 습 니 다.BeginPaint 호출 은 이 영역 을 유효 하 게 합 니 다.
윈도 프로그램 은 비 WM 도 처리 할 수 있 습 니 다.PAINT 메시지 에서 장치 컨 텍스트 핸들 가 져 오기
hdc = GetDC(hwnd);
// 기타 조작
ReleaseDC(hwnd, hdc);
이 장치 의 컨 텍스트 는 창 핸들 이 hwnd 인 디 스 플레이 영역 에 적 용 됩 니 다.
이 호출 과 BeginPaint 와 EndPaint 의 조합 간 의 차 이 는 GetDC 에서 전 송 된 핸들 을 이용 하여 전체 디 스 플레이 영역 에 그림 을 그 릴 수 있다 는 것 이다.
물론 GetDC 와 ReleaseDC 는 디 스 플레이 영역 에서 가능 한 모든 잘못된 영역 을 유효 하 게 만 들 지 않 습 니 다.
Windows 프로그램 은 전체 창 에 적용 되 는 장치 컨 텍스트 핸들 도 얻 을 수 있 습 니 다.
hdc = GetWindowDC(hwnd);
// 기타 조작
ReleaseDC(hwnd, hdc);
이 장치 의 컨 텍스트 는 디 스 플레이 영역 외 에 창의 제목 표시 줄, 메뉴, 스크롤 바, 프레임 도 포함 되 어 있 습 니 다.
GetWindowDC 함 수 는 거의 사용 되 지 않 습 니 다. 사용 하려 면 WM 를 차단 해 야 합 니 다.NCPAINT 소식,
윈도 는 이 메 시 지 를 사용 하여 창의 비 디 스 플레이 영역 에 그림 을 그립 니 다.
BeginPaint, GetDC, GetWindowDC 에서 얻 은 장치 의 상하 문장 손 잡 이 는 모두 모니터 의 특정한 창 과 관련 이 있다.
장치 컨 텍스트 핸들 을 가 져 오 는 또 다른 일반적인 함 수 는 CreateDC 입 니 다.
hdc = CreateDC(pszDreiver, pszDevice, pszOutput, pData);
// 기타 조작
DeleteDC(hdc);
.......
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.