Q&A

  • webbrowser 캡쳐할때의 문제점..
procedure tb_captureClick(Sender: TObject);
var
  ViewObject: IViewObject;
  sourceDrawRect: TRect;

begin

wb_Explorer.width := wb_Explorer.DefaultInterface.Width; <-- 여기와
wb_Explorer.Height := wb_Explorer.DefaultInterface.Height;  <-- 여기의 값이 문제..

  image1.Width := wb_Explorer.width;
  image1.Height := wb_Explorer.Height;
  if wb_explorer.Document <> nil then
  try
    wb_explorer.Document.QueryInterface(IViewObject, ViewObject);
    if ViewObject <> nil then
      try
        sourceDrawRect := Rect(0, 0, Image1.Width, Image1.Height);
        ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Self.Handle,image1.Canvas.Handle, @sourceDrawRect, nil, nil, 0);
      finally
        ViewObject._Release;
      end;
  except
  end;
end;


위에 표시한 곳이 문젭니다.

웹 브라우져 컨트롤을 이용해서 페이지를 열었을때..
해당하는 페이지의 컨텐츠가 많을 경우 우측에 스크롤바가 생깁니다.

그런데 image1.width 와 height를 제대로 설정해 주지 않으면 image1의 크기에 맟춰서 이미지를 축소해서 캡쳐가 되어 버립니다.

그래서..브라우져의 스크롤로 인해 감춰진 부분을 모두 포함하는 전체 크기를
알아내서 image1의 크기를 설정해 준 다음에
ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Self.Handle,image1.Canvas.Handle, @sourceDrawRect, nil, nil, 0);
이부분을 실행 시켜 줘야 하는데 이 부분에서 막히고 있습니다.

도움 부탁드립니다.

아래서 도움을 주셨던분 programming internetexplorer이란 책을 교보문고 가서 1시간이나 뒤졌는데 결국 못 찾았습니다.ㅠㅠ

그럼..
3  COMMENTS
  • Profile
    nilriri™ 2003.03.04 02:38
    추가적인 문제점이 발견될지 모르지만 일차적으로 원하는 결과를 얻어 냈습니다.

    정석이 아닌지도..ㅡㅡ; 혹시 올바른 방법을 아시는 분 리플을..^^;

    웹 브라우져 컨트롤을 스크롤 박스 안에 배치했습니다.

    그리고 DocumentComplete 이벤트에서 아래와 같이 ...

    그럼..

    procedure Tfrm.FormCreate(Sender: TObject);
    begin
        webBrowser.Top := 0;
        webBrowser.Left := 0;
        webBrowser.Height := ScrollBox2.ClientHeight;
        webBrowser.Width := ScrollBox2.ClientWidth;
    end;

    procedure Tfrm.wb_explorerDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    var
       docHeight, i : integer;
    begin
       if webBrowser.OleObject.Document.Frames.Length < 1 then
       begin
          webBrowser.Height := Integer(webBrowser.OleObject.Document.Body.ScrollHeight);
       end else
       begin
          docHeight := 0;
          for i := 0 to webBrowser.OleObject.Document.Frames.Length - 1 do
          begin
             docHeight := docHeight + integer(webBrowser.OleObject.Document.Frames.Item(i).Document.Body.ScrollHeight);
          end;
          webBrowser.Height := docHeight;
       end;
       if webBrowser.Height < ScrollBox2.ClientHeight then
       begin
          webBrowser.Height := ScrollBox2.ClientHeight;
       end;
    end;
  • Profile
    김병곤 2003.03.04 02:56
    음...저러케 해서 캡쳐는 어떤식으로 하시나요?
    스크롤바의 크기도 계속 바뀌어서 문제가될듯한데...
    그리고 아래글에서 말씀드렸던 책은 좀 옛날 책이 되나서
    정확한 책이름이 생각이 안 나네요. Microsoft Press책인데
    지금은 사무실이라 확인할 길이 없네요.
    퇴근후에 찾아서 리플 달아드리죠.

  • Profile
    nilriri™ 2003.03.04 03:04
    procedure Tfrm.tb_captureClick(Sender: TObject);
    var
      ViewObject: IViewObject;
      sourceDrawRect: TRect;
    begin
       //캡쳐 버튼을 클릭하기 전에..
       //브라우져 컨트롤의 width, height를 설정할때 image1컨트롤의
       //height와 width도 설정해 둡니다..
       //그러면 버튼을 클릭했을때 이 프로시져를 타게 되고..그러면..
       //아래 보시는거 처럼..이미지 파일로 웹브라우져의 내용이 그대로 나타납니다.

       if wb_explorer.Document <> nil then
       try
          wb_explorer.Document.QueryInterface(IViewObject, ViewObject);
          if ViewObject <> nil then
          begin
             try
                sourceDrawRect := Rect(0, 0, Image1.Width, Image1.Height);
                ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Self.Handle,image1.Canvas.Handle, @sourceDrawRect, nil, nil, 0);
             finally
                ViewObject._Release;
             end;
          end;
       except
       end;
    end;