自绘界面中的元素怎么拖动呢?

3m2u 2018-10-25 06:56:26
自己画的一个简单界面。就想像成上面有一个个的小正方形吧。
用个结构存每个元素的位置rect,颜色等等。
现在想让他能拖动。现在是根据LButtonDown 和mousemove 的时候记录点击的位置,
move的时候发送redrawwindow消息。
在OnPaint的时候用双缓冲 ,在内存dc画。因为动了还得记算
落下的时候的鼠标位置,当前的鼠标位置,鼠标 的状态,等等,计算当前应该显示在哪个坐标
但是运行结果与预期差别很大。不知道跑哪去了。
这种情况 有更好的解决方法吗?跟踪鼠标的拖动
界面中的元素没有子类化,都是在一起画的。
有个CRectTracker是干这个的么?
...全文
145 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2018-10-29
  • 打赏
  • 举报
回复
https://www.codeproject.com/search.aspx?q=CRectTracker&sbo=kw&x=0&y=0
sumos 2018-10-26
  • 打赏
  • 举报
回复
按照你的想法做。
拖动后显示绘制不对,应该是没有转换坐标,
把鼠标的坐标转换成相对窗口的坐标。
当然,MouseMove,LButtonDown中是有鼠标坐标的,你可以断点看看它是不是相对窗口的。
みしつかん 2018-10-26
  • 打赏
  • 举报
回复
用OPenGL来做吧,比你这样方便多了。
hhhh63 2018-10-26
  • 打赏
  • 举报
回复
思路很正确,就是计算出了问题,https://download.csdn.net/download/hhhh63/7710711,看看这个有没有帮助。
schlafenhamster 2018-10-26
  • 打赏
  • 举报
回复
1 在派生类中处理 不用 LButtonDown
2 一定要 确定位置
3 不要用 redrawwindow ,这是 同步 刷新,用 Invalidate(); 可以 积累 无效区(不一直paint)!

// CMyStatic message handlers
void CMyStatic::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
static CPoint ptLast;
//
if(MK_LBUTTON==nFlags)
{
CRect rc;
GetWindowRect(&rc);
ScreenToClient(&rc);
MapWindowPoints(GetParent(),&rc);
MoveWindow(rc.left+(point.x-ptLast.x), rc.top+(point.y-ptLast.y), rc.Width(), rc.Height());
}
else
{
ptLast=point;
CStatic::OnMouseMove(nFlags, point);
}
Invalidate();
}
CT8100 2018-10-25
  • 打赏
  • 举报
回复
空间继承CRectTracker看看,这个类是允许被移动的,你自己实现记得鼠标坐标记得要做屏幕坐标转窗口坐标。。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧