【问题标题】:MouseMove sensibility鼠标移动灵敏度
【发布时间】:2011-01-30 13:15:45
【问题描述】:

我使用 MouseMove 事件来移动对象(比如标签)。

简单原理(示意图):

OnMouseMove(e MouseEventArgs)
    if e.Button == Left
        deltaX = e.X - lastX
        foreach label in labels
            label.Location.X += deltaX
        lastX = e.X

一旦标签数量增加,我开始看到标签沿着移动轨迹的痕迹。 我有 I I I II III II I I III II 之类的东西,但想有 I I I I I 之类的东西作为痕迹。我想知道鼠标什么时候“开始”和“停止移动”这样的事情。

我沿水平轴移动标签。 MouseDown(设置 LastX) 继续。没有人知道什么时候停止,只有鼠标移动的感觉。当然我可以使用MouseUp 知道移动何时结束,但是如果用户按住按钮并停止移动,我想反映最新的标签位置。

有没有办法防止这种痕迹?

试过

label.Visible = false
label.Location.X += deltaX
label.Visible = true

没有帮助。

parent.SuspendLayout 和 ResumeLayout 并没有太大帮助,因为我需要在每次鼠标移动时都这样做,所以任何效果。

【问题讨论】:

    标签: .net winforms controls mousemove


    【解决方案1】:

    编辑:我刚刚注意到您对鼠标何时停止的编辑。您可以使用计时器来帮助您。将一组设置为您想要更新位置的时间间隔,并在该时间间隔自动重置。在鼠标按下时启动它并在鼠标升起时停止。当计时器结束时,更新标签的位置。

    --上下文的原始答案:--

    是的,您可以在父控件上暂停绘图,移动标签,然后恢复绘图并刷新。

    来自this SO question:

    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);
    
    private const int WM_SETREDRAW = 11; 
    
    public static void SuspendDrawing(Control parent)
    {
        SendMessage(parent.Handle, WM_SETREDRAW, false, 0);
    }
    
    public static void ResumeDrawing(Control parent)
    {
        SendMessage(parent.Handle, WM_SETREDRAW, true, 0);
        parent.Refresh();
    }
    

    示例用法:

    private void OnMouseMove(MouseEventArgs e)
    {
        int deltaX = e.X - lastX;
        // Suspend drawing here
    
        foreach (Label label in labels)
        {
            label.Location.X += deltaX;
        }
    
        lastX = e.X;
        // Resume drawing here
    }
    

    编辑:如果你只想在差值大于n个像素的情况下显示位置的变化,那么你应该使用勾股定理来计算旧位置和新位置之间的距离并且只有当差值大于 n 时才移动它。当鼠标按钮出现时,将标签移动到它们应该根据鼠标的位置。

    伪代码:

    difference = Math.Sqrt(x * x, y * y);
    
    if (difference > n)  // n is whatever number you want
    {
         // move the labels
         // set the old position to the new position
    }
    

    【讨论】:

    • 嗯。问题是我经常移动标签。我有 I I I II III II I I III II 之类的东西,但希望有 I I I I I I I I 之类的东西作为痕迹。我想知道鼠标什么时候“开始”和“停止移动”这样的事情。我也可以制作 parent.Suspend/ResumeLayout() 但是......什么时候?
    • @serhio:我已经编辑了一个示例,说明如何使用 SuspendDrawing/ResumeDrawing。如果我理解正确,标签不会“一起”移动(您会看到它们单独移动)。这个解决方案会解决这个问题。
    • @Zach。是的。但是......问题是我想做而不是只做 10 个动作(比如从 1 到 20 个) 5. En gros,当移动“标签容器”时,我不需要看到标签移动,只开始最终,也许一个中间点就足够了。
    • 你是用鼠标向下移动它们(即拖动它们)还是只用鼠标移动?如果是这样:假设鼠标在鼠标向下时开始移动,并在鼠标向上时完成移动。
    • @Sameh Serag:使用 MouseDown。
    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多