小弟新手,望各位指教。我在视类的OnDraw中实现如下代码:
CRect rect;
GetClientRect(&rect);
……………………
width = rect.Width();
height = rect.Height();
::StretchDIBits(pDC->GetSafeHdc(),rect.left,rect.top,width,height,0,0,width,height,m_lpDIBits, (LPBITMAPINFO) m_lpBMPHdr,DIB_RGB_COLORS, SRCCOPY);
当图像尺寸大于View的区域时,怎么显示效果是图像的左下角与View窗口左下角重合,而图象其余超出View显示区域的部分隐藏了呢?我觉得应该是左上角重合吧.
请各位指教。多谢。

解决方案 »

  1.   

    ::StretchDIBits(pDC- >GetSafeHdc(),0,0,width,height,0,0,width,height,m_lpDIBits, (LPBITMAPINFO) m_lpBMPHdr,DIB_RGB_COLORS, SRCCOPY); 
      

  2.   

    ::StretchDIBits(pDC-  >GetSafeHdc(),0,0,width,height,0,0,width,height,m_lpDIBits, (LPBITMAPINFO) m_lpBMPHdr,DIB_RGB_COLORS, SRCCOPY);
    我照这样改还是一样的,因为本身rect.left,rect.top二者肯定都是0
      

  3.   

    好像dib有两种,一种原点是左上角,一种原点是左下角。
    你的问题应该出在这里吧
      

  4.   

    而且,StretchDIBits(pDC- >GetSafeHdc(),rect.left,rect.top,width,height,0,0,width,height,m_lpDIBits, (LPBITMAPINFO) m_lpBMPHdr,DIB_RGB_COLORS, SRCCOPY
    这里应该是原目标的宽度和高度,而你用了clientrect的宽度和高度。
    改为
    StretchDIBits(pDC- >GetSafeHdc(),rect.left,rect.top,width,height,0,0,dib.width,dib.height,m_lpDIBits, (LPBITMAPINFO) m_lpBMPHdr,DIB_RGB_COLORS, SRCCOPY); 
      

  5.   

    ::StretchDIBits(pDC-   >GetSafeHdc(),0,0,width,height,0,0,m_lpBMPHdr-> bmiHeader.biWidth,m_lpBMPHdr-> bmiHeader. biHeight; 
    ,m_lpDIBits, (LPBITMAPINFO) m_lpBMPHdr,DIB_RGB_COLORS, SRCCOPY); 第五个到第八个参数应该指向原位图的大小(源矩形大小)
      

  6.   

    void CSVView::OnInitialUpdate()

        CDC *pDC = this->GetDC();    m_MemDC.CreateCompatibleDC(pDC);    m_bmp.LoadBitmap(IDB_BMP_BKGND);    
        m_MemDC.SelectObject(&m_bmp);    BITMAP Bitmap;
        m_bmp.GetBitmap(&Bitmap);    m_nBmpHeight = Bitmap.bmHeight;
        m_nBmpWidth = Bitmap.bmWidth;    CSize size(m_nBmpWidth,m_nBmpHeight);
        SetScrollSizes(MM_TEXT,size);    this->ReleaseDC(pDC);    
    }
      

  7.   

    void CSVView::OnInitialUpdate()

        CDC *pDC = this->GetDC();    m_MemDC.CreateCompatibleDC(pDC);    m_bmp.LoadBitmap(IDB_BMP_BKGND);    
        m_MemDC.SelectObject(&m_bmp);    BITMAP Bitmap;
        m_bmp.GetBitmap(&Bitmap);    m_nBmpHeight = Bitmap.bmHeight;
        m_nBmpWidth = Bitmap.bmWidth;    CSize size(m_nBmpWidth,m_nBmpHeight);
        SetScrollSizes(MM_TEXT,size);    this->ReleaseDC(pDC);    
    }
      

  8.   

    void CSVView::OnDraw(CDC* pDC)
    {
        pDC->BitBlt(0,0,m_nBmpWidth,m_nBmpHeight,
            &m_MemDC,0,0,SRCCOPY);    SetScrollSizes(MM_TEXT, CSize(m_nBmpWidth,m_nBmpHeight));
        CChildFrame *pParentFrame =
            (CChildFrame *)this->GetParentFrame();
        pParentFrame->RecalcLayout();
        ResizeParentToFit();    }
      

  9.   

    第五个到第八个参数如果指向原位图的大小(源矩形大小)的话,当图像大于显示区域时,它会自动压缩,而我不想压缩,只想View区域能显示多少就算多少。现在的问题是原点怎么会跑左下角去了?应该是显示图像左上角的一块。
    shunruo 的说法不对吧,因为我的位图不是资源加载的,是根据文件构建的DIB。
      

  10.   

    不想压缩用SetDIBitsToDevice函数即可,还快。否则自己计算缩放比例来设置参数。
      

  11.   

    drowdrow 说的是对的,dib有两种,一种原点是左上角,一种原点是左下角。 而我的图像正好是原点在左下角,所以这样。我重新计算了左上角的坐标,算出应该从源图像拷贝的起始点,显示已经满足要求了。谢谢各位。