我用一下方法显示图片CString temStr;
temStr.Format("Header/%s",info.strHeaderPath);
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,temStr.GetBuffer(0),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CBitmap *temBitmap=CBitmap::FromHandle(hBitmap);
if (temBitmap)
{
CDC dcPic;
dcPic.CreateCompatibleDC(pDc);
dcPic.SelectObject(temBitmap);
pDc->BitBlt(2,1,32,32,&dcPic,0,0,SRCCOPY);
temBitmap->DeleteObject();
dcPic.DeleteDC();
temBitmap = NULL;
}所有的方便都调用成功,图片路径也是对的
但有时候显示的不是原来的图片,而是一个类似于下拉框的东西,不知道为什么??????????
temStr.Format("Header/%s",info.strHeaderPath);
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,temStr.GetBuffer(0),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CBitmap *temBitmap=CBitmap::FromHandle(hBitmap);
if (temBitmap)
{
CDC dcPic;
dcPic.CreateCompatibleDC(pDc);
dcPic.SelectObject(temBitmap);
pDc->BitBlt(2,1,32,32,&dcPic,0,0,SRCCOPY);
temBitmap->DeleteObject();
dcPic.DeleteDC();
temBitmap = NULL;
}所有的方便都调用成功,图片路径也是对的
但有时候显示的不是原来的图片,而是一个类似于下拉框的东西,不知道为什么??????????
这样一刷新界面,刚才绘图就清除掉了。
会不会是对话框就有个下拉框呢?
看下路径是不是每次都一样的?
你图片的大小是2,1,32,32吗?
temStr.Format("Header/%s",info.strHeaderPath);
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,temStr.GetBuffer(0),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CBitmap *temBitmap=CBitmap::FromHandle(hBitmap);
if (temBitmap)
{
CDC dcPic;
dcPic.CreateCompatibleDC(pDc);
dcPic.SelectObject(temBitmap);
pDc->BitBlt(2,1,32,32,&dcPic,0,0,SRCCOPY);
temBitmap->DeleteObject();
dcPic.DeleteDC();
temBitmap = NULL;
}有完整点的吗?在哪绘制的,怎么调用的。
正常的图能帖一个上来吗?
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
CRect reClient;
GetClientRect(&reClient); CDC dbDc;
CBitmap dbBitmap;
dbDc.CreateCompatibleDC(&dc);
dbBitmap.CreateCompatibleBitmap(&dc,reClient.Width(),reClient.Height());
dbDc.SelectObject(&dbBitmap);
dbDc.FillSolidRect(0,0,reClient.Width(),reClient.Height(),0xFFFFFF); CString strName;
strName.Format("ROOMSHOWBK/%u.bmp",201);
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,strName.GetBuffer(0),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CBitmap *temBitmap=CBitmap::FromHandle(hBitmap);
if (temBitmap)
{
BITMAP bitmapInfo;
temBitmap->GetBitmap(&bitmapInfo);
CDC dcPic;
dcPic.CreateCompatibleDC(&dc);
dcPic.SelectObject(temBitmap);
//拉伸显示
int ix = 0,iy = 0;
int iHeight = reClient.Height();
while(iHeight>0)
{
int iWidth = reClient.Width();
ix = 0;
while(iWidth>0)
{
dbDc.BitBlt(ix*bitmapInfo.bmWidth,iy*bitmapInfo.bmHeight,min(iWidth,bitmapInfo.bmWidth),
min(iHeight,bitmapInfo.bmHeight),&dcPic,0,0,SRCCOPY);
iWidth = iWidth-bitmapInfo.bmWidth;
ix++;
}
iHeight = iHeight-bitmapInfo.bmHeight;
iy++;
} dcPic.DeleteDC();
temBitmap->DeleteObject();
}
dc.BitBlt(0,0,reClient.Width(),reClient.Height(),&dbDc,0,0,SRCCOPY);
dbBitmap.DeleteObject();
dbDc.DeleteDC();
}
其次,你的代码有问题,在多次调用的时候,估计会出现显示不对,颜色不对等GDI资源混乱的问题!
if (temBitmap)
{
CDC dcPic;
dcPic.CreateCompatibleDC(pDc);
dcPic.SelectObject(temBitmap);
pDc->BitBlt(2,1,32,32,&dcPic,0,0,SRCCOPY);
temBitmap->DeleteObject();
dcPic.DeleteDC();
temBitmap = NULL;
}
这里面,这样是不行的,这样改:
if (temBitmap)
{
CDC dcPic;
dcPic.CreateCompatibleDC(pDc);
CBitmap *oldbmp = dcPic.SelectObject(temBitmap);
pDc->BitBlt(2,1,32,32,&dcPic,0,0,SRCCOPY);
dcPic.SelectObject(oldbmp);//取消关联后才能删除
temBitmap->DeleteObject();//如果不取消关联,删除实际上是失败的,这样的后果,GDI资源没有释放!
dcPic.DeleteDC();
temBitmap = NULL;
}
dbDc.SelectObject(&dbBitmap);也一样将以前的设备状态保存以备恢复!记住一点,GDI资源使用后不仅仅要释放,还要恢复!