OnDraw中显示图形:使用了函数StretchDIBits;首先根据目前的客户区(宽高分别为width,height)的尺寸建立了一个大小为Height *linesize的缓冲区,缓冲区指针为m_pDisBuffer。其中Linesize是根据图片的宽度和BitCount对齐计算的,绝对正确,此外pDoc->m_bmpInfo里面的参数设置绝对正确。后进行了一些操作。如
memset(m_pDisBuffer,RGB(0,0,0),lineSize * height);另外对m_pDisBuffer进行了一系列的操作,产生了一些图形
因为显示为倒置的,修改了高度为负的
pDC->SetMapMode(MM_TEXT);
pDoc->m_bmpInfo.info.biHeight = - pDoc->m_bmpInfo.info.biHeight;StretchDIBits(pDC->GetSafeHdc(),0,0,width, height,
   0,0, widthheight, m_pDisBuffer,(LPBITMAPINFO)&pDoc->m_bmpInfo, 
DIB_RGB_COLORS, SRCCOPY); pDoc->m_bmpInfo.info.biHeight = -pDoc->m_bmpInfo.info.biHeight;这样显示完全整行,但是问题在于我想提高绘图效率,与客户区上面覆盖了一个小窗口,此窗口移动时,我不向绘制全部的客户去,而是想仅仅绘制需要更新的部分。于是使用了
pDoc->m_bmpInfo.info.biHeight = - pDoc->m_bmpInfo.info.biHeight;CRect rcClip;
pDC->GetClipBox(&rcClip); //logical coordinates based on the given dc
CRect srcRect = rcClip;
pDC->LPtoDP(&srcRect); //因为参数说明上源图片是pixel坐标的StretchDIBits(pDC->GetSafeHdc(), rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),    srcRect.left,srcRect.top,srcRect.Width(),srcRect.Height(),
m_pDisBuffer,(LPBITMAPINFO)&pDoc->m_bmpInfo, 
DIB_RGB_COLORS, SRCCOPY);
pDoc->m_bmpInfo.info.biHeight = -pDoc->m_bmpInfo.info.biHeight;可是发现现实绝对的不正常,没有什么规律,到底是什么原因呢,各位请指点…
我的缓冲区与客户区屏幕是尺寸一样的,我仅仅是想把图片的某一矩形直接拷贝到客户区屏幕的对应坐标相同区域,怎么就那么难办。

解决方案 »

  1.   

    这句不要试试
    pDC->LPtoDP(&srcRect); //因为参数说明上源图片是pixel坐标的
      

  2.   

    StretchDIBits的MSDN帮助有一点小错误:  int XSrc,                     // x-coord of source upper-left corner
      int YSrc,                     // y-coord of source upper-left corner注意,上两个参数不是upper-left,而是lower-left!好了,你该知道怎么做了。
      

  3.   

    我靠,知道了,修改成了rcClip.left,height-rcClip.bottom,rcClip.Width(),rcClip.Height(),完全OK
      

  4.   

    To  hhoking(妙手仁心) :
     MSDN 没错,你们没有看全,XSrc 
    [in] Specifies the x-coordinate, in pixels, of the source rectangle in the DIB. 
    YSrc 
    [in] Specifies the y-coordinate, in pixels, of the source rectangle in the DIB. DIB 数据是倒置的。
      

  5.   

    to Anikan(皮皮鱼) ():较真了。我那样说的也没错,是按你实际看到的图像的视角来定义坐标的,也符合一般的思维方式,好理解。总之MSDN在这个问题上说的不清晰,稍不留意就着了道了^_^