> Понял
> отправляю полную ссылку
> http://www.sources.ru/cpp/bitmap/window_to_file.shtml
>
> Владимир
Ясненько. Бегло взглянул - сперли они откуда то все это...
Как то странно - есть статейка, но из кода - всего одна функция.
> Здравствуйте !
>
> К сожалению, приаттаченные документы и HTML в письме
> в рассылку не проходят - сервис Subscribe отрезает все
> по самые помидоры. Поэтому лучше пришлите ссылочку
> на страницу на sources.ru, где лежит код.
> Так вернее будет.
>
> Vic.
>
> P.S. Кстати, судя по прототипу функции и ее названию назначение
> весьма очевидно. Можно даже попробовать ее самому набросать.
Не ручаюсь, что все будет работать абсолютно корректно,
но у меня работает. Вот попытался воссоздать недостающее
(когда то писал подобное) :
HANDLE DDBToDIB(CBitmap &bitmap, DWORD dwCompression, CPalette* pPal)
{
HDC hDC;
BITMAP bm;
DWORD dwLen;
HANDLE hDIB;
HANDLE handle;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
if(bitmap.GetSafeHandle() == NULL)
return NULL;
if(dwCompression == BI_BITFIELDS)
{
// для BI_BITFIELDS поддержки нет.
// уу, правда, можно легко добавить.
TRACE("BI_BITFIELDS not supported :-(\n");
return NULL;
}
HPALETTE hPalette = (HPALETTE) pPal->GetSafeHandle();
if(hPalette == NULL)
hPalette = (HPALETTE) ::GetStockObject(DEFAULT_PALETTE);
bitmap.GetObject(sizeof(bm), (LPSTR) &bm);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = (unsigned short) (bm.bmPlanes * bm.bmBitsPixel) ;
bi.biCompression = dwCompression;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
int nColors = 0;
if(bi.biBitCount <= 8)
nColors = (1 << bi.biBitCount);
dwLen = bi.biSize + nColors * sizeof(RGBQUAD);
hDC = ::GetDC(NULL);
hPalette = SelectPalette(hDC, hPalette, FALSE);
RealizePalette(hDC);
hDIB = GlobalAlloc(GMEM_FIXED, dwLen);
if(!hDIB)
{
SelectPalette(hDC, hPalette, FALSE);
::ReleaseDC(NULL, hDC);
return NULL;
}
lpbi = (LPBITMAPINFOHEADER) GlobalLock(hDIB);
*lpbi = bi;
GetDIBits(hDC, (HBITMAP) bitmap.GetSafeHandle(), 0L, (DWORD) bi.biHeight,
(LPBYTE) NULL, (LPBITMAPINFO) lpbi, (DWORD) DIB_RGB_COLORS);
bi = *lpbi;
if (bi.biSizeImage == 0)
{
bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)
* bi.biHeight;
if (dwCompression != BI_RGB)
bi.biSizeImage = (bi.biSizeImage * 3) / 2;
}
dwLen += bi.biSizeImage;
handle = GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE) ;
if (handle != NULL)
hDIB = handle;
else
{
GlobalFree(hDIB);
SelectPalette(hDC, hPalette, FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
lpbi = (LPBITMAPINFOHEADER)hDIB;
BOOL bSuccess = GetDIBits(hDC, (HBITMAP) bitmap.GetSafeHandle(),
0L,
(DWORD) bi.biHeight,
(LPBYTE)lpbi + (bi.biSize + nColors * sizeof(RGBQUAD)),
(LPBITMAPINFO) lpbi,
(DWORD) DIB_RGB_COLORS);
if(!bSuccess)
{
GlobalFree(hDIB);
SelectPalette(hDC, hPalette, FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
SelectPalette(hDC, hPalette, FALSE);
::ReleaseDC(NULL,hDC);
return hDIB;
}
WriteDIB(LPCTSTR lpszFileName, HANDLE hDib)
{
if(!hDib)
return FALSE ;
CFile file;
if(!file.Open(lpszFileName, CFile::modeWrite | CFile::modeCreate))
return FALSE ;
LPBITMAPINFOHEADER lpBmpheader = (LPBITMAPINFOHEADER)hDib ;
int ncolors = 1 << lpBmpheader->biBitCount ;
BITMAPFILEHEADER fileheader;
fileheader.bfType = ((WORD) ('M' << 8) | 'B');
fileheader.bfSize = GlobalSize (hDib) + sizeof(fileheader);
fileheader.bfReserved1 = 0 ;
fileheader.bfReserved2 = 0 ;
fileheader.bfOffBits = (DWORD) (sizeof(fileheader) + lpBmpheader->biSize +
ncolors * sizeof(RGBQUAD)) ;
file.Write(&fileheader, sizeof(fileheader)) ;
file.Write(lpBmpheader, GlobalSize(hDib)) ;
return TRUE ;
}
Функция DDBToDIB не пропускает dwCompression = BI_BITFIELDS - там надо еще
под 3 RGBQUAD выделять память, кажется и еще что то.
В принципе, полезные весьма функции.
Vic.
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru