문제

HDC를 사용하는 드로잉 기능이 있습니다. 그러나 인쇄 할 내용의 정확한 스케일 버전을 보여 주어야합니다.

따라서 현재 프린터 HDC와 프린터의 HDC와 함께 CreateCompatibledc ()를 사용합니다.

DC가 프린터의 정확한 너비와 높이를 갖게 될 것이라고 생각합니다. 이 HDC에 글꼴을 선택하면 텍스트가 프린터와 같이 정확히 조정됩니다.

불행히도, 나는이 HDC의 픽셀을 컨트롤의 HDC에 복사하기 위해 StretchBlt ()를 할 수 없습니다.

프린터 페이지와 동일한 w, h의 Window HDC에서 "메모리 캔버스"를 만들면 글꼴은 페이지가 아닌 화면에 대해 스케일이 스케일로 나오기 때문에 나옵니다.

창의 dc에서 createcompatibledc ()와 프린터의 DC 또는 무언가에서 createcompatiblebitmap ()에서 createcompatibledc ()가 필요합니까 ??

누군가가 올바른 방법을 설명 할 수 있다면. (그리고 여전히 프린터에서 정확히 보이는 것이 있습니다) ...

글쎄, 나는 그것을 고마워요 !!

... 스티브

도움이 되었습니까?

해결책

얼마나 정확한 지에 따라 어려워 질 수 있습니다.

많은 접근 방식이 있습니다. 프린터 크기의 비트 맵으로 끌려 가서 축소하려고하는 것처럼 들립니다. 그렇게하는 단계는 다음과 같습니다.

  1. 프린터에 대한 DC (또는 더 나은 IC-정보 컨텍스트)를 만듭니다.
  2. 프린터 DC를 쿼리하여 해상도, 페이지 크기, 물리적 오프셋 등을 찾으십시오.
  3. 창/화면에 대한 DC를 만듭니다.
  4. 호환 DC (메모리 DC)를 만듭니다.
  5. 창/화면에 호환 비트 맵을 만듭니다. 그러나 크기는 프린터 페이지의 픽셀 크기 여야합니다. (이 접근법의 문제점은 이것이 큰 비트 맵이고 실패 할 수 있다는 것입니다.)
  6. 메모리 DC에 호환 비트 맵을 선택하십시오.
  7. 실제 프린터로 그리는 경우 사용하는 동일한 좌표를 사용하여 메모리 DC로 그리십시오. (글꼴을 선택하면 화면의 논리적 인치가 아닌 프린터의 논리 인치로 확장하십시오.)
  8. StretchBlt 메모리 DC가 창에 대한 전체 이미지를 축소합니다. 스트레치 모드를 실험하여 표시 할 이미지의 종류에 가장 적합한 것을 확인할 수 있습니다.
  9. 모든 리소스를 해제하십시오.

그러나 그 방향으로 향하기 전에 대안을 고려하십시오. 이 접근법에는 거대한 오프 스크린 비트 맵을 할당하는 것이 포함됩니다. 이것은 자원이 부족한 컴퓨터에서 실패 할 수 있습니다. 그렇지 않더라도 다른 앱을 굶주릴 수 있습니다.

다른 답변에 주어진 메타 플레 접근법은 많은 응용 프로그램에 적합한 선택입니다. 나는 이것으로 시작할 것이다.

또 다른 접근법은 일부 가상의 고해상도 단위의 모든 크기를 파악하는 것입니다. 예를 들어, 모든 것이 1000 분의 1 인치라고 가정합니다. 그런 다음 드로잉 루틴은이 가상 유닛을 대상 장치에서 사용하는 실제 DPI로 확장합니다.

이 마지막 접근법 (및 아마도 메타 플 레일)의 문제는 GDI 글꼴이 완벽하게 선형으로 확장되지 않는다는 것입니다. 개별 문자의 너비는 대상 해상도에 따라 조정됩니다. 고해상도 장치 (300+ DPI 레이저 프린터와 같은) 에서이 조정은 최소화됩니다. 그러나 96-DPI 화면에서 조정은 라인의 길이보다 상당한 오류를 추가 할 수 있습니다. 따라서 미리보기 창의 텍스트는 인쇄 된 페이지에서보다 비율 외 (일반적으로 더 넓음)가 나타날 수 있습니다.

따라서 하드 코어 접근법은 프린터 컨텍스트에서 텍스트를 측정하고 화면 컨텍스트에서 다시 측정하고 불일치를 조정하는 것입니다. 예를 들어 (메이크업 번호 사용) 프린터 컨텍스트에서 일부 텍스트의 너비를 측정 할 수 있으며 900 프린터 픽셀로 나옵니다. 스크린 픽셀 대 프린터 픽셀의 비율이 3 : 1이라고 가정합니다. 화면의 동일한 텍스트가 300 화면 픽셀이 될 것으로 예상됩니다. 그러나 화면 컨텍스트에서 측정하고 325 화면 픽셀과 같은 값을 얻습니다. 화면에 그리면 어떻게 든 텍스트 25 픽셀을 좁게 만들어야합니다. 캐릭터를 서로 더 가까이 돌리거나 약간 작은 글꼴을 선택한 다음 늘릴 수 있습니다.

하드 코어 접근법에는 더 복잡성이 포함됩니다. 예를 들어, 프린터 드라이버의 글꼴 대체를 감지하고 사용 가능한 화면 글꼴과 최대한 밀접하게 일치시킬 수 있습니다.

나는 큰 비트 맵과 하드 코어 접근의 하이브리드로 행운을 빕니다. 전체 페이지에 거대한 비트 맵을 만드는 대신 텍스트 라인을 위해 충분히 큰 것을 만듭니다. 그런 다음 프린터 크기로 오프 스크린 비트 맵으로 그리고 StretchBlt 화면 크기로 내려갑니다. 이것은 글꼴 품질의 약간의 저하에서 크기의 불일치를 다루는 것을 제거합니다. 실제 인쇄 미리보기에 적합하지만 Wysiwyg 편집기를 만들고 싶지는 않습니다. 한 줄의 비트 맵은 이것을 실용적으로 만들기에 충분히 작습니다.

좋은 소식은 텍스트 만 어렵다는 것입니다. 다른 모든 도면은 좌표와 크기의 간단한 스케일링입니다.

나는 GDI+를 많이 사용하지 않았지만 비선형 글꼴 스케일링으로 멀어 졌다고 생각합니다. 따라서 GDI+를 사용하는 경우 좌표를 확장해야합니다. 단점은 GDI+의 글꼴 품질이 좋다고 생각하지 않는다는 것입니다.

마지막으로 Vista의 기본 앱이라면 프로세스를 "로 표시했는지 확인하십시오."DPI AWARE"그렇지 않으면 사용자가 DPI 화면이 높은 경우 Windows가 귀하에게 거짓말을하고 해상도가 96 DPI에 불과하다고 주장한 다음 귀하가 그린 모든 것을 퍼지 업 스케일링을 수행합니다. 이것은 시각적 품질을 저하시키고 만들 수 있습니다. 인쇄 미리보기를 훨씬 더 복잡하게 디버깅합니다. 많은 프로그램이 더 높은 DPI 화면에 적응하지 않기 때문에 Microsoft는 기본적으로 Vista에서 시작하여 "높은 DPI 스케일링"을 추가했습니다.

추가하기 위해 편집

또 다른 경고 : 프린터 크기의 비트 맵으로 메모리 DC에 HFONT를 선택하면 가능한 실제 프린터 DC로 동일한 HFONT를 선택할 때 얻을 수있는 것과 다른 글꼴을 얻습니다. 일부 프린터 드라이버는 메모리에서 공통 글꼴을 대체하기 때문입니다. 예를 들어, 일부 PostScript 프린터는 특정 공통 트루 타입 글꼴로 내부 PostScript 글꼴을 대체합니다.

먼저 프린터 IC로의 HFONT를 선택한 다음 GDI 기능을 사용하여 GetTextFace, GetTextMetrics, 그리고 아마도 GetOutlineTextMetrics 선택한 실제 글꼴에 대해 알아 보겠습니다. 그런 다음 프린터가 사용하는 것을 더 밀접하게 일치시키고, HFONT로 바꾸고, 메모리 DC로 선택할 수 있도록 새로운 로그 폰트를 만들 수 있습니다. 이것이 정말 좋은 구현의 마크입니다.

다른 팁

시도할만한 가치가있는 한 가지는 향상된 Metafile DC를 생성하고 정상으로 그리는 다음 프린터 메트릭을 사용 하여이 메파를 확장하는 것입니다. 이것은 다음과 같은 접근법입니다 wtl BMPVIEW 샘플 - 이것이 얼마나 정확한지 모르겠지만 볼 가치가있을 수 있습니다 (관련 클래스를 Win32로 쉽게 포팅 할 수 있어야하지만 WTL은 Win32 프로그래밍을 대체 할 수 있으므로 활용할 가치가 있습니다.)

프린터 DC에 해상도가 높기 때문에 동일하게 보이지 않으므로 전환 기능을 작성해야합니다. 나는 당신이 작업 해야하는 방법을 가지고 갈 것이지만 텍스트가 너무 작았고 모든 위치/글꼴 크기에 프린터 창 너비를 곱하고 소스 창 너비로 나눕니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top