1

我的表单中有 2 个按钮。两者都有背景图像,平面样式为“平面”。

  1. 单击TAB键时,当焦点位于按钮上时,我会看到内部的纯色矩形,而不是纯色边框,我希望在按钮中有虚线边框。

  2. 单击按钮时,某些活动正在进行并且按钮被禁用。禁用时,按钮文本颜色变为灰色。我不希望它改变文本颜色。我相信这是Windows标准行为,但是选择按钮时如何不更改文本颜色?

我找不到任何属性来设置这些点。我应该怎么做才能实现目标。非常感谢任何帮助。

我还创建了一个自定义按钮,但无法摆脱上述问题。

我的自定义按钮的绘制方法:

   public partial class MyButton : Button  {

    protected override void OnPaint(PaintEventArgs pevent)
    {
        base.OnPaint(pevent);
        // Set custom fore color    
        base.ForeColor = Color.FromArgb(0, 255, 254, 255);    

        // set the same forecolor even if the button is disabled  
        if (base.Enabled == false)
        {
            base.ForeColor = Color.FromArgb(0, 255, 254, 255);
        }

    }  //OnPaint method ends
  }  // class ends

(1) 和 (2) 的更新解决方案在 onpaint() 中添加了以下内容:

    private void init()
    {
        base.ForeColor = Color.FromArgb(0, 255, 254, 255);
        base.FlatAppearance.BorderColor = Color.FromArgb(0, 255, 255, 254);   // Transparent border
    }

    protected override void OnPaint(PaintEventArgs pevent)
    {
        base.OnPaint(pevent);

        if (base.ContainsFocus)
        {
            // Draw inner dotted rectangle when button is on focus
            Pen pen = new Pen(Color.Gray, 3);
            Point p = base.Location;
            pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            Rectangle rectangle = new Rectangle(4, 4, Size.Width - 8, Size.Height - 8);
            ControlPaint.DrawFocusRectangle(pevent.Graphics, rectangle);
        }

        // Draw the string to screen
        SizeF sf = pevent.Graphics.MeasureString(displayText, this.Font, this.Width);
        Point ThePoint = new Point();
        ThePoint.X = (int)((this.Width / 2) - (sf.Width / 2));
        ThePoint.Y = (int)((this.Height / 2) - (sf.Height / 2));
        //pevent.Graphics.DrawString(displayText, Font, new SolidBrush(this.ForeColor), ThePoint);
        //pevent.Graphics.DrawString(displayText, Font, new SolidBrush(Color.FromArgb(0, 255, 254, 255)), ThePoint);
        pevent.Graphics.DrawString(displayText, Font, new SolidBrush(Color.Black), ThePoint);
        //this.Text = "";
     }//OnPaint ends

    // Avoids the inner solid rectangle shown on focus
    protected override bool ShowFocusCues
    {
        get
        {
            return false;
        }
    }

这成功地在我的按钮中绘制了一条虚线,指示焦点。为了摆脱默认的实线,我重写了 ShowFocusCues()。

这帮助我完全解决了 1。但是对于第 2 点,没有得到 100% 的结果。我在 MyButton 类中创建了一个属性“displayText”。在 OnPaint() 中,如果我将 ForeColor、Color.FromARGB 给 SolidBrush,它不会显示任何文本。但是如果我通过 Color.Black,那么它会接受它并以黑色显示文本。为什么它不接受前景色或自定义颜色而只接受默认颜色?对于这个简单的任务,我在哪里仍然出错。我通过在表单中​​实现 button_paint 进行了同样的尝试,但我看到了相同的结果。

知道我哪里还有错吗???

4

1 回答 1

1
     private void button3_Paint(object sender, PaintEventArgs e)
            {

                SolidBrush br = new SolidBrush(Color.Blue);
                Pen pen = new Pen(br);
                pen.Width = 3;
                pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
                  // to draw left border
                e.Graphics.DrawLine(pen, new Point(0, 0), new Point(0, this.button3.Width));
                SolidBrush drawBrush = new SolidBrush(ForeColor); //Use the ForeColor property
                // Draw string to screen.
                e.Graphics.DrawString("Sample", Font, drawBrush, 5f, 3f);
                this.button3.Text = "";
    }
于 2012-05-02T09:15:24.100 回答