用MFC显示两张位图 一张作为背景,另一张放在背景上,如坐标系上放一个空心的园,求高手解答mfc 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 内存DC CreateCompatibleDC 我是MFC小白,可能问题没说清楚,就是我现在画两幅位图,一幅是坐标系,一幅是圆形,现在我想把这两幅位图同时显示出来,表示出圆形在坐标系下的情况,该怎么办,求各位大大详解 类似于这样的case(WM_PAINT):{ PAINTSTRUCT ps; CDC *pDC = BeginPaint(&ps); //客户区大小 CRect rcClient; GetClientRect(rcClient); int nWidth = rcClient.Width(); int nHeight = rcClient.Height(); CDC memDC; memDC.CreateCompatibleDC(pDC); //兼容DC CBitmap bitMap; bitMap.LoadBitmap(IDB_BKIMAGE); //背景图片 CBitmap *pOldbmp = memDC.SelectObject(&bitMap); //位图选人内存DC BITMAP bmpInfo; bitMap.GetBitmap(&bmpInfo); //获取背景图片信息 pDC->SetStretchBltMode(HALFTONE);//半色调 pDC->StretchBlt(0, 0, nWidth, nHeight, //目标尺寸 &memDC, //源DC 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, //源尺寸 SRCCOPY); //贴背景图/缩放到客户区 //绘前景图片 bitMap.DeleteObject(); bitMap.LoadBitmap(IDB_BITMAP1); bitMap.GetBitmap(&bmpInfo); pDC->BitBlt(100, 100, bmpInfo.bmWidth, bmpInfo.bmHeight, &memDC, 0, 0, SRCCOPY); //结束清理工作 memDC.SelectObject(pOldbmp); //恢复位图句柄 memDC.DeleteDC(); //删除内存DC bitMap.DeleteObject(); //内存位图 EndPaint(&ps); return 0;} 我结合您给的代码自己写了一下,麻烦你帮我看下问题出那了,工程是一个MFC应用程序,在CTestView::OnDraw中填了这样一段代码: CBitmap bitmap; bitmap.LoadBitmapA(IDB_BITMAP1); CDC MemDC; CDC* pDC=GetDC(); MemDC.CreateCompatibleDC(NULL); MemDC.SelectObject(&bitmap); CClientDC ClientDC(this); BITMAP BM; bitmap.GetObject(sizeof(BM),&BM); pDC->SetStretchBltMode(HALFTONE);//半色调 ClientDC.BitBlt ( 0,0, //目标设备逻辑横、纵坐标 BM.bmWidth, BM.bmHeight, //显示位图的像素宽、高度 &MemDC, //待显示位图数据的设备情境对象 0,0, //源数据中的横、纵坐标 SRCCOPY); //位操作方式 //背景画完了 //画第二幅图 bitmap.DeleteObject(); bitmap.LoadBitmap(IDB_EXPLORER_24); bitmap.GetBitmap(&BM); ClientDC.BitBlt(100, 100, BM.bmWidth, BM.bmHeight,&MemDC, 0,0,SRCCOPY); ReleaseDC(pDC);现在问题是结果显示为第二幅位图不显示,只有第一幅位图,麻烦能帮我看看我错那了吗?谢谢了 onDraw 中已经有 CDC 指针可以直接使用的 CBitmap bitmap; bitmap.LoadBitmapA(IDB_BITMAP1); CDC MemDC; MemDC.CreateCompatibleDC(NULL); MemDC.SelectObject(&bitmap); BITMAP BM; bitmap.GetObject(sizeof(BM),&BM); pDC->SetStretchBltMode(HALFTONE);//半色调 pDC->BitBlt ( 0,0, //目标设备逻辑横、纵坐标 BM.bmWidth, BM.bmHeight, //显示位图的像素宽、高度 &MemDC, //待显示位图数据的设备情境对象 0,0, //源数据中的横、纵坐标 SRCCOPY); //位操作方式 //背景画完了 //画第二幅图 bitmap.DeleteObject(); bitmap.LoadBitmap(IDB_EXPLORER_24); bitmap.GetBitmap(&BM); pDC->BitBlt(100, 100, BM.bmWidth, BM.bmHeight,&MemDC, 0,0,SRCCOPY); 补充, 上面的资源没有释放,有泄流你就用我5楼的回复 从BeginPaint后到EndPaint前段代码段就可以 你好,我今天又看了一下代码应该再看了一下,你的源代码中在显示前景的时候还应该通过MemDC.SelectObject(&bitmap);这句话将新加载的图像传到DC中去。这样基本实现功能。不过还是要谢谢你帮忙。现在有没有让前景图片透明函数,可以达到前景和背景颜色一致,而只留下黑色正方形。也就是让片白色变成绿色。 呵呵,我这两天干这个活有点上火了,感觉啥方法快就用啥,MFC我也是现学现用,用双缓冲思路我会以后慢慢学习,谢谢大家关心。 呵呵,我这两天干这个活有点上火了,感觉啥方法快就用啥,MFC我也是现学现用,用双缓冲思路我会以后慢慢学习,谢谢大家关心。 回复于: 2013-01-28 17:46:38 内存DC CreateCompatibleDC MFC 用GDI+画 初始化 Gdiplus::Graphics phics(m_gdiBitmap); Gdiplus::Image image(CStringW("D:\\2010_Projects\\imitate\\imitate\\res\\base.jpg")); phics.DrawImage(&image,0,0,1000,10000);onpaint()Gdiplus::Graphics myPhics(dc.m_hdc); myPhics.DrawImage(m_gdiBitmap,Gdiplus::RectF(0,0,Gdiplus::REAL(rect.Width()),Gdiplus::REAL(rect.Height())), m_validRect.X,m_validRect.Y,m_validRect.Width,m_validRect.Height,Gdiplus::UnitPixel);GDI+不支持双缓冲,可以自己用两张画布,替换着画 mini2440的wince应用程序开发 SQL语句优化 [请教]为什么MFC中调用API函数获取EditText控件内容失败 全局结构体的定义和使用 关于滑动条 初学者问题-急 关于拷贝构造函数和运算符重载——为什么视而不见? 关于capCreateCaptureWindow help me !!!! VC++的三维空间中的动点 用MFC显示两张位图 下面图中x+1、y+1//是什么意思?
CreateCompatibleDC
{
PAINTSTRUCT ps;
CDC *pDC = BeginPaint(&ps); //客户区大小
CRect rcClient;
GetClientRect(rcClient);
int nWidth = rcClient.Width();
int nHeight = rcClient.Height(); CDC memDC; memDC.CreateCompatibleDC(pDC); //兼容DC
CBitmap bitMap; bitMap.LoadBitmap(IDB_BKIMAGE); //背景图片
CBitmap *pOldbmp = memDC.SelectObject(&bitMap); //位图选人内存DC
BITMAP bmpInfo; bitMap.GetBitmap(&bmpInfo); //获取背景图片信息 pDC->SetStretchBltMode(HALFTONE);//半色调
pDC->StretchBlt(0, 0, nWidth, nHeight, //目标尺寸
&memDC, //源DC
0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, //源尺寸
SRCCOPY); //贴背景图/缩放到客户区 //绘前景图片
bitMap.DeleteObject();
bitMap.LoadBitmap(IDB_BITMAP1);
bitMap.GetBitmap(&bmpInfo);
pDC->BitBlt(100, 100, bmpInfo.bmWidth, bmpInfo.bmHeight,
&memDC,
0, 0,
SRCCOPY); //结束清理工作
memDC.SelectObject(pOldbmp); //恢复位图句柄
memDC.DeleteDC(); //删除内存DC
bitMap.DeleteObject(); //内存位图 EndPaint(&ps); return 0;
}
中填了这样一段代码:
CBitmap bitmap;
bitmap.LoadBitmapA(IDB_BITMAP1);
CDC MemDC;
CDC* pDC=GetDC();
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(&bitmap);
CClientDC ClientDC(this);
BITMAP BM;
bitmap.GetObject(sizeof(BM),&BM);
pDC->SetStretchBltMode(HALFTONE);//半色调
ClientDC.BitBlt
( 0,0, //目标设备逻辑横、纵坐标
BM.bmWidth, BM.bmHeight, //显示位图的像素宽、高度
&MemDC, //待显示位图数据的设备情境对象
0,0, //源数据中的横、纵坐标
SRCCOPY); //位操作方式
//背景画完了
//画第二幅图
bitmap.DeleteObject();
bitmap.LoadBitmap(IDB_EXPLORER_24);
bitmap.GetBitmap(&BM);
ClientDC.BitBlt(100, 100, BM.bmWidth, BM.bmHeight,&MemDC, 0,0,SRCCOPY);
ReleaseDC(pDC);
现在问题是结果显示为第二幅位图不显示,只有第一幅位图,麻烦能帮我看看我错那了吗?谢谢了
bitmap.LoadBitmapA(IDB_BITMAP1);
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(&bitmap);
BITMAP BM;
bitmap.GetObject(sizeof(BM),&BM);
pDC->SetStretchBltMode(HALFTONE);//半色调
pDC->BitBlt
( 0,0, //目标设备逻辑横、纵坐标
BM.bmWidth, BM.bmHeight, //显示位图的像素宽、高度
&MemDC, //待显示位图数据的设备情境对象
0,0, //源数据中的横、纵坐标
SRCCOPY); //位操作方式
//背景画完了
//画第二幅图
bitmap.DeleteObject();
bitmap.LoadBitmap(IDB_EXPLORER_24);
bitmap.GetBitmap(&BM);
pDC->BitBlt(100, 100, BM.bmWidth, BM.bmHeight,&MemDC, 0,0,SRCCOPY);
你就用我5楼的回复 从BeginPaint后到EndPaint前段代码段就可以
现在有没有让前景图片透明函数,可以达到前景和背景颜色一致,而只留下黑色正方形。也就是让片白色变成绿色。
呵呵,我这两天干这个活有点上火了,感觉啥方法快就用啥,MFC我也是现学现用,用双缓冲思路我会以后慢慢学习,谢谢大家关心。
内存DC
CreateCompatibleDC
初始化
Gdiplus::Graphics phics(m_gdiBitmap);
Gdiplus::Image image(CStringW("D:\\2010_Projects\\imitate\\imitate\\res\\base.jpg"));
phics.DrawImage(&image,0,0,1000,10000);
onpaint()
Gdiplus::Graphics myPhics(dc.m_hdc);
myPhics.DrawImage(m_gdiBitmap,Gdiplus::RectF(0,0,Gdiplus::REAL(rect.Width()),Gdiplus::REAL(rect.Height())),
m_validRect.X,m_validRect.Y,m_validRect.Width,m_validRect.Height,Gdiplus::UnitPixel);
GDI+不支持双缓冲,可以自己用两张画布,替换着画