Screenshot
-
Ich hab den code abändern müssen so das ihn der borland builder schnallt.
HDC hdc, hdc2; int width, height; char *filename="desk.bmp"; hdc=GetDC(NULL); HBITMAP aBmp; BITMAPINFO bi; HGDIOBJ OldObj; void *dibvalues; HANDLE fileHandle; BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; DWORD bytes_write; DWORD bytes_written; hdc2=CreateCompatibleDC(hdc); ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER)); bmih.biSize=sizeof(BITMAPINFOHEADER); bmih.biHeight=height; bmih.biWidth=width; bmih.biPlanes=1; bmih.biBitCount=24; bmih.biCompression=BI_RGB; bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight; bmih.biXPelsPerMeter = 0; bmih.biYPelsPerMeter = 0; bmih.biClrImportant = 0; //bmih.biSizeImage=(3*bmih.biHeight*bmih.biWidth); //bmih.biSizeImage = 0; bi.bmiHeader=bmih; aBmp=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&dibvalues,NULL,NULL); if (aBmp==NULL) { OutputDebugString("CreateDIBSection failed!\n"); } OldObj=SelectObject(hdc2,aBmp); BitBlt(hdc2,0,0,width,height,hdc,0,0,SRCCOPY); ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER)); bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); bmfh.bfSize=(3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); bmfh.bfType=0x4d42; bmfh.bfReserved1 = 0; bmfh.bfReserved2 = 0; fileHandle=CreateFile(filename,GENERIC_READ | GENERIC_WRITE,(DWORD)0,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL); if (fileHandle==INVALID_HANDLE_VALUE) { OutputDebugString("CreateFile failed!\n"); } // Write the BITMAPFILEHEADER bytes_write=sizeof(BITMAPFILEHEADER); if (!WriteFile(fileHandle,(void*)&bmfh,bytes_write,&bytes_written,NULL)) { OutputDebugString("WriteFile failed!\n"); } //Write the BITMAPINFOHEADER bytes_write=sizeof(BITMAPINFOHEADER); if (!WriteFile(fileHandle,(void*)&bmih,bytes_write,&bytes_written,NULL)) { OutputDebugString("WriteFile failed!\n"); } //Write the Color Index Array??? bytes_write=bmih.biSizeImage;//3*bmih.biHeight*bmih.biWidth; if (!WriteFile(fileHandle,(void*)dibvalues,bytes_write,&bytes_written,NULL)) { OutputDebugString("WriteFile failed!\n"); } CloseHandle(fileHandle); DeleteObject(SelectObject(hdc2,OldObj)); DeleteDC(hdc2);
[ Dieser Beitrag wurde am 21.06.2003 um 22:54 Uhr von Gen.d.Pz.Tr.Seb editiert. ]
edit: Codetags berichtigt.
-
a) Du solltest nicht die Funktion auseinanderreißen, sondern so lassen, wie sie ist und sie aus deinem Programm heraus aufrufen!
int width, height; // werden nicht initialisiert, können also alle möglichen Werte beinhalten! // daher: bmih.biHeight=height; bmih.biWidth=width; /* Höhe und Breite des Bitmaps sind ?!? 0? -1000? Man weiß es nicht... Deshalb solltest Du Breite und Höhe in deinem Programm festlegen und dann der Funktion bei Aufruf übergeben, nämlich so: */ int dc2bitmap(hdc, width, height, filename);
-
ich werds morgen versuchen bin mir aber sicher das ich morgen wieder hier lande.
-
Soo... das mit dem Screenshot wäre geschafft.
Danke an alle. (vor allen an hepi)
[ Dieser Beitrag wurde am 22.06.2003 um 13:07 Uhr von Gen.d.Pz.Tr.Seb editiert. ]
-
Ich versuche auch gerade ein Screenshotprogramm zu machen und da kommt bei
hdc = GetDC(NULL);
immer der folgende Fehler
error C2660: 'GetDC' : Funktion akzeptiert keine 1 Parameter
Fehler beim Ausführen von cl.exe.Kann mir bitte wer helfen.
Benny
PS.: Ich bin noch ziemlich ein Newbie
-
Hast Du evtl. selber ne Funktion geschrieben mit demselben Namen ?
-
Nein ganz sicher nicht aber vielleicht liegts ja daran das ich MSVC++ 6.0 habe.
Benny
-
Seltsam! Was hast du denn außer windows.h noch eingebunden?
-
::GetDC(NULL)
-
wahrscheinlich verwendet er MFC oder sowas
-
Ich hab auch gerade n ähnliches Problem ... das mit dem Std. Screenshot war ja kein Thema, aber wie bekommt man die Fenster mit WS_EX_LAYERED mit ins Bild?
Danke
M.T.
-
Hö?
-
Wenn man mit GetDC(NULL) das Bild holt, sind alle Fenster mit WS_EX_LAYERED und Transparenz unsichtbar ...
M.T.