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 |