首页新闻找找看学习计划

c# 关于Windows消息函数DefWndProc的问题

0
悬赏园豆:50 [已解决问题] 解决于 2015-04-15 17:54

我打算做一个鼠标在窗体上移动时new一个Label跟着鼠标移动,使用DefWndProc函数时遇到一个问题,鼠标在窗体空白部分移动通过m.Msg == WM_MOUSEMOVE可以实现,但是在窗体的控件上移动时进入不了m.Msg == WM_MOUSEMOVE这个条件,这个问题怎么处理呢?或者有没有一种方法能代替它实现这个功能?

 1 public int WM_LBUTTONUP = 0x0202;
 2 public int WM_MOUSEMOVE = 0x0200;
 3 protected override void DefWndProc(ref System.Windows.Forms.Message m)
 4         {
 5             //WM_MAIN_MESSAGE为自定义的系统消息
 6             if (m.Msg == WM_MOUSEMOVE)
 7             {
 8 
 9             }
10             else if (m.Msg == WM_LBUTTONUP)
11             {
12 
13             }
14 
15             //默认消息处理函数
16             base.DefWndProc(ref m);
17         }
View Code
史蒂芬周的主页 史蒂芬周 | 初学一级 | 园豆:76
提问于:2015-04-14 16:32
< >
分享
最佳答案
0

GetCapture

收获园豆:40
Launcher | 高人七级 |园豆:45040 | 2015-04-14 17:41

不好意思,可能我问题描述不准确,因为我现在要做的是拖动treeview的一个节点到另外一个控件(例如textbox)上,然后这个节点的text显示在这个控件上,最好是拖动的过程中能将这个节点的text显示出来跟着鼠标走。

我现在实现的方式是拖节点时触发treeview的ItemDrag事件,然后赋给一个全局变量,鼠标拖到textbox上释放触发textbox的MouseUp事件,将这个全局变量的值赋给textbox,但是这样做不理想,因为鼠标只要拖动节点,treenode的值就赋给了全局变量,再点击textbox触发MouseUp事件,treenode的值还是赋过来了,这样根本就不是持续拖拽实现的

史蒂芬周 | 园豆:76 (初学一级) | 2015-04-14 18:38

@史蒂芬周: 在 Winform 中没有那么麻烦吧!看看这个:http://blog.csdn.net/small5e4444/article/details/6750164

Launcher | 园豆:45040 (高人七级) | 2015-04-15 10:04

@Launcher: 嗯,根据这个demo我已经实现了我要的功能,谢谢

史蒂芬周 | 园豆:76 (初学一级) | 2015-04-15 17:50
其他回答(1)
0

开始拖动时,设置一个全局变量为True,当MouseUp时,如果这个时候鼠标的位置在目标Textbox上面而且全局变量为True时才赋值,并且把这个变量设置为False。这样的话只有在一个持续拖拽中才会赋值,中间鼠标松开的话就无效了。

收获园豆:10
XiaoFaye | 园豆:3082 (老鸟四级) | 2015-04-15 05:00

我之前这样想过,但是问题在于MouseUp是针对控件的,TextBox的MouseUp可以获取到,但是中间鼠标松开得时候MouseUp怎么获取到呢?我之前想用Windows消息函数DefWndProc来获取,但是由于窗体上控件较多,鼠标在窗体的控件上的时候,DefWndProc触发不了,也就接收不到MouseUp事件

支持(0) 反对(0) 史蒂芬周 | 园豆:76 (初学一级) | 2015-04-15 09:44

@史蒂芬周: 

可以的,可以捕捉经过窗口的所有事件,你自己看看:

 

One straightforward way to do this is to add a message loop filter by calling Application.AddMessageFilter and writing a class that implements the IMessageFilter interface.

Via IMessageFilter.PreFilterMessage, your class gets to see any inputs messages that pass through your application's message loop. PreFilterMessage also gets to decide whether to pass these messages on to the specific control to which they're destined.

One piece of complexity that this approach introduces is having to deal with Windows messages, via the Message struct passed to your PreFilterMessage method. This means referring to the Win32 documention on WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONUP etc, instead of the conventional MouseDown, MouseMove and MouseUp events.

支持(0) 反对(0) XiaoFaye | 园豆:3082 (老鸟四级) | 2015-04-15 10:17

@XiaoFaye: 上面那个链接的内容正好符合我要的功能,我依照那种方式实现了,谢了。

支持(0) 反对(0) 史蒂芬周 | 园豆:76 (初学一级) | 2015-04-15 17:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册