Q&A

  • 폼의 일부분을 출력하는 방법에 대해 질문 드립니다.


첨부한 이미지와 같은 폼에서 왼쪽 부분인 차트와 차트밑의 레이블들의 값을 프린트하고자 합니다.

chart 컴포넌트의 print를 사용하니...레이블들이 프린트되지를 않고.. ㅜㅜ

form.print를 사용하니...왼쪽 위로 쏠려서 프린트되고... ㅜㅜ

getDC를 써서 이미지를 캡춰한뒤 프린트하는 방법은 모르겠고...ㅜㅜ

printDialog로 도 어떻게 사용하는지를 모르겠고...

정말 미치겠습니다...

위에서는 안되는게 어딨냐고....

무조건 까라면 까라고 하고...

좀 도와주십쇼...

부탁드립니다.
4  COMMENTS
  • Profile
    구창민 2007.10.26 01:01
    안녕하세요..

    아래 코드들이 적절한 참고자료가 될것 같습니다..

    아래는 폼의 일부분을 이미지로 저장하는 루틴과 이미지를 출력하는 루틴입니다.

    적절히 응용하셔서 즐거운 프로그래밍 하시길~

    //폼의 특정부위 (아래예제는 폼위에 판넬크기만큼 캡쳐) 를 이미지로 저장
    procedure TForm1.Button1Click(Sender: TObject);
    var PnlBmp   : TBitmap;
        PnlCanvas: TCanvas;
        PnlRect  : TRect;
        BmpFileName: String;
    begin
      BmpFileName:= ExtractFilePath(Application.ExeName) + 'aaa.bmp';
      with Panel1 do
        PnlRect := Rect(Left, Top, (Left + Width),(Top + Height));

      PnlCanvas := TCanvas.Create;
      PnlBmp := TBitmap.Create;

      try
        PnlCanvas.Handle := GetDC(0);
        PnlBmp.Width := Panel1.Width;
        PnlBmp.Height := Panel1.Height;
        PnlBmp.Canvas.CopyMode := cmSrcCopy;
        PnlBmp.Canvas.CopyRect(Rect(0, 0, Panel1.Width, Panel1.Height), PnlCanvas, PnlRect);

        PnlBmp.SaveToFile(BmpFileName);
    finally
       PnlBmp.Free;
       PnlCanvas.Free;
    end;
    end;


    //이미지를 출력
    procedure DrawImage(Canvas: TCanvas; DestRect: TRect; ABitmap: TBitmap);
    var
    Header, Bits: Pointer;
    HeaderSize, BitsSize: Integer;
    begin
    GetDIBSizes(ABitmap.Handle, HeaderSize, BitsSize);
    GetMem(Header, HeaderSize);
    GetMem(Bits, BitsSize);
    try
       GetDIB(ABitmap.Handle, ABitmap.Palette, Header^, Bits^);
       StretchDIBits(Canvas.Handle, DestRect.Left, DestRect.Top,
           DestRect.Right - DestRect.Left, DestRect.Bottom - DestRect.Top,
           0, 0, ABitmap.Width, ABitmap.Height, Bits, TBitmapInfo(Header^),
           DIB_RGB_COLORS, SRCCOPY);
    finally
       FreeMem(Header, HeaderSize);
       FreeMem(Bits, BitsSize);
    end;
    end;

    이미지 출력 호출은 다음과 같이... (Left, Top, Right, Bottom 은 인쇄하는 크기)
    DrawImage(Printer.Canvas, Rect(Left, Top, Right, Bottom), MyBitmap);

  • Profile
    Ol츠미 2007.10.26 07:25
    답변 정말정말 감사합니다.

    그런데...제 프로그램에 맞게 수정을 해서 출력을 해보니..

    실행창의 제가원하는 패널이 출력이 안되고

    윈도우전체화면에서 일정한 크기를 캡처해서 출력을 하네요...ㅠㅠ

    그리고 그림도 왼쪽위에 쏠려서 작게 나오고요...

    이 두가지 문제에 대해서도 좀 알려주세요...

    그럼 부탁드립니다.


  • Profile
    구창민 2007.10.26 20:30
      PnlCanvas.Handle := GetDC(0);
    위 코드를
      PnlCanvas.Handle := GetDC(폼.Handle);
    로 바꾸고 테스트 해보세요..

    그럼~ 즐거운 프로그래밍하시길~



  • Profile
    Ol츠미 2007.10.26 22:47
    정말 정말 감사드립니다.

    정말 복 받으실꺼에요~~^^