读书人

命啊 SetBitmapBits GetBitmapBits有关

发布时间: 2012-04-03 12:38:19 作者: rapoo

大虾 求救命啊啊啊啊 SetBitmapBits GetBitmapBits问题
先贴代码 各位可以随便建个对话框工程拉个按钮就可以测试了

static HDC hScrDC, hMemDC;//屏幕和内存设备描述表
static HBITMAP hBitmap, hBitmap2;// 位图句柄



//为屏幕创建设备描述表
hScrDC = ::GetDC(NULL);
HDC htest = ::GetDC(this->m_hWnd);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);

// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap(hScrDC, 200, 200);
hBitmap2 = CreateCompatibleBitmap(hScrDC, 200, 200);
// 把位图选到内存设备描述表中
(HBITMAP)SelectObject(hMemDC, hBitmap);

// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, 200, 200, hScrDC, 200, 200, SRCCOPY);


char *buff = new char[40000];
int i = GetBitmapBits(hBitmap, 40000, (LPVOID)buff);


int i2 = ::SetBitmapBits(hBitmap2, 40000, buff);

// 把新位图选到内存设备描述表中
(HBITMAP)SelectObject(hMemDC, hBitmap2);

if (0 == ::StretchBlt(htest,0,0,200,200,hMemDC,40,40,200,200,SRCCOPY))
{
this->MessageBox("Set BIT eroor");
}

DeleteDC(hScrDC);
DeleteDC(hMemDC);

问题:
// 把新位图选到内存设备描述表中
(HBITMAP)SelectObject(hMemDC, hBitmap2);
我原本是想吧内存的位图复制到新位图上再重新选入设备描述表 可是程序只显示一点点 其他的都是全黑。。。怎么回事啊 求解释

[解决办法]
你的代码大体上没问题,错误出在GetBitmapBits,你只申请了40 000数据,远远不够。仅图形数据部分就200x200x4(32位色),还要再加上一些头数据。另外这个函数是兼容16位Windows用的,现在最好用GetDIBits/SetDIBits,参见http://blog.csdn.net/iamshuke/article/details/5749948,http://blog.csdn.net/iamshuke/article/details/5749933

读书人网 >VC/MFC

热点推荐