Joe的自动重复按钮类的。net端口

介绍 这是我将Joseph M新来者的AutoRepeat按钮类移植到。net的尝试。我非常热情 因为我是乔的超级粉丝,所以我做了这件事 从来没有创建过自己的。net控件。这实际上是我的第一次尝试 这一点。 控制 重复按钮是一个你可以点击的按钮 保持点击,发生了一些事情。例如,,如果你有一个按钮 单击可将某个值增加1。然后,如果您保持单击按钮, 价值在不断变化。就好像你已经多次点击了这个按钮。 就像Joe的按钮自动重复类一样,我的控件也只处理 鼠标。如果你用键盘点击一个按钮(通过回车键), 然后重复的速率将是你的键盘。这个被忽略了 这个版本,可能是以后的一个特性。也许当乔更新他的课程时, 我也会更新我的。 该控件派生自System.Windows.Forms.Button 类,从而在其他方面充当按钮。它有两个新属性 虽然。初始延迟和重复延迟,这是用来 设置按钮开始自动重复和重复之前的初始延迟 每次重复之间的延迟。 使用控制 好吧,如果你像我一样把它编译成DLL,那么你可以把它添加成。net 控制。这意味着你可以把它放在你的工具箱里,就像 您可以添加任何其他控件。您可以获取按钮的属性并设置 初始延迟和重复延迟属性。你不能设置 小于100。所有单位都是毫秒。如果你想添加它通过 代码,然后您可以添加它,就像您将添加一个普通的按钮控件。 技术细节 就像乔在课堂上做的一样,我用计时器。我有一个私人的 定时器变量称为m_timer。我有两个 bool变量向下调用一次。然后 我还有两个私有变量用于初始延迟和重复延迟 属性。在构造函数中,我为MouseUp和添加了处理程序 MouseDown事件。我还将一个函数与我的计时器关联起来。通过 默认情况下,计时器是禁用的。 现在在我的MouseDown处理器中,我做了3的事情。我设置了 向下布尔变量为真。我将计时器间隔设置为 属性,然后我启用计时器。在我 我简单地禁用定时器,也使 假的。一开始我想我也得把鼠标抓起来。 因为用户可能会单击一个按钮,然后将鼠标拖出 按下按钮,然后释放它。在正常的win32编程中,你不会得到鼠标 消息,如果发生这种情况。但让我惊讶的是(詹姆斯·约翰逊已经证实了这一点)。 我半夜把他叫醒,让他确认。可怜的詹姆斯!)我 发现即使鼠标被拖出来后被释放,我们还是得到了 调用的MouseUp事件处理程序。我想是内部的框架 为我们做所有的捕捉工作。 在我的计时器函数中,我首先将计时器间隔更改为 RepeatDelay财产。现在我检查下变量 为true,这意味着鼠标按钮当前是向下的。如果它掉了, 我使用PerformClick()函数来模拟鼠标单击。我也 像Joe那样将once布尔变量设置为true 在他的类中,Joe实际上维护的不是布尔变量,而是一个 计数重复完成的次数。我也重写了 OnClick功能。我调用基类 为真,或者一旦变量为假, 因为这表明重复没有按照可能发生的那样进行 快速点击鼠标。如果我不做一次检查,我们总是 以避免的额外重复结束。 完整的源列表收缩,复制Code

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Windows.Forms;

namespace RepeatButton
{    
    public class RepeatButton : System.Windows.Forms.Button
    {
        private Timer m_timer;
        private bool down=false;
        private bool once=false;
        private int m_initdelay=1000;
        private int m_repdelay=400;

        public RepeatButton()
        {
            this.MouseUp += 
                new MouseEventHandler(RepeatButton_MouseUp);
            this.MouseDown += 
                new MouseEventHandler(RepeatButton_MouseDown);

            m_timer = new Timer();            
            m_timer.Tick += new EventHandler(timerproc);
            m_timer.Enabled=false;
        }

        private void timerproc(object o1, EventArgs e1)
        {                
            m_timer.Interval = m_repdelay;
            if(down)
            {
                once=true;
                this.PerformClick();
            }
                
        }

        protected override void OnClick(EventArgs e)
        {
            if(!once || down)
                base.OnClick(e);
        }

        

        private void RepeatButton_MouseDown(object sender, 
            System.Windows.Forms.MouseEventArgs e)
        {
            m_timer.Interval=m_initdelay;
            m_timer.Enabled=true;
            down=true;
        }

        private void RepeatButton_MouseUp(object sender, 
            System.Windows.Forms.MouseEventArgs e)
        {
            m_timer.Enabled=false;
            down=false;
        }

        public int InitialDelay
        {
            get
            {
                return m_initdelay;
            }
            set
            {
                m_initdelay = value;
                if(m_initdelay<100)
                    m_initdelay=100;
            }
        }

        public int RepeatDelay
        {
            get
            {
                return m_repdelay;
            }
            set
            {                
                m_repdelay = value; 
                if(m_repdelay<100)
                    m_repdelay=100;
            }
        }    

    }
}

结论 您可以将此控件构建为一个类库,这样使用起来更容易 因为您可以使用表单设计器简单地将其拖放到表单中 你也可以使用VS.NET属性窗口设置属性。但如果你不这样做 如果想这样做,您还可以在项目中手动包含该类 将控件添加到窗体中。 本文转载于:http://www.diyabc.com/frontweb/news801.html

你可能感兴趣的:(Joe的自动重复按钮类的。net端口)