我先用打开对话框打开需要的bmp图像取得图片的地址,代码如下:
void CBmpLockDlg::OnBnClickedOpen()
{
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"BMP Files(*.bmp)|*.bmp||",AfxGetMainWnd());
if(dlg.DoModal() == IDOK)
{
m_path = dlg.GetPathName();//取得路径
UpdateData(FALSE);
}
else
{
return;
}
}
然后在OnPaint的else中加入以下代码void CBmpLockDlg::OnPaint() 
{

if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//CString strImage=m_path;
//加载位图
HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,m_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); if (hBitmap==NULL)
{
return;
}
CBitmap m_Bmp;
m_Bmp.Attach(hBitmap); //获取位图信息
BITMAP bmpinfo;
m_Bmp.GetBitmap(&bmpinfo);
//创建内存DC
CDC MemDC;
CDC* pDC=GetDC();
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&m_Bmp);
CRect rect;
GetClientRect(&rect); pDC->StretchBlt(rect.left,rect.right,rect.Width(),rect.Height()-50,&MemDC,0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
//MemDC.SelectObject(pOldBitmap);
ReleaseDC(pDC);
Invalidate();

CDialog::OnPaint();
}
}位图一直显示不出来,怎么回事?

解决方案 »

  1.   

    不要再:
          Invalidate();
            
            CDialog::OnPaint();
      

  2.   

    既然是写在OnPaint中,就不用GetDC了
    改在下面的代码试试:
      
    HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,m_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
            if (hBitmap==NULL)
            {
                return;
            }
            CBitmap m_Bmp;
            m_Bmp.Attach(hBitmap);        //获取位图信息
            BITMAP bmpinfo;
            m_Bmp.GetBitmap(&bmpinfo);
            //创建内存DC
            CDC *MemDC=new CDC;
            CPaintDC dc(this);
            MemDC->CreateCompatibleDC(&dc);
            MemDC->SelectObject(&m_Bmp);
            CRect rect;
            GetClientRect(&rect);        dc.StretchBlt(rect.left,rect.right,rect.Width(),rect.Height()-50,MemDC,0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
            //MemDC.SelectObject(pOldBitmap);
           
      

  3.   

    删除:
      Invalidate();
        
      CDialog::OnPaint();
      

  4.   

    是背景吧:
    // in .h  CBitmap m_bitmap;
    // in ctor: m_bitmap.LoadBitmap(IDB_CLOUDS);
    BOOL CDlgHasToolBarDlg::OnEraseBkgnd(CDC* pDC) 
    {
    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);
    CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
    // Retrieve the size of our bitmap...
    BITMAP bmp;
    m_bitmap.GetObject(sizeof(bmp),&bmp);
    // and the size of our window's client area
    CRect rect;
    GetClientRect(&rect);
    // Fill the window's client area with our bitmap
    pDC->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
    &dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
    dcMem.SelectObject( pOldBitmap );
    //
    return TRUE;//CDialog::OnEraseBkgnd(pDC);
    }
      

  5.   

    看看这篇文章中的效果
    http://blog.csdn.net/xianglitian/article/details/6023656
      

  6.   

    给你一个对话框按钮的代码:
    void CDemoBitmapDlgDlg::OnButton2() 
    {
    // TODO: Add your control notification handler code here
    CString m_path;
    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"BMP Files(*.bmp)|*.bmp||",AfxGetMainWnd());
        if(dlg.DoModal() == IDOK)
        {
            m_path = dlg.GetPathName();
        }
        else
        {
            return;
        } 
    CBitmap cbmp;
    HBITMAP hbitmap;
    hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),m_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); 

    cbmp.Attach(hbitmap);
    BITMAP bm;
    cbmp.GetBitmap(&bm);
    CDC dcMem;
    dcMem.CreateCompatibleDC(GetDC());
    CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(cbmp);
    CRect lRect;
    GetClientRect(&lRect);
    GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),  &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
    dcMem.SelectObject(&poldBitmap);
    }
      

  7.   

    pDC->StretchBlt(0,0,rect.Width(),rect.Height()-50,&MemDC,
    0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
      

  8.   


    有报异常,停在 CDC dcMem;上...
      

  9.   

    bmpinfo.bmWidth,bmpinfo.bmHeight
    bmpinfo有问题。不需要
    直接:
    bmp.bmWidth,bmp.bmHeight
      

  10.   

    dc.StretchBlt(rect.left,rect.right,rect.Width(),rect.Height()-50,&dcMem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    应该是rect.top
      

  11.   

    void CGAGADlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,"Blue hills.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

            if (hBitmap==NULL)
            {
                return;
            } CBitmap m_Bmp;
            m_Bmp.Attach(hBitmap);

            //获取位图信息
            BITMAP bmpinfo;
            m_Bmp.GetBitmap(&bmpinfo);
            //创建内存DC
            CDC MemDC;
            CDC* pDC=GetDC();
            MemDC.CreateCompatibleDC(pDC);
            MemDC.SelectObject(&m_Bmp);
            CRect rect;
            GetClientRect(&rect);
    pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height()-50,&MemDC,
    0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
            //MemDC.SelectObject(pOldBitmap);
            ReleaseDC(pDC);
    // Invalidate();
    CDialog::OnPaint();
    }
    }
      

  12.   

    HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL,"Blue hills.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

            if (hBitmap==NULL)
            {
                return;
            } CBitmap m_Bmp;
            m_Bmp.Attach(hBitmap);

            //获取位图信息
            BITMAP bmpinfo;
            m_Bmp.GetBitmap(&bmpinfo);
            //创建内存DC
            CDC MemDC;
            CDC* pDC=GetDC();
            MemDC.CreateCompatibleDC(pDC);
            MemDC.SelectObject(&m_Bmp);
            CRect rect;
            GetClientRect(&rect);
    pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height()-50,&MemDC,
    0,0,bmpinfo.bmWidth,bmpinfo.bmHeight,SRCCOPY);
            //MemDC.SelectObject(pOldBitmap);
            ReleaseDC(pDC);你rect.top写成rect.right
    本来你已经画好了,你又invalidate(),把画得全部擦除了。
      

  13.   

    StretchBlt的参数你看下,你写的有问题,
    还有CDC都有了,何必再去获取呢,
    最后,为什么用invalide呢,这个不应该加,这个是外部刷新用的,在里面就不用了吧!