Thema: Delphi [NonVCL] Browser

Einzelnen Beitrag anzeigen

NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#11

AW: [NonVCL] Browser

  Alt 28. Mai 2012, 14:38
Hallo zusammen,

Es ist lange her dieser Post, aber als ich mich heute nochmal daran gewagt habe, habe ich es hinbekommen so wie ich es wollte.

Hier die gesammter Projektcode
Delphi-Quellcode:
program nonVCL;

uses
  SysUtils,
  windows,
  messages,
  classes,
  ActiveX,
  Variants,
  SHDocVw_TLB; //Damit keine VCL großartig benutzt wird hab ich die Klassen nochmal extra erstellen lassen also ohne VCL.

const
  ClassName1 = 'Wnd1Class';
  Window1Name = 'Window 1';
  WindowWidth1 = 500;
  WindowHeight1 = 400;

var Browser : IWebBrowser2;
    FensterH : HWND;
    wnd: HWND;
    vEmpty : OleVariant;

function WndProc(hWnd1: HWND; uMsg: UINT; wParam: wParam; lParam: LParam):
  lresult; stdcall;
var
  x, y : integer;
  PaintStructut : TPaintStruct;
  CanvasH : HDC;
begin
  Result := 0;
  case uMsg of
    WM_CREATE:
      begin
        {Fenster zentrieren}
        x := GetSystemMetrics(SM_CXSCREEN);
        y := GetSystemMetrics(SM_CYSCREEN);
        MoveWindow(hWnd1, (x div 2) - (WindowWidth1 div 2),
          (y div 2) - (WindowHeight1 div 2),
          WindowWidth1, WindowHeight1, true);
      end;
    WM_DESTROY:
      begin
        if Browser <> nil then
        begin
          Browser.Quit;
        end;
        OleUninitialize();
        PostQuitMessage(0);
      end;
  else
    Result := DefWindowProc(hWnd1, uMsg, wParam, lParam);
  end;
end;

var
  wc: TWndClassEx = (
    cbSize : SizeOf(TWndClassEx);
    Style : CS_HREDRAW or CS_VREDRAW;
    lpfnWndProc : @WndProc; //Fensterfunktion für Fenster 1
    cbClsExtra : 0;
    cbWndExtra : 0;
    lpszMenuName : nil;
    lpszClassName : ClassName1; //Klassenname für Fenster 1
    hIconSm : 0;
  );
  msg: TMsg;
  hr : HRESULT;
begin
  {Struktur mit Infos für Fenster 1 füllen}
  wc.hInstance := hInstance;
  wc.hCursor := LoadCursor(0, IDC_ARROW);
  wc.hIcon := LoadIcon(HInstance,'MAINICON');
  wc.hbrBackground := GetSysColorBrush(COLOR_BTNFACE);
  {Fenster 1 registrieren}
  RegisterClassEx(wc);
  {Fenste 1 erzeugen und hWnd1 zuweisen}
  FensterH := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, WindowWidth1, WindowHeight1, 0, 0, hInstance,
    nil);

  if OleInitialize(nil) <> S_OK then
  begin
    CoCreateInstance(CLASS_InternetExplorer, nil, CLSCTX_LOCAL_SERVER,
                       IID_IWebBrowser2, Browser); //Browser initalisieren
    if Browser <> nil then
    begin
      VariantInit(vEmpty);
      Browser.Navigate('http://www.test.de/index.html', vEmpty, vEmpty, vEmpty, vEmpty); //Seite auswählen
      wnd := FindWindow('IEFrame', nil);
      wnd := FindWindowEx(wnd, 0, 'Frame Tab', nil);
      wnd := FindWindowEx(wnd, 0, 'TabWindowClass', nil);
      wnd := FindWindowEx(wnd, 0, 'Shell DocObject View', nil); //Ist das Fenster wo man einbinden kann
      SetParent(wnd,FensterH); //Parent auf Fenster setzen
      MoveWindow(wnd, 0, 0, WindowWidth1, WindowHeight1, true); //Größe des eingebetten Fensters anpassen
    end;
  end;

  while GetMessage(msg,0,0,0) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
  ExitCode := msg.wParam;
end.
Für meine Zwecke reicht dies soweit. Habs halt mal gepostet falls jemand das selbe vorhat.
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat