我用VC做了个界面,有菜单項背景设置,在背景设置下有子菜单自然风景、云中峭壁,在资源视图中也导入了两张图片,下面怎么做实现点击自然风景菜单出现一背景图片,再点击云中峭壁又换成另一张背景图片

解决方案 »

  1.   

    这样讲吧,你的project是基于SDI or dialog或者其他的哦.如果是sdi那就在定义一个成员变量保存你要保存的图像了,再ondraw中画,只需在需要的时候切换全局变量中得值就可以了。dialog则在onpaint中完成了. 
      

  2.   

    BOOL CMyView::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    CDC   MemDC;   
           BITMAP   bm;   
           CBitmap   Bitmap;   
           Bitmap.LoadBitmap(IDB_BITMAP1);   
           Bitmap.GetObject(sizeof(BITMAP),&bm);   
           MemDC.CreateCompatibleDC(pDC);   
           MemDC.SelectObject(&Bitmap);   
           pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,   
           0,0,SRCCOPY);   
           return   TRUE;
    return CView::OnEraseBkgnd(pDC);}
    我在OnEraseBkgnd中加入上面代码出现窗口的背景图片了,我就是想点击实现点击自然风景菜单出现一背景图片,再点击云中峭壁又换成另一张背景图片
      

  3.   

    你说的应该是SDI吧 重写OnPaint();
    先在View里设置一个变量,单击菜单项时设置变量的值;比如自然风景对应1,云中峭壁设为2...
    void CCleanControlView::OnPaint()
    {
    CBitmap bmp; 
    switch(m_nPic)//m_nPic为对应变量
    {
    case 0:
    bmp.LoadBitmap(IDB_BITMAP1);
    break;
    case 1:
                 bmp.LoadBitmap(IDB_BITMAP6);
    break;
    case 2:
    bmp.LoadBitmap(IDB_BITMAP2);
    break;
    case 3:
                 bmp.LoadBitmap(IDB_BITMAP3);
    break;
    case 4:
                 bmp.LoadBitmap(IDB_BITMAP4);
    break;
    case 5:
                 bmp.LoadBitmap(IDB_BITMAP5);
    break;
    default:
    bmp.LoadBitmap(IDB_BITMAP1);
    } CPaintDC dc(this);
    CDC memDC; 
            memDC.CreateCompatibleDC(&dc);//创建内存DC 
            CBitmap *pOldbmp = memDC.SelectObject(&bmp); //将位图加载到内存DC 
             CRect rc; 
             GetClientRect(rc);//获取客户区大小 
              dc.BitBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY}
    }
    另外 单击菜单项的函数里,设置m_nPic后用Invalidate(true)刷新一下即可
      

  4.   

    楼上的方法可行 不过有几个问题
    1.不能用OnPaint画背景,否则画出来的背景会覆盖住其他控件,只能放在OnEraseBkgnd里画
    2.GDI对象没有释放,在函数结束时应该调用CBitmap对象的DeleteObject、CDC对象的DeleteDC。否则画的次数多了可能造成系统资源不足
      

  5.   

      xxrlily //赞一个
     
      

  6.   

    13楼的朋友,你说我想实现它,下面的代码怎么改?
    BOOL CMyView::OnEraseBkgnd(CDC* pDC) 

    // TODO: Add your message handler code here and/or call default 
    CDC  MemDC;  
          BITMAP  bm;  
          CBitmap  Bitmap;  
          Bitmap.LoadBitmap(IDB_BITMAP1);  
          Bitmap.GetObject(sizeof(BITMAP),&bm);  
          MemDC.CreateCompatibleDC(pDC);  
          MemDC.SelectObject(&Bitmap);  
          pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,  
          0,0,SRCCOPY);  
          return  TRUE; 
    return CView::OnEraseBkgnd(pDC);} 
      

  7.   

    OnMenuitem()函数里设置 OnMenuitem1()
    {
    m_nPic=1;
    Invalidate(true);
    }