【发布时间】:2013-04-24 09:19:59
【问题描述】:
我目前正在开发一个 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);
}
}
}
这可以正常工作,并且可以适当地呈现按钮,但是,按钮上总是有一个焦点矩形,即使表单上的其他对象应该接收焦点(从而从自定义按钮中移除焦点),它仍然是用焦点矩形绘制。
这是有原因的吗?为什么控件没有失去焦点?
【问题讨论】:
-
我更新了我的答案.. 试试看。
-
当它处于不应该被聚焦的状态时,如果你调整包含窗口的大小会发生什么?焦点矩形是否消失?如果是这样,当焦点状态发生变化时,您会遇到不重绘的问题。
-
提供的代码没有重现,它可以很好地绘制焦点矩形,并在按钮没有焦点时省略它。也许它真的确实有焦点,Control.Focused 属性永远不会说谎。
标签: c# .net winforms focus gdi+