Q&A

  • 메모리 DC 쓰는법좀 알려주세요..
도면을 레포트에 첨부해서 출력해야 되서..
도면을 불러온다음에 bmp로 카피한다음에 저장하고
다시 그걸 불러서..레포트로 출력하려고 합니다.

그런데 어디선가 주어들은 메모리 DC를 쓰면 해결될수 있을듯한데..ㅜㅜ
어떻게 쓰는것인지 몰라서요..
가르쳐주시면 정말 감사하겠습니다.
아니면 무엇을 참고해야하는지 어디를 뒤져봐야하는지 아무 정보라도여...ㅠㅠ
부탁드리겠습니다.ㅠㅠ

좋은 하루 감기 조심하세요..
3  COMMENTS
  • Profile
    하얀까마귀 2004.11.12 02:30
    안녕하세요 하얀까마귀 입니다.

    말씀하신 DC가 그냥 하면에 나타나지 않고 가지고 있느냐 아니면 화면의
    DC인가 에 따라서 그냥 메모리 DC라고 하죠..
    뭐 그정도의 차이뿐이에요.. 어케 구현하느냐의 차이겠지만..

    다른건 다 빼구요..

    간단하게 말씀드리면  Canvas.Handle <-- 이넘이 HDC입니다. DC의 핸들이죠.. 다시 말해서 Canvas라는게 DC라고 생각하시면 됩니다.

    윈도우즈에 있는 수많은 DC 관련 함수들은 파라메터로 HDC를 받도록 되어있죠 Canvas는 이걸 내부에 가지고 있는것 뿐이고 그러한 API를 내부에서
    부르는 정도의 차이입니다.  모든 API가 Canvas에서 다 부를수 잇는건
    아니라서 API로 써야 할때도 있긴 하지만요..
    도면을 불러와서 bmp로 저장하는건
    bitblt( bmp.canvas.handle, 0,0, width, height, 도면.handle, SRCCOPY);
    요렇게 하심 되겟네요..
    반대도 마찬가지..
    레포트도 마찬가지죠? beginDoc EndDoc을 불러서 레포팅을 해버리면 되죠
    여기서도 마찬가지로 dc를 가지고 놀기 때문에 그냥 복사 해버리셔도 될듯 하군요..

    그럼.. 에구 쉽게 설명한다고 했는데 잘되었는지 모르겟군요...

    HDC는 기본적인 함수들이라고 보시면 되요. 화면에 무언가를 표현하기 위해선 이걸 안쓰고는 안되니까요.
    그럼.. 많은 윈도우즈 API관련책에는 다 나와있을껍니다.






  • Profile
    최용일 2004.11.06 04:12
    안녕하세요. 최용일입니다.

    메모리 DC나 그냥 DC나 별 차이 없어요.

    자료는 서점가셔서 Windows API책을 보시면 잘 나옵니다.

    ^^ 항상 즐코하세요...

  • Profile
    하영호 2004.11.12 22:26
    답변 정말..감사합니다..

    화면에서 보이는 DWG컨트롤에서의 캡쳐는 해결된거 같은데요..
    그 컴포넌트 위에 무언가가 있음 같이 캡쳐가 되어버리네요...
    이건 해결하지 못했지만...
    제가 사용한 방식을 올려놓을께요..
    이거저거 막해서 좀 이상하기 하지만..결과는 나오더라구여.


    아래는...판넬위의 도면컨트롤의 도면을 캡쳐하는 소스입니다.
    그냥 판넬위를 캡쳐하는거져..쩝.
    procedure TForm1.SetPictureSave3;
    var
      X,Y: Integer;
      DC: HDC;
      WinScr: TBitmap;
      ImageSavePath, Filename: String;
    begin
       HWNDC := Handle;

      X := Form1.left + Panel1.Left;
      Y := Form1.top + Panel1.Top;
      ImageSavePath := ExtractFilePath(Application.ExeName);       //저장하려는 곳의 경로
      Filename := 'shape.bmp'; //파일명

      WinScr := TBitMap.Create;
      WinScr.Width  := Panel1.Width;
      WinScr.Height := Panel1.Height;

      DC := GetDC(HWNDC);
      BitBlt(WinScr.Canvas.Handle, 0, 0, WinScr.Width, WinScr.Height, DC, Panel1.Left+2, Panel1.Top+2, NOTSRCCOPY        );

      ReleaseDC(0,DC);
      WinScr.SaveToFile(ImageSavePath+Filename);
      Application.ProcessMessages;

      WinScr.Free;

    end;


    이거는 레포트에서...이미지로 저장하는 것입니다.
    전 테스트로 bmp와 jpeg를..
    이런식으로 호출하면 됩니다.

    ReportToJpg(Form2.QuickRep1);


    procedure TForm1.ReportToJpg(tReport: TQuickRep);
    var
      i : Integer;
      BMP: TBitMap;
      Jpeg1  :TJpegImage;
      SaveDlg : TSaveDialog;
      FilePath : String;
      StoredUnits: TQRUnit;
    begin
      SaveDlg := TSaveDialog.Create(nil);
      SaveDlg.FileName:= 'Report';
      SaveDlg.Filter:='*.jpg|*.jpg';
      if SaveDlg.Execute=False then
      begin
         SaveDlg.Free;
         Exit;
      end;
      FilePath:=SaveDlg.FileName;
      i:=pos('.',FilePath);

      if i > 0 then
         FilePath:=Copy(FilePath,1,i-1);

      FilePath:=FilePath;
      SaveDlg.Free;

      tReport.Prepare;
      StoredUnits := tReport.Units;
      tReport.Units := Pixels;

      try
         for i:=1 to tReport.QRPrinter.PageCount do begin
            BMP:=TBitMap.Create;
            Jpeg1 := TJpegImage.Create;
            try
               BMP.Width := Round(tReport.Page.Width);
               BMP.Height := Round(tReport.Page.Length);
               tReport.QRPrinter.PageNumber:=i;
               BMP.Canvas.Draw(0, 0, tReport.QRPrinter.Page);
               BMP.SaveToFile(FilePath+'_'+IntToStr(i)+'.bmp');
               Jpeg1.Assign(BMP);
               Jpeg1.SaveToFile(FilePath+'_'+IntToStr(i)+'.jpg');

            finally
               BMP.Free;
               Jpeg1.Free;
            end;
         end;
      finally
         tReport.Units:=StoredUnits;
      end;


    end;