关于支持不透明度的按钮实现的建议

时间:2012-02-20 17:25:30

标签: c# winforms button implementation opacity

我没有在C#中找到一种方法来创建一个支持不透明度的按钮 - 而不是仅仅在调用show方法时出现,以便能够将其慢慢淡入视图。

我创建了自己的按钮,我想知道您对实现的看法。

基本上,我创建了一个Windows窗体,它支持opacity属性并处理了有关将表单“添加”到另一个窗体的所有角落案例,具体为:   - 位置变更事件   - 所有者表格失去了焦点

表单由一个标签组成,该标签代表按钮的文本,而且都是。

表单构造函数获取标签的文本,按钮的所需大小和按钮的速度(基于枚举)出现。 在表单加载方法中,标签位于按钮的中间

当标签或表单本身点击时,会执行一个简单的图形,并将事件提交给抓住它的人。

我的代码:

  1. 创建了一个名为buttonForm的表单
  2. 构造

            InitializeComponent();
            this.Owner = owner;
            _buttonText = buttonText;
            _buttonSize = buttonSize;
            _usedSpeedOpacity = SelectSpeedOpacity(showSpeed);
    
  3. 一种说明点击命令的方法 - 当用户点击表单和标签本身时调用:

        this.Location = new Point(this.Location.X + 1, this.Location.Y);
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        Thread.Sleep(50);
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
        this.Location = new Point(this.Location.X - 1, this.Location.Y);
        if (Button_Clicked != null)
        {
            Button_Clicked();
        }
    
  4. 表单加载 - 将标签定位在控件等中间

        labelButtonText.Text = _buttonText;
        this.Size = _buttonSize;
        double remainning = this.Width - labelButtonText.Size.Width;
        Point labelNewLocation = new Point(
            (int)(remainning / 2),
            (int)(this.Height / 2 - this.Font.Height / 2));
        labelButtonText.Location = labelNewLocation;
    
  5. FadeShow(与FadeHide相同)

        int tempCounter = 0;
        Opacity = 0;
        Show();
        while (tempCounter <= 1000)
        {
            if (Opacity == 1.0)
            {
                break;
            }
            if (tempCounter % 10 == 0)
            {
                Opacity += _usedSpeedOpacity;
            }
            Refresh();
            tempCounter++;
        }
        this.Visible = true;
        this.BringToFront();
    
  6. 更新位置方法,以便在父窗体移动时调用此方法

        this.Location = new Point(
            this.Location.X - (ParentFormLocation.X - newLocation.X),
            this.Location.Y - (ParentFormLocation.Y - newLocation.Y));
        ParentFormLocation = newLocation;
    
  7. 我的button_click事件

  8. 提前致谢,

    盎司。

1 个答案:

答案 0 :(得分:0)

我做了一些与窗体相似的东西,改变了它的高度。我这样做的方法是在代码中实现一个计时器,这样每隔半秒就会改变不透明度。

虽然以下不是100%正确答案,但没有您的代码很难向您展示。

void timer_Tick(object sender, EventArgs e)
        {            
            if (btnName.Opacity < 100)
            {
                btnName.Opacity++;
                timer2.Stop();
                timer2.Interval = 5000;
                timer2.Start();
            } else {
                timer2.Stop();
           }
        }