在Windows窗体控件中,聚焦属性始终为true

时间:2013-04-24 09:20:00

标签: c# .net winforms focus gdi+

我目前正在开发一个Windows窗体控件库,作为其中的一部分,我正在编写一个自定义按钮控件。它与标准的Button控件非常相似,但它在呈现方式上确实存在一些差异。话虽如此,下面的代码并不是我想要实现的完整代表,但它确实说明了我想要做的事。

以下是代码示例:

public class Button : System.Windows.Forms.ButtonBase, IButtonControl
{
    public Button()
    {
        base.SetStyle(ControlStyles.UserPaint, true);
        base.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        base.SetStyle(ControlStyles.ResizeRedraw, true);
        base.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        using (Bitmap bitmap = new Bitmap(this.ClientRectangle.Width, 
                                          this.ClientRectangle.Height, 
                                          PixelFormat.Format32bppArgb))
        {
            using(Graphics graphics = Graphics.FromImage(bitmap))
            {
                ButtonRenderer.DrawButton(graphics, 
                                          this.ClientRectangle, 
                                          this.Text, 
                                          this.Font, 
                                          TextFormatFlags.HorizontalCenter 
                                            | TextFormatFlags.VerticalCenter, 
                                          this.Focused, 
                                          this.GetButtonState());
            }
            e.Graphics.DrawImageUnscaled(bitmap, this.ClientRectangle);
        }
    }   
}

这很好用,并且适当地渲染按钮,但是,按钮上总是有一个聚焦的矩形,即使窗体上的其他对象应该接收焦点(从而从自定义按钮中移除焦点),它仍然是用焦点矩形绘制。

这有什么理由吗?为什么控制不会失去焦点?

1 个答案:

答案 0 :(得分:1)

试试这个

public Button()
    {
        base.SetStyle(ControlStyles.UserPaint, true);
        base.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        base.SetStyle(ControlStyles.ResizeRedraw, true);
        base.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        base.SetStyle(ControlStyles.Selectable, false);

    }   

它删除了控件的焦点矩形。