Witam,
Chcę zapisać zrzut ekranu do BMP. Znalazłem do tego celu taką funkcję:
void screen(HWND okno, char* plik)
{
HDC _dc = GetWindowDC(okno);
RECT re;
GetWindowRect(okno,&re);
int w = re.right, h = re.bottom;
HDC dc = CreateCompatibleDC(0);
HBITMAP bm = CreateCompatibleBitmap(_dc,w,h);
SelectObject(dc,bm);
StretchBlt(dc,0,0,w,h,_dc,0,0,w,h,SRCCOPY);
void* f = CreateFile(plik,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,0);
void* buf = new char[w*h*4];
GetObject(bm,84,buf);
HDC ddd = GetDC(0);
HDC dc2 = CreateCompatibleDC(ddd);
tagBITMAPINFO bi;
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biWidth = w;
bi.bmiHeader.biHeight = h;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biCompression = 0;
bi.bmiHeader.biSizeImage = 0;
CreateDIBSection(dc,&bi,DIB_RGB_COLORS,&buf,0,0);
GetDIBits(dc,bm,0,h,buf,&bi,DIB_RGB_COLORS);
BITMAPFILEHEADER bif;
bif.bfType = MAKEWORD('B','M');
bif.bfSize = w*h*4+54;
bif.bfOffBits = 54;
BITMAPINFOHEADER bii;
bii.biSize = 40;
bii.biWidth = w;
bii.biHeight = h;
bii.biPlanes = 1;
bii.biBitCount = 32;
bii.biCompression = 0;
bii.biSizeImage = w*h*4;
DWORD r;
WriteFile(f,&bif,sizeof(bif),&r,NULL);
WriteFile(f,&bii,sizeof(bii),&r,NULL);
WriteFile(f,buf,w*h*4,&r,NULL);
CloseHandle(f);
}
Jednak mimo że funkcja zapisuje do pliku dobrze, i z pomocą podglądu Windows mogę ten plik odczytać, to jednak nie mogę wczytać tego pliku za pomocą LoadImage(). Ma ktoś inną funkcję, która dobrze działa, albo może wie ktoś gdzie w tej funkcji jest błąd?
PS. Dodam, że kiedy wczytuję za pomocą LoadImage plik zrobiony w Paincie, to wszystko jest ok, więc nie jest to wina złego użycia LoadImage().