mfc中如何实现 鼠标拖拽图片

 我来答
胡声天井红B
2011-08-15 · TA获得超过1182个赞
知道小有建树答主
回答量:327
采纳率:0%
帮助的人:292万
展开全部
这个效果我刚好做过,呵呵!
首先,在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<Height;i++)
{
for(j=0;j<Width;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();
}
noodlest
2011-08-15 · TA获得超过785个赞
知道小有建树答主
回答量:724
采纳率:100%
帮助的人:720万
展开全部
1、如果是单文档CView的程序,可以在OnDraw中使用m_nX,m_nY作为图片绘制起点变量来绘制整个图片。
鼠标拖动的时候,动态改变m_nX,m_nY的值,并Invalidate
2、如果出现闪烁,可以使用内存DC,双缓存方法来优化
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wkr2005
2011-08-15 · TA获得超过279个赞
知道小有建树答主
回答量:434
采纳率:0%
帮助的人:307万
展开全部
处理鼠标拖动事件啊,相当于图片移动
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式