关于MFC 在一个对话框内有两个控件,在其中一个控件内点击拖动到另一控件松开,然后交换控件的位置怎么实现?

关于MFC在一个对话框内有两个控件,鼠标在其中一个控件内点击拖动到另一控件松开,然后交换控件的位置怎么实现?我的思路是用hook,因为对话框LButtonDown事件控件... 关于MFC 在一个对话框内有两个控件,鼠标在其中一个控件内点击拖动到另一控件松开,然后交换控件的位置怎么实现?我的思路是用hook,因为对话框LButtonDown事件控件上无效,但是不知道怎么判断截获鼠标点击的位置是在控件范围内,请详细回答,谢谢,可以多加分。 展开
 我来答
老牛带你看奇闻
2011-04-26 · TA获得超过863个赞
知道小有建树答主
回答量:500
采纳率:0%
帮助的人:780万
展开全部
我已经实现了你说的东东,可以baidu hi我,我发工程给你。

我用的button按钮控件,方法是:
1、重载CButton类,写了个自己的CMyButton类,在这里实现按钮拖动,和拖动完成后给父窗口发完成消息
2、当主窗口收到按钮发的拖动完成消息后,判断两个按钮是否相交,如果相交,则交换两个按钮位置

当然,其它控件也可以用类似方法实现,有什么问题Hi我就行
更多追问追答
追问
你能不能发到我邮箱上去zhaoqi0128@163.com,如果可以解决问题就把分数给你
追答
已发送
C_stu
2011-04-30 · TA获得超过456个赞
知道小有建树答主
回答量:694
采纳率:0%
帮助的人:630万
展开全部
MFC不清楚..不过你可以做一个粘合层来处理两个控件的消息传递, 以及消息的处理等.

你可以在粘合层开一个线程, 定时取GetKeyState(VK_LBUTTON), 可以通过两个控件的初始位置和GetCursorPos共同确定新的窗口位置, 也可以提供对应的setPos/getPos来手动指定..
当你那个线程检测到两个控件的位置rect有相交时, 就可以MoveWindow来实现调换位置了(只要记录下连个控件的初始位置就好, 这两个rect都可以通过提供set/get方法来手动指定给粘合层)

当然..最简单的方法就是你如果能直接处理WndProc是最好的...有一个ws的方法可以取到.
就是GetWindowLong取到现有的WndProc, 然后SetWindowLong设置你自己的WndProc, 在自己的WndProc里面判断是否是你那两个控件产生了移动消息..不是的话就调用老的WndProc, 是的话就直接return就行了..不过这样就失去了用MFC的意义..是WIN32编程的方法 = =

至于hook..也是可以的..写个dll而已..

嘛..最好还是直接处理MouseMove消息比较好..
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
silvergingko
2011-04-30 · TA获得超过5945个赞
知道小有建树答主
回答量:688
采纳率:0%
帮助的人:870万
展开全部
楼主,你也真是的,人家已经发给你样例了,你又说你的控件不是 BUTTON ,那你的控件究竟是什么呢?如果是任何控件,那你也可以按照人家给你 BUTTON 的样例,进行改进就可以了。哪有拿过来就要能直接用的事情?

你说别人在较真,我看楼主倒是在较真。都提醒过你了,别用 HOOK ,可你还是往 HOOK 方面去考虑。像这种简单的功能,居然要借助 HOOK ,实在有点说不过去。

我觉得 niuxiaojia45 的实现方式和我想的差不多。当确定了哪个种类的控件需要被拖拽,首先子类化该控件,然后当该控件收到鼠标被按下的消息后,该控件通过 SendMessage 发送自定义消息给父窗口,通知其父窗口,该控件要被拖动。至于拖动的事情,还是让父窗口来决定。理由是:控件是占用父窗口的客户区的。
说白了,控件是房子的承租人,父窗口是大楼的房东,承租人要搬到该楼的其它房间去,应该是承租人通知大楼房东,大楼房东来决定承租人是否能搬到其它房间里去。因为承租人是不知道其它房间的使用情况的,只有房东最清楚。
因此,控件要移动,控件不能自己自说自话的移动,应该通知父窗口。由父窗口来移动控件,因为父窗口还能确定客户区中其它控件的位置。简而言之,这是一个控件群的布局问题,布局由父窗口来负责。 当然,现在的控件布局,也允许控件自身来参与布局决策,而不是完全由父窗口来全权包办的。例如 WPF 就是父窗口与控件协调参与布局的一种机制。因此,是子控件自己移动,还是父窗口来统一管理,看实际需要。一般都是父窗口来打理。

另外,鼠标拖放也是一种实现方式,不过该方式需要和 COM 交互,实现的复杂度较高。初学者很难实现。事实上,鼠标拖拽就是控件发送消息,父窗口来管理控件布局的一种模式。作为 IDropSource 源的控件在鼠标拖动时,通知父窗口,拖动的鼠标坐标等通过 IDataObject 传递给父窗口,当然 IDataObject 能传递的内容可以远远多于鼠标坐标这种简单的信息。 作为 IDropTarget 的父窗口,来决定具体的“放”操作。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
何处淬吴钩
2011-04-27 · TA获得超过5045个赞
知道大有可为答主
回答量:2947
采纳率:50%
帮助的人:2413万
展开全部
按钮自己画,处理对话框消息。效果远好于你用hook。你要会简单的ps比较好。现在很多应用程序的控件都是自己画的
更多追问追答
追问
我的控件不是按钮啊,我发现窗口hook也不行,悲剧,还是只能在控件以外的窗口hook到鼠标信息,有什么其他好的方法么?现在在考虑直接hook整个屏幕在选取坐标
追答
不用任何控件,都是自己画。hook,hook,貌似你hook很牛X?那希望你再接再厉,用hook去实现吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
178752468
2011-04-28 · TA获得超过291个赞
知道小有建树答主
回答量:517
采纳率:0%
帮助的人:397万
展开全部
vc支持拖放操作啊,需要从一个类中派生下,具体记不清楚了,自己查吧。hook是效率最低最不可取的办法。
实在不行 setcapture来捕捉鼠标位置 再做击中测试也要好得多。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
孤松独海
2011-04-26 · TA获得超过1513个赞
知道大有可为答主
回答量:1220
采纳率:0%
帮助的人:491万
展开全部
你要空间的LButtonDown干啥,直接获取对话框的LButonDown事件,判断如果此时point在第一个控件的rect里面,那么开始移动此控件位置,不断InValidate 不断setwindowpos 或者movewindow,直到 判断点到了另一个控件的rect里面时,两者就交换位置。
更多追问追答
追问
对控件点击左键无法获取LButtonDown事件,还有交换控件位置怎么实现?
追答
你要控件的LButtonDown干啥,直接获取对话框的LButonDown事件
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式