永发信息网

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

答案:3  悬赏:20  手机版
解决时间 2021-11-26 19:22
mfc中如何实现 鼠标拖拽图片
最佳答案
这个效果我刚好做过,呵呵!
首先,在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,双缓存方法来优化
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
明朝铜镜
培霞布店电暖炕地址好找么,我有些事要过去,
随着高新电子技术的广泛运用,网上购物开始走
如何用java实现HTTP长连接
有句形容比聪明人更聪明的那句话叫什么?好像
吃煮熟的苹果皮好么
请问一下我这是怎么了
跆枫跆拳道空手道馆地址好找么,我有些事要过
林俊杰的干儿子京京的亲爸爸是谁?
sinC约等于0点544求C约等于多少
一个自然数四舍五入到万位后得到近似数是1009
海军电器灯具商场地址在哪,我要去那里办事,
做一个铁皮通风管,是不是求它的表面积
win10怎么找NVIDIA控制面板
海苔肉松芝麻和红糖可以一起吃吗
推荐资讯
珍爱一生婚纱摄影婚礼庆典地址在什么地方,想
安心点APP开闸有哪些注意事项?
福莱雅婚纱影楼地址在什么地方,我要处理点事
有谁做过酯和羟胺的反应 请指教
水一吨等于多少克?
MASTER B/L是什么意思啊
电影的主演等人宣传的时候会到各大城市的高校
万能外圆磨床ma1420内孔磨得不圆角度不好配是
申酉戍混寅是破局吗
excel表中,同一列的单元格中有许多重复的内
写一篇获取信息作文
手里没王就别放单"这句话是什么意思
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?