一张作为背景,另一张放在背景上,如坐标系上放一个空心的园,求高手解答mfc

解决方案 »

  1.   

    内存DC 
    CreateCompatibleDC
      

  2.   

    我是MFC小白,可能问题没说清楚,就是我现在画两幅位图,一幅是坐标系,一幅是圆形,现在我想把这两幅位图同时显示出来,表示出圆形在坐标系下的情况,该怎么办,求各位大大详解
      

  3.   

    类似于这样的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;
    }
      

  4.   

    我结合您给的代码自己写了一下,麻烦你帮我看下问题出那了,工程是一个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);
    现在问题是结果显示为第二幅位图不显示,只有第一幅位图,麻烦能帮我看看我错那了吗?谢谢了
      

  5.   

    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);
      

  6.   

    补充, 上面的资源没有释放,有泄流
    你就用我5楼的回复 从BeginPaint后到EndPaint前段代码段就可以
      

  7.   

    你好,我今天又看了一下代码应该再看了一下,你的源代码中在显示前景的时候还应该通过MemDC.SelectObject(&bitmap);这句话将新加载的图像传到DC中去。这样基本实现功能。不过还是要谢谢你帮忙。
    现在有没有让前景图片透明函数,可以达到前景和背景颜色一致,而只留下黑色正方形。也就是让片白色变成绿色。
      

  8.   


    呵呵,我这两天干这个活有点上火了,感觉啥方法快就用啥,MFC我也是现学现用,用双缓冲思路我会以后慢慢学习,谢谢大家关心。
      

  9.   

    呵呵,我这两天干这个活有点上火了,感觉啥方法快就用啥,MFC我也是现学现用,用双缓冲思路我会以后慢慢学习,谢谢大家关心。 
      

  10.   

    回复于: 2013-01-28 17:46:38 
    内存DC 
    CreateCompatibleDC 
      

  11.   

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