这个效果我刚好做过,呵呵!
首先,在View类中重载鼠标Down,Move,Up消息函数,这个没问题吧!
鼠标按下函数代码如下:
void CMy2009302590235liliView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMy2009302590235liliDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
LPSTR lpDIB=(LPSTR)::GlobalLock(pDoc->hDIB);
LPSTR lpDIBBits;
lpDIBBits=FindDIBBits(lpDIB);
LONG Width=DIBWidth(lpDIB);
LONG Height=DIBHeight(lpDIB);//这三句是为了获得图像的高和宽,这个你可以用你自己的方法获得。
CRect rectPic;
ptput=point;
rectPic.left=0;
rectPic.right=Width;
rectPic.top=0;
rectPic.bottom=Height;
if(rectPic.PtInRect(ptput))
{
SetCapture();
}//以上的步骤是为了判断你鼠标点下的地方是否在图片区域内。这个我相信你应该看得懂
CScrollView::OnLButtonDown(nFlags, point);
}
鼠标移动,重点在这里
void CMy2009302590235liliView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CScrollView::OnMouseMove(nFlags, point);
if(GetCapture())//这个if是为了判断鼠标是否在图像区域内,在的话执行下面的代码
{
CMy2009302590235liliDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);//这两行是为了获得指针pDoc,这个因该不陌生
LPSTR lpDIB=(LPSTR)::GlobalLock(pDoc->hDIB);//锁定图像
LPSTR lpDIBBits;
lpDIBBits=FindDIBBits(lpDIB);
LONG Width=DIBWidth(lpDIB);
LONG Height=DIBHeight(lpDIB);//以上是为了获得图像的高和宽
DWORD m_dwsizeImage=Width*Height;//计算大小
LPBYTE m_lpImageCopy=(BYTE*)malloc(m_dwsizeImage);//分配内存
memcpy(m_lpImageCopy,lpDIBBits,m_dwsizeImage);
DWORD wBitCount = ((LPBITMAPINFOHEADER)lpDIB)->biBitCount;//这个是获得每一个像素所占用的字节
DWORD lRowBytes=WIDTHBYTES(Width*wBitCount);
LPBYTE lpData=(LPBYTE)lpDIBBits;
LPBYTE lpOldBits=m_lpImageCopy;
CPoint m_ptmove=point;
//以下是具体算法,不做过多解释,可以直接复制粘贴
DWORD dXOffset;
DWORD dYOffset;
dXOffset=m_ptmove.x-ptput.x;
dYOffset=m_ptmove.y-ptput.y;
ptput=m_ptmove;
DWORD i;
DWORD j;
long i0=0;
long j0=0;
for(i=0;i
for(j=0;j
LPBYTE lpTemp=lpData+lRowBytes*(i)+(j);
i0=i+dYOffset;
j0=j-dXOffset;
if((j0>=0)&&(j0<(long)Width)&&(i0>=0)&&(i0<(long)Height))
{
*lpTemp=*(lpOldBits+lRowBytes*(i0)+(j0));
}
else
{
*lpTemp=(BYTE)255;
}
}
}
}
}
鼠标UP,这里简单的多,只要释放以下鼠标就可以了。
void CMy2009302590235liliView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CScrollView::OnLButtonUp(nFlags, point);
Invalidate(FALSE);
ReleaseCapture();
}
1、如果是单文档CView的程序,可以在OnDraw中使用m_nX,m_nY作为图片绘制起点变量来绘制整个图片。
鼠标拖动的时候,动态改变m_nX,m_nY的值,并Invalidate
2、如果出现闪烁,可以使用内存DC,双缓存方法来优化
处理鼠标拖动事件啊,相当于图片移动