去www.vchelp.net下载一个专门处理位图的类,忘了叫什么了,
它可以保存的,
它可以保存的,
解决方案 »
- Tr0j4n接分
- 关于LISTBOX
- 请帮忙看一下,在嵌套显示子窗口时控件为什么显示会出现不完整性
- 清华大学计算机系全部教程(视频版)谁要???
- @ @ @ @ ### WinXP SP2 环境下安装VC6 总是出错!!!,求助^-^ !! ###@ @ @ @
- 问个很菜的问题,rar和zip扩展名的英文全称是什么,有谁知道吗?
- 在一个大循环中如何按esc键退出循环。
- 各位高手清帮忙。为什么我在Dialog里加入Richedit后,dialog就显示不了了??
- 请解释COM中 apartment (套间)的含义
- 我的win2000server在域中,被以域中Administrator进入,结果我的机子以域用户进入后,机子的系统关机选项变为不可用,以域中Administrato
- 请问如何动态改变子窗口的图标
- ◆◆◆高手勿进,典型的菜鸟问题,int转换成byte,马上揭帖
CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC)这两个函数绝对没有问题,我一直在用它。
你先调用CreateBitmapInfoStruct()函数,再调用CreateBMPFile()即可,试试看吧,若需要我可以给你例子源码,祝你好运!
PBITMAPINFO CreateBitmapInfoStruct(HWND hwnd, HBITMAP hBmp)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits; // Retrieve the bitmap's color format, width, and height.
// GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp);
if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp))
AfxMessageBox("GetObject"); // Convert the color format to a count of bits.
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
if (cClrBits == 1)
cClrBits = 1;
else if (cClrBits <= 4)
cClrBits = 4;
else if (cClrBits <= 8)
cClrBits = 8;
else if (cClrBits <= 16)
cClrBits = 16;
else if (cClrBits <= 24)
cClrBits = 24;
else
cClrBits = 32; // Allocate memory for the BITMAPINFO structure. (This structure
// contains a BITMAPINFOHEADER structure and an array of RGBQUAD
// data structures.) if (cClrBits != 24)
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * (1<< cClrBits)); // There is no RGBQUAD array for the 24-bit-per-pixel format. else
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER)); // Initialize the fields in the BITMAPINFO structure. pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
if (cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1<<cClrBits); // If the bitmap is not compressed, set the BI_RGB flag.
pbmi->bmiHeader.biCompression = BI_RGB; // Compute the number of bytes in the array of color
// indices and store the result in biSizeImage.
// For Windows NT/2000, the width must be DWORD aligned unless
// the bitmap is RLE compressed. This example shows this.
// For Windows 95/98, the width must be WORD aligned unless the
// bitmap is RLE compressed.
pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8
* pbmi->bmiHeader.biHeight;
// Set biClrImportant to 0, indicating that all of the
// device colors are important.
pbmi->bmiHeader.biClrImportant = 0;
return pbmi;
}
/*
The following example code defines a function that initializes the remaining structures, retrieves the array of palette indices, opens the file, copies the data, and closes the file.
*/
void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi,
HBITMAP hBMP, HDC hDC)
{
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
PBITMAPINFOHEADER pbih; // bitmap info-header
LPBYTE lpBits; // memory pointer
DWORD dwTotal; // total count of bytes
DWORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
DWORD dwTmp; pbih = (PBITMAPINFOHEADER) pbi;
lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage); if (!lpBits)
AfxMessageBox("GlobalAlloc"); // Retrieve the color table (RGBQUAD array) and the bits
// (array of palette indices) from the DIB.
// GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi,
// DIB_RGB_COLORS);
if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi,
DIB_RGB_COLORS))
{
AfxMessageBox("GetDIBits");
} // Create the .BMP file.
hf = CreateFile(pszFile,
GENERIC_READ | GENERIC_WRITE,
(DWORD) 0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
if (hf == INVALID_HANDLE_VALUE)
AfxMessageBox("CreateFile");
hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
// Compute the size of the entire file.
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0; // Compute the offset to the array of color indices.
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof (RGBQUAD); // Copy the BITMAPFILEHEADER into the .BMP file.
//WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
// (LPDWORD) &dwTmp, NULL);
if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
(LPDWORD) &dwTmp, NULL))
{
AfxMessageBox("WriteFile");
} // Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
//WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
// + pbih->biClrUsed * sizeof (RGBQUAD),
// (LPDWORD) &dwTmp, ( NULL));
if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
+ pbih->biClrUsed * sizeof (RGBQUAD),
(LPDWORD) &dwTmp, ( NULL)) )
AfxMessageBox("WriteFile");
// Copy the array of color indices into the .BMP file.
dwTotal = cb = pbih->biSizeImage;
hp = lpBits;
// WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL);
if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
AfxMessageBox("WriteFile"); // Close the .BMP file.
// CloseHandle(hf);
if (!CloseHandle(hf))
AfxMessageBox("CloseHandle"); // Free memory.
GlobalFree((HGLOBAL)lpBits);
}