Webbrowser mit ATL



  • Hallo ich versuche gerade in mein Programm einen Webbrowser mittels ATL einzubauen. Der Webbrowser wir auf einem Dialogfeld angezeigt.

    Doch leider wird das Dialogfeld garnicht angezeigt.

    Wenn ich das "pWeb->Navigate2(&url, &blabla, &blabla, &blabla, &blabla);" weglasse erscheint die Dialogbox zwar aber sie ist nur grau.

    Code

    #include <windows.h>
    #include <atlbase.h> 
    #include <mshtml.h> 
    #include <exdisp.h> 
    #include "resource.h" 
    
    IWebBrowser2 *pWeb; 
    IAxWinHostWindow* container; 
    HWND aaa;
    HINSTANCE hInstance1;
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    int CALLBACK MainDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam);
    
    const char szAppName[]    = "Webbrowser";
    
    int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance,
                         PSTR szCmdLine, int iCmdShow)
    {
    hInstance1 = hInstance;
    .....
    Fenster registrieren usw
    .....
    int CALLBACK MainDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam) { 
       CComVariant url, blabla; 
    
        switch(wMsg) { 
    
        case WM_INITDIALOG: 
    		{
            CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER, IID_IWebBrowser2, (LPVOID*) &pWeb); 
            AtlAxAttachControl(pWeb, hDlg,(IUnknown**)&container); 
    
    		url = "www.web.de"; 
    
    		ShowWindow(aaa,SW_SHOW); 
            pWeb->Navigate2(&url, &blabla, &blabla, &blabla, &blabla);
            return 0;
    		}
    
        case WM_CLOSE: 
            pWeb->Release(); 
            PostQuitMessage(0); 
            return 0; 
            break; 
        } 
    
    return 0; 
    }
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
       switch (message)
       {
       case WM_CREATE:
    	   {
    		   aaa=CreateDialog(hInstance1, MAKEINTRESOURCE(IDD_DIALOG1), 0, MainDlgProc);
    		   ShowWindow(aaa,SW_SHOW); 
    		   return 0;
    	   }
       case WM_DESTROY:
          {
    
             PostQuitMessage(0);
             return 0;
          }
       }
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    Wenn ich aber nur eine Dialogbox ohne ein Windowsfenster erstelle, dann geht es:

    Code:

    #include <windows.h> 
    #include <atlbase.h> 
    #include <mshtml.h> 
    #include <exdisp.h> 
    #include "resource.h" 
    
    HWND hWnd; 
    IWebBrowser2 *pWeb; 
    IAxWinHostWindow* container; 
    
    int CALLBACK MainDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam); 
    
    //======================================================== 
    // WinMain() 
    // Program Entry Point 
    //======================================================== 
    int APIENTRY WinMain(HINSTANCE hInstance, 
                         HINSTANCE hPrevInstance, 
                         LPSTR     lpCmdLine, 
                         int       nCmdShow ) { 
        MSG msg; 
    
        CoInitialize(0); 
        hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, MainDlgProc); 
        ShowWindow(hWnd,SW_SHOW); 
    
        while(GetMessage(&msg,0,0,0)) { 
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        } 
        CoUninitialize(); 
    
        return 0; 
    } 
    
    //======================================================== 
    // MainDlgProc() 
    // CALLBACK function von funky main dialog 
    //======================================================== 
    int CALLBACK MainDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam) { 
        CComVariant url, blabla; 
    
        switch(wMsg) { 
    
        case WM_INITDIALOG: 
    
            CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER, IID_IWebBrowser2, (LPVOID*) &pWeb); 
            AtlAxAttachControl(pWeb, hDlg,(IUnknown**)&container); 
    
            ShowWindow(hWnd,SW_SHOW); 
    
            url = "www.web.de"; 
            pWeb->Navigate2(&url, &blabla, &blabla, &blabla, &blabla); 
        break; 
    
        case WM_CLOSE: 
            pWeb->Release(); 
            PostQuitMessage(0); 
            return 0; 
            break; 
        } 
    
    return 0; 
    }
    

    Mit freundlichen Grüßen Tim



  • Hi,

    wenn Du ein ActiveX-Control verwendest, brauchst Du auch einen ActiveX-Container, ala: AtlAxWin. Dabei kannst Du dir ein paar Codezeilen sparen.



  • Vielen Dank

    Der Code sieht jetzt so aus:

    HINSTANCE hDLL = LoadLibrary(L"atl.dll"); 
         typedef HRESULT (WINAPI *PAttachControl)(IUnknown*, HWND,IUnknown**); 
         PAttachControl AtlAxAttachControl = (PAttachControl) GetProcAddress(hDLL, "AtlAxAttachControl"); 
         RECT rect; 
         GetClientRect(hWnd,&rect); 
         container=CreateWindowEx(WS_EX_CLIENTEDGE,L"EDIT",L"",WS_CHILD | WS_VISIBLE,0,0,rect.right,rect.bottom,hWnd,0,0,0); 
         CoInitialize(0); 
    
         CoCreateInstance(CLSID_WebBrowser,0,CLSCTX_ALL,IID_IWebBrowser2,(void**)&pIwb); 
         AtlAxAttachControl(pIwb,container,0); 
         pIwb->GoHome(); 
    
         char cURL[]="www.google.de"; 
    WCHAR strBuffer[200]; 
    MultiByteToWideChar(CP_ACP, 0, cURL, -1, strBuffer, sizeof(strBuffer)); 
    
    pIwb->ClientToWindow(20, 130);
    pIwb->Navigate(strBuffer,0,0,0,0);
    

    Wie krieg ich es nun hin, den Webbrowser OHNE Scrollbars anzeigen zu lassen

    Mit freundlichen Grüßen
    Tim



  • Weiß denn keiner wie ich diese blöden Scrollbars wegkriege?

    Mit freundlichen Grüßen Tim



  • So direkt AFAIK nicht; da mußt du auf den Renderer zugreifen.

    http://c-plusplus.net/forum/viewtopic-var-p-is-1665652.html#1665652



  • Schon mal Danke für den Tipp.

    Aber leider werde ich aus dem ganzen nicht wirklich schlau zumal er die:
    #include <SysUtils.hpp>
    #include <Forms.hpp>
    #include <SHDocVw.hpp>
    #include <MSHTML.hpp>
    garnicht findet..

    kann mir vielleicht irgendjemand von denen die es können einen kleinen Beispielcode schreiben wie ich die Scrollbars wegkriege oder mir erklären wie ich SysUtilis usw. einbinden muss..



  • Da das ein Beispiel für den C++Builder ist, wird es sich bei dir natürlich nicht kompilieren lassen. Für dich sollte aber der Weg zum Deaktivieren der Scrollbars dennoch interessant sein; die Interfaces dürften ja auch bei MSVC nicht anders heißen.



  • Soweit ich das sehe meinst du das:

    _di_IHTMLElement elem = interface_cast <IHTMLDocument2> (webBrowser->Document)->body;
        // Disable scroll bars. 
        _di_IHTMLBodyElement bodyelem = elem; 
        if (bodyelem) 
            bodyelem->scroll = _T ("no");
    

    doch ich krieg es nicht hin dies in meinen Code einzubauen. Ich weiß ich stell mich warscheinlich in euren Augen ziemlich blöd an aber ich bin einfach noch nicht so lange in c++ und WinApi dabei.

    Mit freundlichen Grüßen und der Bitte um weitere Hilfe
    Tim



  • So ich hab jetzt diesen Code in mein Programm eingebaut, doch es geht immer noch nicht (er gibt keine Fehlermeldung aus aber die Scrollbars sind immer noch da)...

    #include <Mshtml.h>
    #include <atlbase.h>
    CComPtr<IDispatch>pdispDoc;
    pIwb->get_Document(&pdispDoc);
    
    CComQIPtr<IHTMLDocument2>piDoc(pdispDoc);
    CComPtr<IHTMLElement>piElem;
    CComPtr<IHTMLBodyElement>piBody;
    
    piDoc->get_body(&piElem); 
    
    piElem->QueryInterface(&piBody); 
    
    (piBody->put_scroll(CComBSTR(_T("no"))));
    

    MFG Tim



  • Win32 FAQ (1992)
    siehe in der fortgeschrittenen Gruppe win32
    news://nntp.aioe.org/comp.os.ms-windows.programmer.win32



  • Tut mir leid das ich noch einmal nachfragen muss, aber ich verstehe da noch nicht so ganz wo ich suchen soll. Wenn ich auf den Link klicke öffnet sich Outlook Express mit interessanten Themen aber ich habe nirgends etwas zur Scrollbar im Webbrowser gefunden.

    MFG Tim



  • Ok nun tut alles vielen Dank.


Log in to reply