|
제가 글을 쓰고 답변도 제가 쓰게 되는군요.
아래 글처럼 Bitmap을 만들고 그리는 방식은 많은 메모리를 요구하기 때문에 문제가 많습니다.
프린트가 되지 않을수도 있고 프린터 버퍼링으로 많은 시간이 걸릴 수도 있습니다.
따라서 프린터 DC에 그리는 것이 정석이며 일반적으로 그렇게 처리하면 됩니다.
Epson에서 프린터가 되지 않아 여러 가지 테스트를 했습니다.
PDF 파일로 만들어 프린트 해 보기까지 했으니까요.
PDF도 벡터로 프린트를 하지만 역시 제가 만들고 있는 프로그램처럼 라인을 끊어지는 현상이
나타났습니다. 하지만 같은 회사 제품인 Illustrator같은 경우에는 문제없이 프린트가 되더군요.
따라서 Illustrator의 RIP의 영향이라고 생각했었습니다.
하지만 결과는 이렇습니다.
아래에 제시한 방법을 이용하면 간단하게 끊기지 않고 라인(커브)을 프린트 할 수 있었습니다.
GDI 또는 GDI+에는 SetDashPattern이라는 함수가 있습니다. 정확하게 Pen에 있는 함수입니다.
우리는 User Style로 Dash를 만들수 있는데 이때 사용하는 함수입니다.
Solid Pen을 Dash Pen으로 대체함으로써 라인 끊김을 해결한 것입니다.
현재 제가 만드는 프로그램은 모든 라인을 Dash로 User Sytle Dash로 바꿀까 생각중입니다.
이 것은 GDI가 기본 제공하는 Dash이외의 모든 라인을 커버할 수 있기 때문입니다.
방법은 간단합니다. Dash와 Space가 있는데 Dash만 값을 넣고 Space를 "0"으로 하면
Solid Line과 같아집니다.
현재 C++ Builder와 MFC에서 모두 테스트 한 결과 정상적으로 출력됩니다.
Solid로 했을 땐 C++ Builder와 MFC에서 모두 라인이 끊기는 현상이 나타났었습니다.
아래 예시는 GDI+로 간단하게 처리하는 내용입니다.
GDI+ Help에서 Copy한 소스입니다.
VOID Example_SetDashPattern(HDC hdc)
{
Graphics graphics(hdc);
// Create and set an array of real numbers.
REAL dashVals[4] = {
5.0f, // dash length 5
2.0f, // space length 2
15.0f, // dash length 15
4.0f}; // space length 4
// Create a Pen object.
Pen pen(Color(255, 0, 0, 0), 5);
// Set the dash pattern for the custom dashed line.
pen.SetDashPattern(dashVals, 4);
// Draw the custom dashed line.
graphics.DrawLine(&pen, 5, 20, 405, 200);
}
leo21c 님이 쓰신 글 :
: 현재 이미지 프린트 하는 부분에 이상이 있어서 이곳에 글을 남깁니다.
: 이상하게 HP프린트에서는 상관이 없는데 Epson프린트로 프린트를 하면
: Curve가 끊어지는 현상이 발생합니다.
: 수순하게 API만을 이용해서 처리를 해도 같은 문제가 발생하네요.
: API로 프린터 핸들을 얻고 GDI+로 Graphic 객체를 얻어 그 곳에 그림을
: 그리게 만들었습니다.
:
: 혹시 개발 중에 이와 같은 문제가 발생해 보신 분이 계시거나 이유를
: 알고 계시면 답변좀 부탁드립니다.
:
: 이와 같이 하면 끊어지지 않더군요.
: Bitmap을 만들고 그 위에 커브로 그림을 그린후 그 Bitmap을 프린터
: 캔버시에 Bitblt하면 끊어지지 않습니다. 하지만 프린트 dpi를 높이면
: 엄청나게 큰 Bitmap이 필요하기 때문에 이 부분에서 문제가 발생하더군요.
:
: 프린터 캔버스에 직접 그리면 몇kbytes만 충분하지만 Bitmap에 그린후
: 그것을 프린터 캔버스로 옯기면 몇백Mbytes가 필요합니다.
: 예를들어 A3정도 크기면 첫번째 방법은 500K, 두번째 방법은 500M가
: 필요하더군요. 최대 해상도 출력으로요~
|