一、你的代码需要重点简虚老查核的地方:
HDC hdc = GetDC(hwnd) //请查hwnd是是哪个东西的句柄,这个东西拦升在窗体上是否可见HDC mdc = CreateCompatibleDC(hdc)
//这一句 L"image/bg.bmp" 中的L可能要去除,不同的编译环境不同要求
HBITMAP hbg = (HBITMAP)LoadImage (NULL, L"image/bg.bmp", IMAGE_BITMAP, 480, 852, LR_LOADFROMFILE)
SelectObject(mdc, hbg)
BitBlt(hdc, 0, 0, 480, 852, mdc, 0, 0, SRCCOPY)
二、以下代码,在BDS 2006中的C++ Builder中通过,不必另加引用和库,供你对比参考,你的代码基本上没错,我改的地方作了标注:
//--------------------------------------------------------------//放上一个按钮控件,双击这个控件生成基本的函数,然后去添加你的代码
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//在窗体上先放一个Panel1控件,此处修改,让你取得Panel1控件的句柄,这样你就可以在Panel1上画图了
HDC hdc = GetDC(Panel1->Handle)
HDC mdc = CreateCompatibleDC(hdc)
//注意,我改向了D盘根目录下的bg.bmp文件,并自个用画图板乱画一个图,保存为D:\bg.bmp
//BDS 2006 C++Builder中提示"d:\\bg.bmp"前不要加“L”。
HBITMAP hbg =
(HBITMAP)LoadImage (NULL, "d:\\bg.bmp",
IMAGE_BITMAP, 誉歼480, 852, LR_LOADFROMFILE)
SelectObject(mdc, hbg)
BitBlt(hdc, 0, 0, 480, 852, mdc, 0, 0, SRCCOPY)
}
//---------------------------------------------------------------
三、学习编程的道路是很难的,因为书上,或别的的源代码是有具体的环境的,需要理解着来。当然,没有经验的朋友有时根本无法“理解着来”。祝你好运哦。
给你一御扰个函数吧,nWidth,nHeight是要保存的宽度和高伍州度,nX,nY是起始点坐标(镇橘旦相对于左上角)void GetDCBits(HDC hDC, LPVOID lpBits, int nWidth, int nHeight, int nX=0, int nY=0)
{
HDC hMemDC = CreateCompatibleDC(hDC)
HBITMAP hBmpNew = CreateCompatibleBitmap(hDC, nWidth, nHeight)
HBITMAP hBmpOld = (HBITMAP)SelectObject(hMemDC, hBmpNew)
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hDC, nX, nY, SRCCOPY)
LONG lLineBytes = (nWidth*24+31)/32*4
LONG lBufferSize = lLineBytes*nHeight
BITMAPINFOHEADER bih
memset( &bih, 0, sizeof(bih) )
bih.biWidth = nWidth
bih.biHeight = nHeight
bih.biBitCount = 24
bih.biPlanes = 1
bih.biSize = sizeof(bih)
GetDIBits(hMemDC, hBmpNew, 0, nHeight, lpBits, (LPBITMAPINFO)&bih, DIB_RGB_COLORS)
SelectObject(hMemDC, hBmpOld)
DeleteObject(hBmpNew)
DeleteDC(hMemDC)
}
以下代码仅为参考/知好乎/获得rect指定的图片块,用完此函数返回的HBITMAP句柄后,要调用::DeleteObject()删除句柄
HBITMAP GetBitmap(RECT * rect)
{
HDC hScrDC,hMemDC //屏幕设备描述表 和 内存设备描述表
HBITMAP hBitmap,hOldBitmap//hBitmap位图句柄用来保存rect所对应的图片
hScrDC=GetDC(NULL)//创建屏幕设备描述表
hMemDC=CreateCompatibleDC(NULL) //创建内存设备描述表
int RectWidth=rect->right-rect->left//获得屏幕宽度
int RectHeight=rect->bottom-rect->top//获得屏幕高度
hBitmap=CreateCompatibleBitmap(hScrDC,RectWidth,RectHeight) //创建一个与屏幕设备描述表兼容的位图,用完记得调用::DeleteObject(hBitmap)
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap)//把位图选进内存设备描述表
BitBlt(hMemDC,0,0,RectWidth,RectHeight,hScrDC,rect->left,rect->top,SRCCOPY) //把rect指定的图块拷贝到内存设备描述表
hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap)//把图片放到hBitmap中
ReleaseDC(NULL,hScrDC)
DeleteDC(hMemDC)
return hBitmap
}
//保存位图
int SaveBitmap(HBITMAP hBitmap, LPSTR lpFileName)
{
//lpFileName 为位图文件名
HDC hDC
//设备描述搭悉表
int iBits
//当前显示分辨率下每个像素所占字节数
WORD wBitCount
//位图中每个像素所占字节数
/袜弊/定义调色板大小, 位图中像素字节大小 , 位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten
BITMAP Bitmap
//位图属性结构
BITMAPFILEHEADER bmfHdr
//位图文件头结构
BITMAPINFOHEADER bi
//位图信息头结构
LPBITMAPINFOHEADER lpbi
//指向位图信息头结构
HANDLE fh, hDib, hPal
HPALETTE hOldPal=NULL
//定义文件,分配内存句柄,调色板句柄
//计算位图文件每个像素所占字节数
iBits=24
if (iBits <= 1)
wBitCount = 1
else if (iBits <= 4)
wBitCount = 4
else if (iBits <= 8)
wBitCount = 8
else if (iBits <= 32)
wBitCount = 24
//计算调色板大小
if (wBitCount <= 8)
dwPaletteSize=(1<<wBitCount)*sizeof(RGBQUAD)
//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap)
bi.biSize = sizeof(BITMAPINFOHEADER)
bi.biWidth = Bitmap.bmWidth
bi.biHeight =Bitmap.bmHeight
bi.biPlanes = 1
bi.biBitCount = wBitCount
bi.biCompression = BI_RGB
bi.biSizeImage = 0
bi.biXPelsPerMeter = 0
bi.biYPelsPerMeter = 0
bi.biClrUsed = 0
bi.biClrImportant = 0
dwBmBitsSize = ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER))
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib)
*lpbi = bi
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE)
if (hPal)
{
hDC = GetDC(NULL)
hOldPal=SelectPalette(hDC,(HPALETTE)hPal,FALSE)
RealizePalette(hDC)
}
// 获取该调色板下新的像素值
GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize, (BITMAPINFO *)lpbi,DIB_RGB_COLORS)
//恢复调色板
if (hOldPal)
{
SelectPalette(hDC, hOldPal, TRUE)
RealizePalette(hDC)
ReleaseDC(NULL, hDC)
}
//创建位图文件
fh=CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL)
if (fh==INVALID_HANDLE_VALUE)
return FALSE
// 设置位图文件头
bmfHdr.bfType = 0x4D42// "BM"
dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize
bmfHdr.bfSize = dwDIBSize
bmfHdr.bfReserved1 = 0
bmfHdr.bfReserved2 = 0
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL)
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize,
&dwWritten, NULL)
//清除
GlobalUnlock(hDib)
GlobalFree(hDib)
CloseHandle(fh)
return TRUE
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)