在视图中,它的背景是默认是白色的,我想把一幅图片作为它的背景,具体怎么去调用图片,
如果在CFormView中调用图片做为背景,会有什么不一样呢?
如果在以上以图片作为背景的视图中,再添加控件,可以吗,会不会有什么别的不良影响
请给出相关的代码或资料

解决方案 »

  1.   

    CBitmap m_MainBG.LoadBitmap(IDB_TABDLG_BG); //加载背景图片
    BOOL XXX::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    CDC dc;   
    dc.CreateCompatibleDC(pDC);   
    dc.SelectObject(&m_MainBG);   

    //获取BITMAP对象   
    BITMAP hb;   
    m_MainBG.GetBitmap(&hb);   

    //获取窗口大小   
    CRect rt;   
    GetWindowRect(&rt);   
    //显示位图   
    pDC->StretchBlt(0, 0, rt.Width(), rt.Height(),   
    &dc, 0, 0, hb.bmWidth, hb.bmHeight, SRCCOPY);   
    dc.DeleteDC(); 
    return CDialog::OnEraseBkgnd(pDC);
    }你加上按钮等控件可能要做一些控件透明处理
      

  2.   

    视图类中定义一个CBitmap成员变量,初始化时LoadBitmap,响应WM_ERASEBKGND消息贴图,参考LS代码。
      

  3.   

    以对话框为例,主要就是3步:
    1、OnInitDialog()加载背景图片
    2、OnEraseBkgnd(CDC* pDC) 显示背景图片
    3、OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)设置透明背景模式
    .h
    CBitmap m_BackGround;.CPP
    BOOL XXX::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    // 加载背景图片
    m_BackGround.LoadBitmap(IDB_BG_A); return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }BOOL XXX::OnEraseBkgnd(CDC* pDC) 
    {
    CDC dc;
    dc.CreateCompatibleDC(pDC);
    dc.SelectObject(&m_BackGround); //获取BITMAP对象
    BITMAP hb;
    m_BackGround.GetBitmap(&hb); //获取窗口大小
    CRect rt;
    GetClientRect(&rt); //显示背景图片
    pDC->StretchBlt(0, 0, rt.Width(), rt.Height(),
    &dc, 0, 0, hb.bmWidth, hb.bmHeight, SRCCOPY); return TRUE;
    }HBRUSH XXX::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Change any attributes of the DC here
    // 设置透明背景模式
    pDC->SetBkMode(TRANSPARENT);

    // TODO: Return a different brush if the default is not desired
    switch(nCtlColor)
    {
    // 设置背景刷子为空
    case CTLCOLOR_STATIC: // 静态控件
    case CTLCOLOR_DLG: // 对话框 
    return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
    default:
    return hbr;
    }
    }
    手工添加OnEraseBkgnd(CDC* pDC).h
    // Implementation
    protected: // Generated message map functions
    //{{AFX_MSG(CDlgEventBrowse)
    virtual BOOL OnInitDialog();
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP().cpp
    BEGIN_MESSAGE_MAP(CDlgEventBrowse, CDialog)
    //{{AFX_MSG_MAP(CDlgEventBrowse)
    ON_WM_ERASEBKGND()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
      

  4.   

    MFC只能调用BMP格式的图片吗  ?
    其他格式的图片不能显示!!!!!!!!! 
      

  5.   

    PNG格式的好像也可以,不过处理起来较复杂。
      

  6.   

    BOOL  ImageFromIDResource(UINT nID, LPCTSTR sTR/*=png*/,Image * &pImg)
    {
    HINSTANCE hInst = AfxGetResourceHandle();
    HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type
    if (!hRsrc)
    return FALSE; // load resource into memory
    DWORD len = SizeofResource(hInst, hRsrc);
    BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
    if (!lpRsrc)
    return FALSE; // Allocate global memory on which to create stream
    HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
    BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
    memcpy(pmem,lpRsrc,len);
    IStream* pstm;
    CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); // load from stream
    pImg=Gdiplus::Image::FromStream(pstm); // free/release stuff
    GlobalUnlock(m_hMem);
    pstm->Release();
    GlobalFree(m_hMem);
    FreeResource(lpRsrc); return TRUE;
    }
    把png格式的转化为image 格式,然后用GDI+画不知道可行否,没试过