位图资源总是加载不上去是什么原因?

shiter
人工智能领域优质创作者
博客专家认证
2015-05-01 01:31:07
BOOL CdddView::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CBitmap bit;
bit.LoadBitmap(IDB_BITMAP1);
BITMAP bm;
bit.GetBitmap(&bm);
CDC memDc;
memDc.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = memDc.SelectObject(&bit);
CRect rect;
GetClientRect(&rect);
pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真
pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),
&memDc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
memDc.SelectObject(pOldBitmap);
memDc.DeleteDC(); //删除DC
//bm.DeleteObject(); //删除位图
return TRUE;
}
...全文
497 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
shiter 2015-05-03
  • 打赏
  • 举报
回复
引用 12 楼 gordon3000 的回复:
[quote=引用 10 楼 wangyaninglm 的回复:] [quote=引用 9 楼 jason_wentzel 的回复:] 那是你图片文件本身有问题?
是啊 ,这个位图文件明明可以用windows自动的图片查看器打开的,但是添加到vs2010中的时候说不能打开,昨天晚上也没在意,今天早上换了一个图片果然好了。。。[/quote] 位图文件开始是一个BITMAPFILEHEADE,随后是一个BITMAPINFOHEADER,在这个BITMAPINFOHEADER里面有一个成员biSizeImage,这个成员有时设置,有时为0。比较完善的位图程序应该检查下这值,如果是0,就计算一下位图数据的大小把这个值添上。能够察看的位图不能打开大多是这个问题(但也并不都是)。 你可以比较下两个位图文件。[/quote] 收益匪浅
worldy 2015-05-01
  • 打赏
  • 举报
回复
使用CreateDibSection估计应该就可以
shiter 2015-05-01
  • 打赏
  • 举报
回复
引用 9 楼 jason_wentzel 的回复:
那是你图片文件本身有问题?
是啊 ,这个位图文件明明可以用windows自动的图片查看器打开的,但是添加到vs2010中的时候说不能打开,昨天晚上也没在意,今天早上换了一个图片果然好了。。。
孤客天涯 2015-05-01
  • 打赏
  • 举报
回复
那是你图片文件本身有问题?
shiter 2015-05-01
  • 打赏
  • 举报
回复
引用 7 楼 worldy 的回复:
[quote=引用 2 楼 wangyaninglm 的回复:]
CString string= "E:\Pic\BACKGROUND.bmp "; //犯了低级错误了,\==>\\
HBITMAP hbitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),string, 
IMAGE_BITMAP,1024,768, LR_CREATEDIBSECTION|LR_LOADFROMFILE); 
//VERY IMPORTANT:NOT CALL THE SUPER CLASS FUNCTION 
CPaintDC dc(this); 
if(hbitmap==NULL) 
return FALSE; 
CBitmap bitmap; 
bitmap.Attach(hbitmap); 
BITMAP bmp; 
bitmap.GetBitmap(&bmp); 

CDC cdc; 
cdc.CreateCompatibleDC(pDC); 
cdc.SelectObject(&bitmap); 
pDC-> BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&cdc,0,0,SRCCOPY); 
return TRUE; 
上面这中也不行。。。。
/[/quote]
BOOL CdddView::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	
	CString string("b.bmp"); 
	HBITMAP hbitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),string, 
		IMAGE_BITMAP,1024,768, LR_CREATEDIBSECTION|LR_LOADFROMFILE); 
	//VERY IMPORTANT:NOT CALL THE SUPER CLASS FUNCTION 
	CPaintDC dc(this); 
	if(hbitmap==NULL) 
		return FALSE; 
	CBitmap bitmap; 
	bitmap.Attach(hbitmap); 
	BITMAP bmp; 
	bitmap.GetBitmap(&bmp); 
	CDC memDc;

	memDc.CreateCompatibleDC(pDC);
	CBitmap* pOldBitmap = memDc.SelectObject(&bitmap);
	CRect rect;
	GetClientRect(&rect);
	pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真
	pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),
		&memDc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
	memDc.SelectObject(pOldBitmap);
	memDc.DeleteDC();                                      //删除DC
	return TRUE; 
}
换了个图片又可以了,真是不明白。。。。。。
worldy 2015-05-01
  • 打赏
  • 举报
回复
引用 2 楼 wangyaninglm 的回复:
CString string= "E:\Pic\BACKGROUND.bmp "; //犯了低级错误了,\==>\\
HBITMAP hbitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),string, 
IMAGE_BITMAP,1024,768, LR_CREATEDIBSECTION|LR_LOADFROMFILE); 
//VERY IMPORTANT:NOT CALL THE SUPER CLASS FUNCTION 
CPaintDC dc(this); 
if(hbitmap==NULL) 
return FALSE; 
CBitmap bitmap; 
bitmap.Attach(hbitmap); 
BITMAP bmp; 
bitmap.GetBitmap(&bmp); 

CDC cdc; 
cdc.CreateCompatibleDC(pDC); 
cdc.SelectObject(&bitmap); 
pDC-> BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&cdc,0,0,SRCCOPY); 
return TRUE; 
上面这中也不行。。。。
/
worldy 2015-05-01
  • 打赏
  • 举报
回复
引用 楼主 wangyaninglm 的回复:
BOOL CdddView::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CBitmap bit;
	bit.LoadBitmap(IDB_BITMAP1);
	BITMAP bm;
	bit.GetBitmap(&bm);
	CDC memDc;
	memDc.CreateCompatibleDC(pDC);
	CBitmap* pOldBitmap = memDc.SelectObject(&bit);
	CRect rect;
	GetClientRect(&rect);
	pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真
	pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),
		&memDc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
	memDc.SelectObject(pOldBitmap);
	memDc.DeleteDC();                                      //删除DC
	//bm.DeleteObject();                                       //删除位图
	return TRUE;
}
这段代码没有问题,实测也证实没问题 估计是lz的位图格式有问题?检查bit.LoadBitmap(IDB_BITMAP1);极其CBitmap* pOldBitmap = memDc.SelectObject(&bit);的返回值,看是否返回失败
副组长 2015-05-01
  • 打赏
  • 举报
回复
引用 10 楼 wangyaninglm 的回复:
[quote=引用 9 楼 jason_wentzel 的回复:] 那是你图片文件本身有问题?
是啊 ,这个位图文件明明可以用windows自动的图片查看器打开的,但是添加到vs2010中的时候说不能打开,昨天晚上也没在意,今天早上换了一个图片果然好了。。。[/quote] 位图文件开始是一个BITMAPFILEHEADE,随后是一个BITMAPINFOHEADER,在这个BITMAPINFOHEADER里面有一个成员biSizeImage,这个成员有时设置,有时为0。比较完善的位图程序应该检查下这值,如果是0,就计算一下位图数据的大小把这个值添上。能够察看的位图不能打开大多是这个问题(但也并不都是)。 你可以比较下两个位图文件。
孤客天涯 2015-05-01
  • 打赏
  • 举报
回复
引用 2 楼 wangyaninglm 的回复:
CString string= "E:\Pic\BACKGROUND.bmp "; 
HBITMAP hbitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),string, 
IMAGE_BITMAP,1024,768, LR_CREATEDIBSECTION|LR_LOADFROMFILE); 
//VERY IMPORTANT:NOT CALL THE SUPER CLASS FUNCTION 
CPaintDC dc(this); 
if(hbitmap==NULL) 
return FALSE; 
CBitmap bitmap; 
bitmap.Attach(hbitmap); 
BITMAP bmp; 
bitmap.GetBitmap(&bmp); 

CDC cdc; 
cdc.CreateCompatibleDC(pDC); 
cdc.SelectObject(&bitmap); 
pDC-> BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&cdc,0,0,SRCCOPY); 
return TRUE; 
上面这中也不行。。。。
CString string= "E:\Pic\BACKGROUND.bmp "; 改成CString string= "E:\\Pic\\BACKGROUND.bmp ";
wyx100 2015-05-01
  • 打赏
  • 举报
回复
空间大小分配够吗?
shiter 2015-05-01
  • 打赏
  • 举报
回复
完后就到这里了:
shiter 2015-05-01
  • 打赏
  • 举报
回复
CString string= "E:\Pic\BACKGROUND.bmp "; 
HBITMAP hbitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),string, 
IMAGE_BITMAP,1024,768, LR_CREATEDIBSECTION|LR_LOADFROMFILE); 
//VERY IMPORTANT:NOT CALL THE SUPER CLASS FUNCTION 
CPaintDC dc(this); 
if(hbitmap==NULL) 
return FALSE; 
CBitmap bitmap; 
bitmap.Attach(hbitmap); 
BITMAP bmp; 
bitmap.GetBitmap(&bmp); 

CDC cdc; 
cdc.CreateCompatibleDC(pDC); 
cdc.SelectObject(&bitmap); 
pDC-> BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&cdc,0,0,SRCCOPY); 
return TRUE; 
上面这中也不行。。。。
shiter 2015-05-01
  • 打赏
  • 举报
回复
相关推荐
发帖
界面

1.5w+

社区成员

VC/MFC 界面
社区管理员
  • 界面
加入社区
帖子事件
创建了帖子
2015-05-01 01:31
社区公告
暂无公告