作者:纸鸢漫天飞舞 | 来源:互联网 | 2023-05-17 15:16
我想先在内存中绘制我所想要的数据,然后获取已绘制好位图的HBITMAP,位图就可以使用m_picture.SetBitmap(m_hBitmap)在pictrue控件上显示出来.我的图片可能会比较大,
我想先在内存中绘制我所想要的数据,然后获取已绘制好位图的HBITMAP,位图就可以使用m_picture.SetBitmap(m_hBitmap)在pictrue控件上显示出来.我的图片可能会比较大,这样的话就不用处理滚动事件了。……
求助各位高手,这个问题困扰我一段时间了.
16 个解决方案
这是我项目中的一段代码, 你可以自己看一下是否有帮助:
//打印屏幕
//先打印几次桌面, 后再起线程 进行文件压缩处理
BOOL CScreenCap::CopyScreen(LPBITMAPINFOHEADER &lpbi)
{
try
{
HBITMAP hbitmap ;
HBITMAP hbitmapOld ;
int cxPixInch ;
int cyPixInch ;
//进行屏幕截取
HDC hdc ;
//hdc = GetDC(NULL) ;
HDC hdcMem ;
hdcMem = CreateCompatibleDC(NULL) ;
hdc = CreateDC("DISPLAY", NULL, NULL, NULL);
HDC CompatibleHDC = CreateCompatibleDC(hdc);
hbitmap = CreateCompatibleBitmap(hdc,GetDeviceCaps(hdc, HORZRES),GetDeviceCaps(hdc, VERTRES));
if ( NULL == hbitmap)
{
return FALSE ;
}
SelectObject(CompatibleHDC, hbitmap);
BitBlt(CompatibleHDC,0,0,GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES),hdc,0,0,SRCCOPY);
cxPixInch = GetDeviceCaps(hdc,LOGPIXELSX) ;
cyPixInch = GetDeviceCaps(hdc,LOGPIXELSY) ;
hbitmapOld = SelectBitmap(hdcMem, hbitmap);
SelectBitmap(hdcMem, hbitmapOld);
DWORD sizeimage ;
//把DDB 转换成 DIB
lpbi = (LPBITMAPINFOHEADER)GlobalLock(MakeDDBToDIB(hbitmap, BI_RGB, 0, &sizeimage));
ReleaseDC(NULL, hdc) ;
if ( !DeleteDC(hdc))
{
DWORD dw = ::GetLastError() ;
int i = 0 ;
}
hdc = NULL ;
ReleaseDC(NULL, hdcMem) ;
DeleteDC(hdcMem) ;
hdcMem = NULL ;
DeleteDC(CompatibleHDC) ;
CompatibleHDC = NULL ;
DeleteObject(hbitmap) ;
hbitmap = NULL ;
DeleteObject(hbitmapOld) ;
hbitmapOld = NULL ;
}
catch(...)
{
return FALSE ;
}
return TRUE ;
}
那就创建一个位图HBITMAP,然后选入内存DC绘图,然后选出,就可以用了。
CreateCompatibleDC、SelectObject
回五楼:我希望得到明确一点的答案,哪个给写出来,分都是他的……
读取位图:其中filename为文件的名字。
HBITMAP m_hBmpNew;
m_hBmpNew = (HBITMAP) LoadImage(AfxGetInstanceHandle(), // handle to instance
filename, // name or identifier of the image (say "C:\\bitmap.bmp")
IMAGE_BITMAP, // image types
0, // desired width
0, // desired height
LR_LOADFROMFILE);
创建兼容DC;
CDC m_dcMem;
CClientDC dc(this);
m_dcMem.CreateCompatibleDC( &dc );
选入内存。
m_hBmpOld = (HBITMAP)SelectObject(m_dcMem, m_hBmpNew );
之后从内存读出,显示:
CPaintDC dc(this);
dc.BitBlt(0,0,m_size.cx,m_size.cy, &m_dcMem, sourcex, sourcey,SRCCOPY);
dc.BitBlt(0,0,rect.Width(),rect.Height(),&m_dcMem,0,0,SRCCOPY);
回楼上……从硬盘中加载bitmap而获得HBITMAP我晓得 ,我就是不懂得怎么从内存中直接获得HBITMAP,期待楼下解决……
内存的HBITMAP也是要你自己创建的呀.你所指的内存HBITMAP是什么???
CreateCompatibleDC创建一个内存兼容dc
CreateCompatibleBitmap创建一个内存兼容bitmap
SelectObject把创建的bitmap选入dc,保存旧的bitmap(就是SelectObject的返回值)
把内存中要画的东西画到创建的dc上
画图完毕,用SelectObject把旧的bitmap选入dc,返回值就是你要的东西
我按照bobob的方法做了,是获得了HBITMAP 了,但是在滚动picture 控件的时候,出现了问题,那些被遮住的部分就会变成空白的。
按照bobob的方法 ,问题解决了,能够获得HBITMAP,但是问题又出现了,在内存中绘图总是设置不了颜色,绘制出来的颜色都是黑色的,哪个高手再指点一下哦……先谢谢bobob了
CreateCompatibleBitmap创建一个内存兼容bitmap
---------这里创建的兼容bitmap要设置颜色的位数,默认是黑白的。