2010-05-06 3 views
7

MFC의 상대적 신참으로서, 나는 장치 컨텍스트 (DC)를 많이 봅니다. 저는 그것이 드로잉과 관련이 있다는 것을 모호하게 이해합니다. 그러나 구체적인 내용은 어디에서나 찾을 수 있습니다. "호환 가능한 장치 컨텍스트"를 만드는 것이 무엇을 의미하며, 그 이유는 무엇입니까? SelectObject는 무엇을합니까? 먼저 DC를 호환 가능하게해야합니까?장치 컨텍스트 이해

답변

11

장치 컨텍스트는 그리기가 발생하는 장소 일 뿐이므로 두 가지 서로 다른 DC가있는 경우 서로 다른 두 위치에 그림이 그려집니다. 파일 핸들과 비슷합니다.

장치 컨텍스트는 화면의 부동산 또는 메모리에있는 비트 맵을 나타낼 수 있으며, 아마도 다른 곳에서도 역시 내가 생각할 수있는 두 가지입니다.

호환 가능한 컨텍스트는 동일한 기본 픽셀 구성을 갖는 것으로, 픽셀 당 비트 수, 픽셀 당 바이트 수, 색 구성 등을 의미합니다. 메모리 비트 맵 장치 컨텍스트는 원하는 모든 구성을 가질 수 있지만 화면 컨텍스트는 그래픽 카드의 버퍼와 관련이 있습니다 (모드 등에 따라 다름). 매우 특정한 픽셀 구성을 갖습니다.

호환 가능한 컨텍스트를 사용하면 데이터를 거의 또는 전혀 변환하지 않아도되므로 이미지 데이터를 효율적으로 전송할 수 있습니다. 다른 극단에서는 256 색 팔레트, 8 비트 맵이 있고 각 픽셀 당 RGBA가 8 비트 인 화면에 블라이드를 시도하면 모든 마지막 픽셀은 복사 될 때 상당한 양의 마사지가 필요하므로 호환되지 않는 비트 맵은 매우 느립니다. Win32 SDK 설명서에 따르면 적어도 BitBlt() 및 StretchBlt()는 대상 형식과 일치하도록 원본 색 형식을 변환하므로 수행 할 수 있습니다.

이미 존재하는 드로잉 컨텍스트와 호환되는 드로잉 컨텍스트를 만드는 방법의 시작점으로 CreateCompatibleDC() 및 CreateCompatibleBitmap()을 조사하십시오.

SelectObject()는 현재 장치 컨텍스트에서 활성화되어있는 리소스를 제어합니다. 컨텍스트에는 현재 펜, 브러시, 글꼴 및 비트 맵이 있습니다. 이것들은 더 적은 수의 매개 변수를 지정함으로써 다른 많은 GDI 호출을 더 간단하게 만듭니다. 예를 들어, TextOut()을 사용할 때 글꼴을 지정할 필요는 없지만 글꼴을 변경하려면 SelectObject()가옵니다. 글꼴에 SelectObject() 핸들을 제공하면 반환 값 value는 적용된 글꼴의 핸들이며 후속 작업은 새 글꼴을 사용합니다. 다른 종류의 리소스, 펜, 브러시 등의 동작은 동일합니다.

+0

고마워요! 그 다음 몇 가지 후속 질문 : 다음과 같이 호환되지 않는 DC를 사용할 수 있습니까? 여전히 작동하는 프로그램이 있습니까? (훨씬 느리지 만)? 그리고 SelectObject는 Device Context Compatibility의 개념을 어디에 있습니까? – Smashery

+0

@Smashery : 이러한 문제를 해결하기 위해 조금 편집했습니다. – JustJeff

+0

감사합니다. 매우 명확하고 유용한 답변입니다! – Smashery