这个问题困扰我很久,但是一直都没有很好的解决办法。
这个问题有几个难点:1)这个图像是JPG图像
                   2)该图像作为对话框的背景。
                   3)代码为了不影响速度,必须加在到对话框的初始化中。(如果谁
                      有更好的办法最好)
                   4)我还要的这个背景上加很多控件,这些控件要可以显示出来。
                     (我现在的一个办法虽然可以实现以上功能,但是图像却将控件
                      都挡住了)

解决方案 »

  1.   

    一定要JPG图像嘛,如果是BMP图像,直接用资源就可以生成,并把它放在最下面就可以了。
      

  2.   

    将JPG图片绘制在对话框背景上:显示JPG图片的函数
    void CMyDlg::ShowPicture(CDC *pDC, CString m_strBRoute, int x, int y, int width, int height)
    {
    HANDLE hFile = CreateFile(m_strBRoute, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    _ASSERTE(INVALID_HANDLE_VALUE != hFile);

    // 取得文件大小
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    _ASSERTE(-1 != dwFileSize);
    LPVOID pvData = NULL;
    //根据文件大小分配内存
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
    _ASSERTE(NULL != hGlobal);
    pvData = GlobalLock(hGlobal);
    _ASSERTE(NULL != pvData);
    DWORD dwBytesRead = 0;
    //读取文件并存入全局内存
    BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
    _ASSERTE(FALSE != bRead);
    GlobalUnlock(hGlobal);
    CloseHandle(hFile);
    LPSTREAM pstm = NULL;
    // 通过全局内存创建 IStream* 的指针
    HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
    _ASSERTE(SUCCEEDED(hr) && pstm);
    //通过图形文件创建IPicture 对象
    if (gpPicture)
    gpPicture->Release();
    hr = OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
    _ASSERTE(SUCCEEDED(hr) && gpPicture);
    pstm->Release();
    HDC hdc;
    hdc=pDC->GetSafeHdc();
    if (gpPicture)
    {
    // 取得图片的宽和高
    long hmWidth;
    long hmHeight;
    gpPicture->get_Width(&hmWidth);
    gpPicture->get_Height(&hmHeight);
    //宽高转换为象素
    int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH);
    int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH);
    RECT rc;
    GetClientRect(&rc);/*取得客户区*/
    gpPicture->Render(hdc, x,y, (int)height*hmWidth/hmHeight,height, 0, hmHeight, hmWidth, -hmHeight, &rc);
    /*显示图片*/
    }
    GlobalFree(hGlobal);

    }//在OnEraseBkgnd中
    CRect rc;
    GetClientRect(&rc);
    ShowPicture(pDC,strJpgPath,rc.left,rc.top,rc.Width(), rc.Height());
      

  3.   

    http://www.codeguru.com/listview/background_image.shtml
    http://www.codeguru.com/doc_view/MDIClient.shtml
    http://www.vckbase.com/document/viewdoc.asp?id=446
    都有例子,看看就知道了
      

  4.   

    http://www.vckbase.com/徐景周大侠的例子里就有这样风格,去看看
      

  5.   

    to SoLike(是我)
    感谢你的答复,我测试了你的代码/但是有一个地方测不通“gpPicture“未被定义
      

  6.   

    void CJpgeDlg::ShowPicture(CDC *pDC, CString m_strBRoute, int x, int y, int width, int height)
    {
    HANDLE hFile = CreateFile(m_strBRoute, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    _ASSERTE(INVALID_HANDLE_VALUE != hFile);

    // 取得文件大小
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    _ASSERTE(-1 != dwFileSize);
    LPVOID pvData = NULL;
    //根据文件大小分配内存
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
    _ASSERTE(NULL != hGlobal);
    pvData = GlobalLock(hGlobal);
    _ASSERTE(NULL != pvData);
    DWORD dwBytesRead = 0;
    //读取文件并存入全局内存
    BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
    _ASSERTE(FALSE != bRead);
    GlobalUnlock(hGlobal);
    CloseHandle(hFile);
    LPSTREAM pstm = NULL;
    // 通过全局内存创建 IStream* 的指针
    HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
    _ASSERTE(SUCCEEDED(hr) && pstm);
    //通过图形文件创建IPicture 对象    IPicture* gpPicture = NULL;  if (gpPicture)
    gpPicture->Release();
    hr = OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
    _ASSERTE(SUCCEEDED(hr) && gpPicture);
    pstm->Release();
    HDC hdc;
    hdc=pDC->GetSafeHdc();
    if (gpPicture)
    {
    // 取得图片的宽和高
    long hmWidth;
    long hmHeight;
    gpPicture->get_Width(&hmWidth);
    gpPicture->get_Height(&hmHeight);
    //宽高转换为象素
    int nWidth = hmWidth/GetDeviceCaps(hdc, LOGPIXELSX);///MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INSH);
    int nHeight = hmHeight/GetDeviceCaps(hdc, LOGPIXELSY);//MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INSH);
    RECT rc;
    GetClientRect(&rc);/*取得客户区*/
    gpPicture->Render(hdc, x,y, (int)height*hmWidth/hmHeight,height, 0, hmHeight, hmWidth, -hmHeight, &rc);
    /*显示图片*/
    }
    GlobalFree(hGlobal);

    }//绘背景
    BOOL CJpgeDlg::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
        if(!m_strJpge.IsEmpty())
        {
            CRect rc;
            GetClientRect(&rc);
            ShowPicture(pDC, m_strJpge,rc.left,rc.top,rc.Width(), rc.Height());

            return TRUE;
        }
        else return CDialog::OnEraseBkgnd(pDC);
    }不行我把程序发一下