高分求救:映射模式MM_LOMETRIC下,bmp文件加载到CScrollView
我在函数LoadFormatPicture里加载bmp图片到内存DC中,然后在OnDraw函数里bitblt内存DC到显示DC中
映射模式设成MM_TEXT能正常加载和显示,如果改成MM_LOMETRIC则显示一块黑色区域,高分求救程序哪里不对?怎么改?先谢谢了void CFormPrinterView::LoadFormatPicture()
{
CFormPrinterDoc *pDoc = GetDocument() ;

HBITMAP hbm ;
BITMAP bm ;
CDC *pDC = GetDC() , *pTmpDC = NULL ;
CBitmap *pbitmapOldTmp = NULL , bitmapTmp ; // 装载外部位图
hbm = (HBITMAP)::LoadImage( NULL , pDoc->m_strBitmapFilename , IMAGE_BITMAP , 0 , 0 , LR_DEFAULTSIZE | LR_LOADFROMFILE ) ;
bitmapTmp.Attach( hbm );
bitmapTmp.GetBitmap( &bm );

m_szPicture.cx = bm.bmWidth ;
m_szPicture.cy = bm.bmHeight ;

// 设置窗口大小
SetScrollSizes( MM_TEXT , m_szPicture );
//SetScrollSizes( MM_LOMETRIC , m_szPicture );

// 创建临时DC
pTmpDC = new CDC ;
pTmpDC->CreateCompatibleDC( pDC );

// 拷贝临时DC到内存DC
pbitmapOldTmp = pTmpDC->SelectObject( &bitmapTmp ) ;

m_pMemDC->CreateCompatibleDC( pDC );
m_pMemBitmap->CreateCompatibleBitmap( pDC , m_szPicture.cx , m_szPicture.cy );
m_pOldMemBitmap = m_pMemDC->SelectObject( m_pMemBitmap ) ;
//m_pMemDC->BitBlt( 0 , -m_szPicture.cy , m_szPicture.cx , m_szPicture.cy , pTmpDC , 0 , 0 , SRCCOPY );
m_pMemDC->BitBlt( 0 , 0 , m_szPicture.cx , m_szPicture.cy , pTmpDC , 0 , 0 , SRCCOPY );
m_pMemDC->SelectObject( m_pOldMemBitmap ) ;

pTmpDC->SelectObject( pbitmapOldTmp ) ;

/* 销毁临时DC */
delete pTmpDC ;
bitmapTmp.Detach();

ReleaseDC( pDC );

Invalidate();

return;
}void CFormPrinterView::OnDraw(CDC* pDC)
{
CFormPrinterDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

if( pDoc->m_strBitmapFilename == "" )
return;

m_pOldMemBitmap = m_pMemDC->SelectObject( m_pMemBitmap ) ;
//pDC->BitBlt( 0 , -m_szPicture.cy , m_szPicture.cx , m_szPicture.cy , m_pMemDC , 0 , 0 ,SRCCOPY );
pDC->BitBlt( 0 , 0 , m_szPicture.cx , m_szPicture.cy , m_pMemDC , 0 , 0 ,SRCCOPY );
m_pMemDC->SelectObject( m_pOldMemBitmap );
}

解决方案 »

  1.   

    void   CFormPrinterView::OnDraw(CDC*   pDC) 注释掉的那行pDC-> BitBlt,你想太简单了,最好是通过pDC自身的坐标变换实现转化.以下代码可供参考:
    void DrawBitmap(int x,int y,CDC* pDC,CBitmap* pBitmap)
    //此方法将图像显示到MM_TEXT坐标系下(x,y)处
    {
      BITMAP bm;
      pBitmap->GetObject(sizeof(BITMAP),&bm);
      CPoint size(bm.bmWidth,bm.bmHeight);
      pDC->DPtoLP(&size);
      CPoint org(0,0);
      pDC->DPtoLP(&org);
      CDC MemDC;
      MemDC.CreateCompatibleDC(pDC);
      CBitmap* pOldBitmap=MemDc.SelectObject(pBitmap);
      MemDC.SetMapMode(pDC->GetMapMode());
      pDC->BitBlt(x,y,size.x,size.y,&MemDC,org.x,org.y,SRCCOPY);
      MemDC.SelectObject(pOldBitmap);
    }
      

  2.   

    在MM_LOMETRIC这个模式下
    好象CScrollView是不支持的吧..FormView支持不支持还没试过..!