| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > запись содержимого окна в файл |
| Автор: rrrFer 10.5.2009, 15:36 | ||
пишу примерно вот так:
получаю обьекты на экране и пустой .bmp файл. Подскажите почему вывода в файл не происходит? Смотрел файл в winHex: 424D46270000000000003600000028000000320000003200000001002000000000001027000000000000000000000000 остальное нули, т.е. создается файл , правильно формируется его заголовок, но пустой... Гуглил и нашел примеры, которые дали такой же результат. На всякий случай прилагаю пример проекта(проблема в Lab.cpp) . |
| Автор: rrrFer 10.5.2009, 20:27 | ||
ошибка похоже тут:
после выполнения этого Buf остается пустым |
| Автор: mekhanikus 11.5.2009, 11:42 | ||
Может сначала надо сделать CompatibleDC, потом CompatibleBitmap, потом связать их SelectObject, затем скопировать обьекты с экрана в битмап, а потом уже сохранять битмап. |
| Автор: GremlinProg 11.5.2009, 11:52 |
| только что же обсуждали GetDIBits: http://forum.vingrad.ru/forum/topic-257353/hl/getdibits/index.html |
| Автор: rrrFer 11.5.2009, 12:14 |
| GremlinProg, непомогла мне та тема |
| Автор: rrrFer 11.5.2009, 12:32 | ||
mekhanikus,
делаю так: hdc = BeginPaint(hWnd, &ps); BITM=CreateCompatibleBitmap(hdc, Width, Heigth); т.е. есть холт и битмап вывожу обьекты на холст: for ( int i=0; i<Obts.size(); i++ ) Obts[i]->Draw(hdc, Xo*2, Yo*2); а потом копирую с холтса на битмап: StoreBitmapFile(_T("1.bmp"),BITM); т.е. вот копирую содержимое: DataSize = ((BM.bmWidth*BitCount+31) & ~31)/8*BM.bmHeight; Buf = (LPBYTE)GlobalAlloc(GMEM_FIXED, DataSize); DC = GetDC(0); GetDIBits(DC, HBM, 0,(WORD)BM.bmHeight, Buf, BIP, DIB_RGB_COLORS); ReleaseDC(0, DC); и вот тут созраняю содержимое: WriteFile(FP,&BFH,sizeof(BITMAPFILEHEADER),&dwTemp,NULL); WriteFile(FP,BIP,sizeof(BITMAPINFOHEADER) + BIP->bmiHeader.biClrUsed * sizeof(RGBQUAD),&dwTemp,NULL); WriteFile(FP,Buf,DataSize,&dwTemp,NULL); только Buf оказывается пустым после: DC = GetDC(0); GetDIBits(DC, HBM, 0,(WORD)BM.bmHeight, Buf, BIP, DIB_RGB_COLORS); ReleaseDC(0, DC); |
| Автор: GremlinProg 11.5.2009, 13:14 | ||
выравнивание необходимо для каждой строки:
+ GetDIBits возвращает число строк, скопированных с битмапа если она возвращает ноль, то GetLastError дает код ошибки если не ноль, значит GetDIBits все делает правильно, т.е. ошибка в другом месте |
| Автор: rrrFer 11.5.2009, 14:38 |
| GremlinProg, с выравниваем вроде бы все нормально +GetDIBits возвращает не ноль, а где как вы думаете, еще может быть ошибка? |
| Автор: GremlinProg 11.5.2009, 14:47 |
думаю, еще до StoreBitmapFile, при формаровании битмапа (если он черный, значит нули и должны быть) попробуй выводить его дополнительно в окне |
| Автор: rrrFer 15.5.2009, 04:42 |
| спасибо всем, решил проблему. |