c++在hdc中显示不出bmp位图

c++在hdc中显示不出bmp位图,第1张

一、你的代码需要重点简虚老查核的地方:

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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12241810.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存