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;可是发现现实绝对的不正常,没有什么规律,到底是什么原因呢,各位请指点…
我的缓冲区与客户区屏幕是尺寸一样的,我仅仅是想把图片的某一矩形直接拷贝到客户区屏幕的对应坐标相同区域,怎么就那么难办。
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;可是发现现实绝对的不正常,没有什么规律,到底是什么原因呢,各位请指点…
我的缓冲区与客户区屏幕是尺寸一样的,我仅仅是想把图片的某一矩形直接拷贝到客户区屏幕的对应坐标相同区域,怎么就那么难办。
pDC->LPtoDP(&srcRect); //因为参数说明上源图片是pixel坐标的
int YSrc, // y-coord of source upper-left corner注意,上两个参数不是upper-left,而是lower-left!好了,你该知道怎么做了。
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 数据是倒置的。