Mam mały problem z robieniem zrzutów ekranu. Zrzut zapisywany jest jako bitmapa i problem się pojawia kiedy zrzut robiony jest na rozdzielczości 1366x768. Bitmapa zapisuje się wtedy niepoprawnie i windows widzi ją jako plik uszkodzony.
HDC _dc = GetWindowDC(okno);
Szer_Wys(); //ustawia szerokosc i wysokosc aktywnego ekranu
dc = CreateCompatibleDC( 0 );
bm = CreateCompatibleBitmap( _dc, w, h );
SelectObject( dc, bm );
StretchBlt( dc, 0, 0, w, h, _dc, 0, 0, w, h, SRCCOPY );
GetObject( bm, 84, buf );
ddd = GetDC( 0 );
dc2 = CreateCompatibleDC( ddd );
tagBITMAPINFO bit_info; //tworzy obiekt na strukture
bit_info.bmiHeader.biSize = sizeof( bit_info.bmiHeader ); //Rozmiar struktury bmiHeader (40 )
bit_info.bmiHeader.biWidth = w; //Szerokość bitmapy w pikselac
bit_info.bmiHeader.biHeight = h; //wysokosc bitmapy w pikselac
bit_info.bmiHeader.biPlanes = 1;
bit_info.bmiHeader.biBitCount = 24; //Liczba bitów kodujących piksel (RGB)
bit_info.bmiHeader.biCompression = 0; //0 - brak wewnętrznej kompresji
bit_info.bmiHeader.biSizeImage = 0;
h_createDIB = CreateDIBSection( dc, & bit_info, DIB_RGB_COLORS, & buf, 0, 0 );
GetDIBits( dc, bm, 0, h, buf, & bit_info, DIB_RGB_COLORS );
BITMAPFILEHEADER bit_header;
bit_header.bfType = MAKEWORD( 'B', 'M' ); //typ pliku
bit_header.bfSize = w * h * 3 + 54; //w * h * 3 kolory + nagłówek
bit_header.bfOffBits = 54;
BITMAPINFOHEADER bit_info_header;
bit_info_header.biSize = 40;
bit_info_header.biWidth = w;
bit_info_header.biHeight = h;
bit_info_header.biPlanes = 0;
bit_info_header.biBitCount = 24;
bit_info_header.biCompression = 0;
bit_info_header.biSizeImage = w * h * 3;
sciezka = obiekt.PobierzPathSCREEN() + obiekt.PobierzNazwe() + ".bmp";
ofstream plik(sciezka, ios::binary);
if(plik.good())
{
plik.write(reinterpret_cast<char*>(&bit_header), sizeof(bit_header));
plik.write(reinterpret_cast<char*>(&bit_info_header), sizeof(bit_info_header));
plik.write(reinterpret_cast<char*>(buf), w*h*3 );
}else cout<<"Blad pliku";
plik.close();