CString str;
str="D:/新建文件夹/come.bmp";
CStatic *smallpic = new CStatic[3];//按图片对象数量创建控件数组

for(int i = 0;i<3;i++)//循环显示图片按照图片数|SS_CENTERIMAGE
{
     smallpic[i].Create(NULL,WS_EX_TRANSPARENT|WS_BORDER|WS_CHILD|WS_VISIBLE|SS_BITMAP|SS_NOTIFY , CRect(30+i*200,30,200+i*200,205),this);//控件ID自增与i的数量是一样的,因为每次都重新清空加载

HBITMAP hbitmap;
hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),str,
IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

CBitmap hbmp;
hbmp.Attach(hbitmap);
//获取图片内容
BITMAP bm;
hbmp.GetBitmap(&bm);
CDC dcMem;
//创建兼容DC
dcMem.CreateCompatibleDC(GetDC());
CBitmap *pOldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);

CRect lRect;
//获取Static控件的大小范围
smallpic[i].GetClientRect(&lRect);
//在Static控件上显示位图
smallpic[i].GetDC()->StretchBlt(1 ,70 ,lRect.Width(),lRect.Height(),
&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(&pOldBitmap);
hbmp.DeleteObject();
dcMem.DeleteDC();
}我试验了3个控件来显示图片,为什么只有最后一个图片控件显示了图片,前俩个把图片覆盖了,这是为什么?
我将图片显示的位置向下移动后就看到控件将我显示的图片覆盖在控件下面了,可是只有最后那个显示出来了。。
这个代码是完全的。。高手可以试一下

解决方案 »

  1.   

    显示了刷新,最好在ondraw或者onpaint上画
      

  2.   

    有些对象是不能放在循环中创建的。
    smallpic[i].GetClientRect(&lRect);
    lRect三次相同,当然前俩个把图片覆盖了!
      

  3.   

    BOOL CGraphicView::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    CBitmap bitmap;
    bitmap.LoadBitmap(IDB_BITMAP1); BITMAP bmp;
    bitmap.GetBitmap(&bmp); CDC dcCompatible;
    dcCompatible.CreateCompatibleDC(pDC); dcCompatible.SelectObject(&bitmap); CRect rect;
    GetClientRect(&rect);
    pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
    // pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,
    // 0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    return TRUE;
    return CView::OnEraseBkgnd(pDC);
    }
      

  4.   

    先在内存DC上绘图,再贴到窗口DC中.  CDC memDC;
      memDC.CreateCompatibleDC(pDC);
      CBitmap memBmp;
      memBmp.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height());
      CBitmap* pOldBmp=(CBitmap*)memDC.SelectObject(&memBmp);
      memDC.SetStretchBltMode(COLORONCOLOR);
      StretchDIBits(memDC.GetSafeHdc(),0,0,rcClient.Width(),rcClient.Height(),0,0,m_ImgWidth/2,m_ImgHeight,m_pFinalData,m_bmpInfo,0,SRCCOPY);
      pDC->BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memDC,0,0,SRCCOPY);
      memDC.SelectObject(pOldBmp);
      pOldBmp->DeleteObject();