我想让程序运行后,在主框架的客户区显示一张图片,具体做法如下:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
BITMAP bm;
CBitmap *m_pBitmap;
        CDC *m_pdcMem;
CSize m_sizeSource;
m_pBitmap->LoadBitmap(IDB_BITMAP1);
m_pdcMem ->CreateCompatibleDC(pDC);
m_pdcMem ->SelectObject(m_pBitmap);
m_pBitmap->GetObject(sizeof(bm),&bm);
m_sizeSource.cx=bm.bmWidth;
m_sizeSource.cy=bm.bmHeight;
m_sizeDest=m_sizeSource;
pDC->StretchBlt(0,0,m_sizeSource.cx,m_sizeSource.cy,
   m_pdcMem,0,0,m_sizeSource.cx,m_sizeSource.cy,SRCCOPY);
}
图片可以显示出来,但发现有两个问题:
(1)主框架不可以随意放大、缩小,会出错;
(2)为什么不能用m_pBitmap->GetBitmap(&bm)呢?
请各位多多帮忙!!!

解决方案 »

  1.   

    CBitmap *m_pBitmap;
            CDC *m_pdcMem;
    CSize m_sizeSource;
    m_pBitmap->LoadBitmap(IDB_BITMAP1); // u declare a pointer m_pBitmap, but not alloc memory for it , will cause error
      

  2.   

    建议:
    使用CStatic 类显示位图
    在OnSize()中重设实例的位置
      

  3.   

    BOOL CWrapBitmap::Load(LPCTSTR lpszPathName)
    {
    if(m_hBitmap) //已经载入过位图,HBITMAP m_hBitmap;
    {
    m_Bitmap.Detach();//CBitmap m_Bitmap
    DeleteObject(m_hBitmap);
    m_hBitmap=NULL;
    }
    m_hBitmap=(HBITMAP)::LoadImage(NULL,lpszPathName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); if(m_hBitmap==NULL)
    { TRACE("Load Bitmap Error");
    return false;
    }

    m_Bitmap.Attach(m_hBitmap);
    return true;}
    void CLogView::OnDraw(CDC* pDC)
    {
    CLogDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here if(!memDC.m_hDC)
    {
    memDC.CreateCompatibleDC(pDC);
    }
    CWrapBitmap* pWrapBitmap=pDoc->GetWrapBitmap();
    if(!pWrapBitmap->GetpBitmap())//得到CBitmap类指针
    return;
    memDC.SelectObject(pWrapBitmap->GetpBitmap());
    pDC->BitBlt(0,0,pWrapBitmap->GetWidth(),pWrapBitmap->GetHeight(),&memDC,0,0,SRCCOPY);
    }
      

  4.   

    void CExtendedBitmapDlg::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting if (m_bitmap.GetSafeHandle())
    {
    CDC dcMem; if (dcMem.CreateCompatibleDC(&dc))
    {
    CBitmap* pOldBM = dcMem.SelectObject(&m_bitmap);
    BITMAP BM; m_bitmap.GetBitmap(&BM); dc.BitBlt(0, 0, BM.bmWidth, BM.bmHeight, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBM);
    }
    }
    }。
    CFileDialog dialog(TRUE, NULL, m_sFilename, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
    "Images (*.bmp, *.gif, *.jpeg)|*.bmp;*.gif;*.jpeg||"); if (IDOK == dialog.DoModal())
    {
    CEnBitmap bitmap; if (bitmap.LoadImage(dialog.GetPathName()))
    {
    m_bitmap.DeleteObject();
    m_bitmap.Attach(bitmap.Detach());
    Invalidate(); m_sFilename = dialog.GetPathName();
    UpdateData(FALSE);
    }
    }
      

  5.   

    各位写的我怎么都不明白呢?还请在解释一下。
    (1). ttzzgg_80713(≈(⊙ā⊙)≈) ,
        你说的问题我考虑到了,只是在上面没写出来,应该这应定义:CBitmap *m_pBitmap; CDC *m_pdcMem;
    然后这样初始化:m_pBitmap=new Cbitmap; m_pdcMem=new CDC;
    (2) jingjing8178(晶晶) 
         能说一下怎样在OnSize()中重设实例的位置
    (3)foxmail(萧遥) 
         你写的更不明白了,CWrapBitmap::Load(LPCTSTR lpszPathName)函数从那来的,怎么与void CLogView::OnDraw(CDC* pDC)联系起来呢
    (4).xinuisuo(xinyisuo) 
    你的意思我大体明白,但:
    CFileDialog dialog(TRUE, NULL, m_sFilename, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
    "Images (*.bmp, *.gif, *.jpeg)|*.bmp;*.gif;*.jpeg||"); if (IDOK == dialog.DoModal())
    {

    }
    以上这段究竟该放在程序那块呢?
    还有:CextendedBitmapDlg对话框怎样调用呢?
      

  6.   

    OnDraw( CDC* pDC )
    {
        if( m_bmp == NULL ) return;    CDC* pDoc = GetDocument();
        ASSERT_VALID( pDoc );    SIZE sizes = pDoc->GetImageDims();    CRect rectClient;
        GetClientRect( &rectClient );    CRect rectTo;
        rectTo.left = rectTo.top = 0;    if( m_bCenterInWindow && !m_bResizeWithImage )
        {
            rectTo.left = rectClient.Width() >> 1;
            rectTo.left -= sizes.cx >> 1;
            if( rectTo.left < 0 ) rectTo.left = 0;        rectTo.top = rectClient.Height() >> 1;
            rectTo.top -= sizes.cy >> 1;
            if( rectTo.top < 0 ) rectTo.top = 0;
        }    rectTo.right = rectTo.left + sizes.cx;
        rectTo.bottom = rectTo.top + sizes.cy;    TRACE( "Client rectangle: %d %d\nFinal rectangle: %d %d %d %d w=%d h=%d\n",
                rectClient.Width(), rectClient.Height(),
                rectTo.left, rectTo.top, rectTo.right, rectTo.bottom,
                rectTo.Width(), rectTo.Height() );    if( pDC->IsPrinting() )
        {
            int cxPage = pDC->GetDeviceCaps( HORZRES );
            int cyPage = pDC->GetDeviceCaps( VERTRES );        int cxInch = pDC->GetDeviceCaps( LOGPIXELSX );
            int cyInch = pDC->GetDeviceCaps( LOGPIXELSY );        if( m_bScaleToFit )
            {
                rectTo.left = rectTo.top = 0;
                rectTo.right = cxPage;
                rectTo.bottom = (int)( ((double)sizes.cy * cxPage * cyInch) /
                                       ((double)sizes.cx * cxInch) );
            }
            else
            {
                CDC dc;
                BOOL bResult = dc.CreateCompatibleDC( NULL );
                if( bResult )
                {
                    int cxDisplay = dc.GetDeviceCaps( LOGPIXELSX );
                    int cyDisplay = dc.GetDeviceCaps( LOGPIXELSY );
                    dc.DeleteDC();                rectTo.right = rectTo.left +
                                   (int)((double)rectTo.Width()*cxInch/cxDisplay);
                    rectTo.bottom = rectTo.top +
                                    (int)((double)rectTo.Height()*cyInch/cyDisplay);                if( m_bCenterOnPage )
                    {
                        int prtcx = (int)((double)sizes.cx*cxInch/cxDisplay);
                        int prtcy = (int)((double)sizes.cy*cyInch/cyDisplay);                    rectTo.left = cxPage>>1;
                        rectTo.left -= prtcx>>1;                    rectTo.top = cyPage>>1;
                        rectTo.top -= prtcy>>1;                    rectTo.right = rectTo.left + prtcx;
                        rectTo.bottom = rectTo.top + prtcy;
                    }
                }
            }
        }    ::StretchDIBits( pDC->m_hDC,
                         rectTo.left, rectTo.top, rectTo.Width(), rectTo.Height(),
                         0, 0, sizes.cx, sizes.cy,
                         m_bmp, &m_bmi, DIB_RGB_COLORS, SRCCOPY );}
      

  7.   

    不要在Ondraw()中调用 LoadBitmap() function
      

  8.   

    同上,既然都m_XXX了,那就作为类的成员变量呀,在InitualUpdate或其它的初始化里调用一次LoadBitmap就行了
      

  9.   

    你绘图的时候,矩形区域回超出范围,造成出错。你可以在初始化函数中调入位图;
    在OnDraw函数中根据当前的客户区域来显示(GetClientRect取得);
    在类虚构中释放位图资源。