首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

用MFC展示两张位图

2013-02-17 
用MFC显示两张位图一张作为背景,另一张放在背景上,如坐标系上放一个空心的园,求高手解答mfc[解决办法]内存

用MFC显示两张位图
一张作为背景,另一张放在背景上,如坐标系上放一个空心的园,求高手解答 mfc
[解决办法]
内存DC 
CreateCompatibleDC
[解决办法]
类似于这样的


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 用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+不支持双缓冲,可以自己用两张画布,替换着画

热点排行