Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Dokumentenvorschau Sdi

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.07.2003, 07:09 Uhr
Andyk



Hi,

was muss ich machen wenn ich den Inhalt eines SDI Fensters (im konkreten fall Internet Explorer) als so eine Art Screenshot in eine HBITMAP schieben will?
Vielen Dank.
--
CU,
ANDYK
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.07.2003, 17:13 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Andy,
das Problem für mich ist nicht das Bitmap zu ziehen, sondern der IE selbst. Was passiert wenn mehrere Instanzen des IE aktiv sind. Welche Bitmap von welcher Instanz soll dann erzeugt werden?
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.07.2003, 01:17 Uhr
Andyk



Hi Uwe,

hmmmm...dann entscheidet ein Mausklick darüber welcher Clientbereich in ein bitmap umgewandelt wird.
--
CU,
ANDYK
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.07.2003, 07:57 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Andy,
na gut, das mit dem Mausklick obliegt Dir das zu implementieren. Da will ich jetzt nicht darüber nachdenken (hab bald Urlaub ). Hab den nachfolgenden Code in einer SDI-Anwendung getestet.

C++:
void CSBView::OnSaveBitmap()
{
    CFileDialog fdlg(FALSE,"BMP","*.BMP",OFN_OVERWRITEPROMPT);
    BITMAPINFO bmi;
    BITMAPFILEHEADER bfh;
    HBITMAP hbm = NULL;
    HBITMAP ohbm;
    HDC hdc = NULL;
    HDC mhdc = NULL;
    BYTE *imagedata;
    int width, height;
    CRect rect;    
    HWND hWndIE, hWndShell, hWnd;
    if(fdlg.DoModal() != IDOK)
        throw 0;
    if(!(hdc = ::GetDC(0)))
        throw 0;
    /*  Auszug MSDN:
        Whenever IE 4 shows an HTML page, it creates a container window
        that covers the entire client area. The window class name is Shell
        DocObject View. It has a child window called
        Internet Explorer_Server which is identical in size. This window
        represents the surface where MSHTML (the IE4 module providing the
        Dynamic HTML functionality) draws its output. In short,
        Internet Explorer_Server windows are the real HTML view objects.
    */

    /*    demzufolge kann das Handle (in dem Fall, ohne das IHTML - Interface) nur
        über den Container gefunden werden. Bei einer zweiten Instanz des IE,
        sehen wir hier alt aus. */


    hWndIE = ::FindWindow("IEFrame",NULL);
    if(hWndIE)
        hWndShell = ::FindWindowEx(hWndIE,NULL,"Shell DocObject View",NULL);
    if (hWndShell)
        hWnd= ::FindWindowEx(hWndShell,NULL,"Internet Explorer_Server",NULL);
    if(hWnd){
        /* in den Fordergrund holen und etwas Zeit geben */
        ::BringWindowToTop(hWndIE);
        Sleep(400);
        /* Jetzt das gültige Rechteck ermittel */
        ::GetWindowRect(hWnd,&rect);
        width = rect.Width();
        height = rect.Height();
        /* vorbereiten der Bitmapstruktur */
        bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        bmi.bmiHeader.biWidth = width;
        bmi.bmiHeader.biHeight = height;
        bmi.bmiHeader.biPlanes = 1;
        bmi.bmiHeader.biBitCount = 24;
        bmi.bmiHeader.biCompression = BI_RGB;
        bmi.bmiHeader.biSizeImage = (((width * 24 + 31) & ~31) >> 3) * height;
        bmi.bmiHeader.biXPelsPerMeter = 0;
        bmi.bmiHeader.biYPelsPerMeter = 0;
        bmi.bmiHeader.biClrImportant = 0;
        bmi.bmiHeader.biClrUsed = 0;
        /* der Rest ist Routine */
        if(!(hbm = ::CreateDIBSection(hdc,&bmi,DIB_RGB_COLORS,(void**)&imagedata,0,0)))
            throw 0;
        if(!(mhdc = ::CreateCompatibleDC(hdc)))
            throw 0;
        ohbm = (HBITMAP)::SelectObject(mhdc,hbm);
        if(!::BitBlt(mhdc,0,0,width,height,hdc,rect.left,rect.top,SRCCOPY))
            throw 0;
        ::SelectObject(mhdc,ohbm);
        DeleteDC(mhdc);
        mhdc = NULL;
        /* jetzt noch das Bild schreiben */
        ZeroMemory(&bfh,sizeof(BITMAPFILEHEADER));
        bfh.bfType = *(WORD*)"BM";
        bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bmi.bmiHeader.biSizeImage;
        bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
        CFile fbmp(fdlg.GetPathName(), CFile::modeCreate|CFile::modeWrite);
        fbmp.Write(&bfh,sizeof(BITMAPFILEHEADER));
        fbmp.Write(&bmi,sizeof(BITMAPINFOHEADER));
        fbmp.Write(imagedata,bmi.bmiHeader.biSizeImage);
        /* aufräumen und raus */
        if(mhdc) DeleteDC(mhdc);
        if(hbm)
            DeleteObject(hbm);
        if(hdc)
            ::ReleaseDC(0,hdc);
    }
}


Das Problem ist, daß der IE eine geballte Ansammlung von ActiveX-Steuerelementen darstellt. Mit dessen Interfaces - Klassen brauchte ich mich noch nicht zubeschäftigen. Bin aber sicher das es dort auch Möglichkeiten eines Zugriffes gibt.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.07.2003, 12:53 Uhr
Andyk



WOW. Vielen dank Uwe!!!
Ich mach mich gleich dran.
--
CU,
ANDYK
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.09.2003, 01:45 Uhr
Andyk



@Uwe
Hí Uwe,

jetzt wo ich ein bisschen luft habe, ist mir eingefallen, das ich dir noch kein feedback gegeben habe.
Also:
Deine Funktion hat prächtig funktioniert.
Das Problem mit dem Clientbereich bei mehren zur Auswahl stehenden Fenstern, habe ich jetzt über einen Custombutton in der Standardschaltflächenleiste, der mein Screenshot Prog. aufruft, gelöst.
Nochmal many thanx.
--
CU,
ANDYK
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: