CSDN=>FAQ=>FAQ 展示
  • 问题内容:参与贴子“怎么知道鼠标在控件上面刚停下?”的同志及关注者快进来,有好消息!
  • 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5196217
  • 所属论坛:C#     审核组:.NET技术
  • 提问者:hbxtlhx     解决者:hbxtlhx
  • 感谢:xiaoku buyaowen lizhizhe2000 wdy9927 raozhiven flyforlove Accelerator flyforlove Eddie005 liujia_0421 liujia_0421 raozhiven JSIFENG cangwu_lee yuzhlhua cancerser flyforlove Influence tjvictor ycqing kyle315 raozhiven dyw31415926 pyuan zerg318 zerohk colaxu kook_tian GXY2005 GXY2005 raozhiven raozhiven flyforlove Tenner junsir GXY2005 liuchao305 raozhiven raozhiven wangkun9999 GXY2005 bjgzxx flyforlove mfjustlove flyforlove southsky8019 GXY2005 flyforlove jrl5365 GXY2005 Qim flyforlove tete gui06
  • 关键字:调用 控件 .NET技术 窗体 C# using public 鼠标 flag 恭喜 trackmouseevent 悬停
  • 答案:

    我的贴子“怎么知道鼠标在控件上面刚停下?”里问了一个问题,可是觉得大家的处理不太理想,我好好查了一下Control的用法,终于得到了一个较好的处理方法。原贴地址:
    http://community.csdn.net/Expert/topic/5193/5193513.xml?temp=.569195

    我的处理是这样的:
    重写控件的MouseHover及MouseMove两个基类的方法,如下:

    protected override void OnMouseHover(EventArgs e)
    {
    System.Console.WriteLine(DateTime.Now);
    base.OnMouseHover(e);
    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
    base.OnMouseMove(e);
    base.ResetMouseEventArgs();
    }
    注释:
    把上面的代码放入到自己的代码里(如果是窗体里则直接放,如果继承的控件,就放到控件的代码里)

    编译程序及运行后,大家就会看到每当鼠标停下来的时候都会引发一次MouseHover事件而会在输出窗口里输出当前时间的字符串,真在太高兴了。
    因为这也是个技术问题,只不过自己解决了,特来感谢原贴参与者并放分一次。
    ------------
    好希望能把这个加入FAQ!
    ---------------------------------------------------------------

    hehe ...
    lz好人
    ---------------------------------------------------------------

    收藏
    谢谢lz
    ---------------------------------------------------------------

    来了,恭喜楼主
    ---------------------------------------------------------------

    学习~恭喜~接分~



    ---------------------------------------------------------------

    呵呵,原来样这处理就可以了?
    ---------------------------------------------------------------

    等我研究一下ResetMouseEventArgs()
    ---------------------------------------------------------------

    感动ing~~~~~
    ---------------------------------------------------------------

    我看了一下源码,这个方法最终调用的本地方法_TrackMouseEvent

    但是它的flag设置为dwFlags = 3
    也就是说dwFlags = TME_HOVER + TME_LEAVE
    应该是把悬停和离开的事件都重置了,

    我的建议是自己调用_TrackMouseEvent方法只重置TME_HOVER,稍后给出源码。
    ---------------------------------------------------------------

    @_@
    ---------------------------------------------------------------

    强人,学习了..
    ---------------------------------------------------------------

    收藏一下..
    ---------------------------------------------------------------

    虽然可以实现,但闪得历害,不是我想要的效果

    我在 OnMouseHover 中显示 ToolTip,鼠标放在那不动,几乎每秒闪了两次。

    另外不明白要在 OnMouseHover 中加入 System.Console.WriteLine(DateTime.Now); 这句话是什么意思,应该无意义吧
    ---------------------------------------------------------------

    学习~恭喜~接分~
    ---------------------------------------------------------------

    进来了
    ---------------------------------------------------------------

    mark
    ---------------------------------------------------------------

    要分 也得先吃饭:)
    ---------------------------------------------------------------

    贴出源码


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            bool flag = false;
            public Form1()
            {
                InitializeComponent();
            }

            private bool MyTrackMouseEvent(IntPtr handle)
            {
                TRACKMOUSEEVENT tme = new TRACKMOUSEEVENT();
                tme.dwFlags = 1;  //注意这里,这里只重置了TME_HOVER
                tme.hwndTrack = handle;
                return _TrackMouseEvent(tme);
            }
            [DllImport("comctl32.dll", ExactSpelling = true)]
            private static extern bool _TrackMouseEvent(TRACKMOUSEEVENT tme);

            private void button1_MouseMove(object sender, MouseEventArgs e)
            {
                if (flag)
                {
                    MyTrackMouseEvent((sender as Control).Handle);
                    flag = !flag;
                }
            }

            private void button1_MouseHover(object sender, EventArgs e)
            {
                textBox1.AppendText(DateTime.Now.ToString()+"\n");
                flag = true;
            }
        }
        [StructLayout(LayoutKind.Sequential)]
        public class TRACKMOUSEEVENT
        {
            public int cbSize;
            public int dwFlags;
            public IntPtr hwndTrack;
            public int dwHoverTime;
            public TRACKMOUSEEVENT() {
                this.cbSize = Marshal.SizeOf(typeof(TRACKMOUSEEVENT));
                this.dwHoverTime = 400;
            }
        }
    }
    ---------------------------------------------------------------

    坚决收藏
    -------------------------------------

  • 评价: 有价值 给朵鲜花(3) 无价值 扔个鸡蛋(0)
相关FAQ
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo