아래는 제가 사용하던 소스입니다.하지만 제대로 안되네요..
잌스플로워 6.0 일때는 대부분 사이트는 잘 되는데 어떤 사이스는 잘 안되고 그랬읍니다.
근데 잌스플로워 7.0 깔고는 그나마 안되네요...ㅋ
참고 하시고...실력이 출중하시니...잘 되게 만드셔서 팁란에 좀 올려주시면 감사할께요....^^
그럼..
Panel 하나 올리고 그 안에 TCppWebBrowser 넣고 Panel 의 visible=false 로 놓고 쓰던겁니다.ㅋ
#include "mshtml.h"
//---------------------------------------------------------------------------
const IID IID_IHTMLElementRender = {0x3050F669, 0x98B5, 0x11Cf, {0xBB, 0x82, 0x00, 0xAA, 0x00, 0xBD, 0xCE, 0x0B}};
//---------------------------------------------------------------------------
void capture_web_page(AnsiString url_str,Graphics::TBitmap*bmp)
{
TCppWebBrowser*w=Form20->CppWebBrowser1;
wchar_t strFilename[MAX_PATH];
MultiByteToWideChar(CP_ACP,0,url_str.c_str(),-1,strFilename,MAX_PATH);
w->Navigate(strFilename);
int tick=::GetTickCount();
//load 가 끝나기를 기다림..
while(w->ReadyState!=Shdocvw_tlb::READYSTATE_COMPLETE){
Application->ProcessMessages();
if(::GetTickCount()-tick>1000*30){
return;
}
}
HRESULT hr;
IHTMLDocument2*pDocument=0;
IDispatch*pDispatch=0;
pDispatch=w->Document;
hr=pDispatch->QueryInterface(IID_IHTMLDocument2,(void**)&pDocument);
if(FAILED(hr))return;
IHTMLElement*pElement=0;
hr=pDocument->get_body(&pElement);
if(FAILED(hr))return;
IHTMLStyle*pStyle=0;
hr=pElement->get_style(&pStyle);
if(FAILED(hr))return;
hr=pStyle->put_border(L"none");
if(FAILED(hr))return;
IHTMLBodyElement*pBodyElement=0;
hr=pElement->QueryInterface(IID_IHTMLBodyElement,(void**)&pBodyElement);
if(FAILED(hr))return;
hr=pBodyElement->put_scroll(L"no");
if(FAILED(hr))return;
IHTMLElement2*pElement2=0;
hr=pElement->QueryInterface(IID_IHTMLElement2,(void**)&pElement2);
if(FAILED(hr))return;
long width;
long height;
hr=pElement2->get_scrollHeight(&height);
if(FAILED(hr))return;
hr=pElement2->get_scrollWidth(&width);
if(FAILED(hr))return;
w->Width=width;
w->Height=height;
IHTMLElementRender*pRender=0;
hr=pElement->QueryInterface(IID_IHTMLElementRender,(void**)&pRender);
if(FAILED(hr))return;
bmp->Width=width;
bmp->Height=height;
pRender->DrawToDC(bmp->Canvas->Handle);
pDocument->Release();
pDispatch->Release();
pElement->Release();
pStyle->Release();
pBodyElement->Release();
pElement2->Release();
pRender->Release();
pDocument=0;
pDispatch=0;
pElement=0;
pStyle=0;
pBodyElement=0;
pElement2=0;
pRender=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm20::Button1Click(TObject *Sender)
{
Graphics::TBitmap*p=new Graphics::TBitmap();
capture_web_page("
http://www.borlandforum.com",p);
Canvas->Draw(0,0,p);
delete p;
}
//---------------------------------------------------------------------------
장성호 님이 쓰신 글 :
: WebBroswer 이미지를 그대로 TImage에 draw하려고 합니다.
:
: Delphi에서 TWebBroswer 나 TEmbeddedWB 로는 잘 되던데..
: C++Builder에서 TCppWebBrowser로는 잘 안되네요
:
:
:
: //델파이 소스
: procedure GenerateBitmapfromBrowser2(browser: iWebBrowser2; srcHeight: integer; srcWidth: integer; Image: TImage);
: var
: sourceDrawRect : TRect;
: aViewObject : IViewObject;
: begin
: try
:
: aViewObject := browser as IViewObject;
:
: if aViewObject=nil then
: Exit;
:
: Image.Picture.Bitmap.Width:=srcWidth;
: Image.Picture.Bitmap.Height:=srcHeight;
: sourceDrawRect := Rect(0, 0, srcWidth, srcHeight);
:
: OleCheck(aViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil,
: Form1.Handle,
: Image.Picture.Bitmap.Canvas.Handle,
: @sourceDrawRect, nil, nil, 0));
:
: except
: // error handler code
: end; { try }
: end;
:
: procedure TForm1.CopyBroswerImage();
: begin
:
: GenerateBitmapfromBrowser2(EmbeddedWB1.ControlInterface,EmbeddedWB1.Height, EmbeddedWB1.Width,Image1);
: Image1.Repaint;
:
: end;
: //----------------------------------------------------------
: //C++Builder소스
:
: void __fastcall GenerateBitmapfromBrowser2(IWebBrowser2 *browser, int srcHeight,int srcWidth,TImage *Image)
: {
:
: IViewObject *ViewObject=(IViewObject *)browser;
: TRect rc=Rect(0,0,srcWidth, srcHeight);
:
: if(ViewObject==NULL)return;
:
: Image->Picture->Bitmap->Width=srcWidth;
: Image->Picture->Bitmap->Height=srcHeight;
: OleCheck(ViewObject->Draw(DVASPECT_CONTENT, 1, NULL, NULL, Form1->Handle, Image->Picture->Bitmap->Canvas->Handle,(const _RECTL *)&rc, NULL,NULL, 0));
: }
:
:
: void __fastcall TForm1::Button3Click(TObject *Sender)
: {
: GenerateBitmapfromBrowser2(CppWebBrowser1->ControlInterface,CppWebBrowser1->Height, CppWebBrowser1->Width,Image1);
: Image1->Repaint();
: }
: //---------------------------------------------------------------------------
:
:
: 두소스의 차이를 보면...
:
: EmbeddedWB나 TWebBroswer의 ControlInterface 는 IWebBrowser2 인데
: TCppWebBrowser 의 ControlInterface 는 IWebBrowser2 가 아닌 IWebBrowser2 Disp 이네요
:
: COM에 대해서 잘 몰라서..
:
: TCppWebBrowser 에서는 IWebBrowser2 를 어떻게 가져오죠?