我试图在自定义控件的OnPaint方法中绘制一个Rectangle。并不是我不知道如何,这只是我这次尝试正确地做到了(而不是每次调用OnPaint时创建一个新的Pen)。 / p>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SomeNamespace
{
public partial class Window : Form
{
#region Designer Properties
[Browsable(true), DisplayName("FormBorderColor"), Category("Appearance")]
public Color FormBorderColor { get; set; }
[Browsable(true), DisplayName("FormBorderThickness"), Category("Appearance")]
public float FormBorderThickness { get; set; }
#endregion
private Pen formBorderPen;
private Brush formBorderBrush;
private Rectangle formBorderRectangle;
public Window()
{
InitializeComponent();
this.DoubleBuffered = true;
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.ContainerControl, true);
this.SetStyle(ControlStyles.Selectable, true);
// Initialize Border properties
formBorderBrush = new SolidBrush(FormBorderColor);
formBorderPen = new Pen(formBorderBrush, FormBorderThickness);
formBorderRectangle = new Rectangle(0, 0, this.Width - (int)FormBorderThickness, this.Height - (int)FormBorderThickness);
}
protected override void OnPaint(PaintEventArgs paint)
{
switch(this.FormBorderStyle)
{
// If this FormBorderStyle is set to None, we can either
// draw our own custom border, or no border at all.
case FormBorderStyle.None:
// Draw Form Border if necessary.
Console.WriteLine(FormBorderColor);
Console.WriteLine(FormBorderThickness);
Console.WriteLine(formBorderBrush);
Console.WriteLine(formBorderPen);
Console.WriteLine(formBorderRectangle);
if(FormBorderThickness >= 1)
{
Console.WriteLine("Hooray?");
paint.Graphics.DrawRectangle(formBorderPen, formBorderRectangle);
}
else
{
Console.WriteLine("Can't draw border.");
}
break;
default:
break;
}
base.OnPaint(paint);
}
}
}
...但是,我得到了一堆例外,我相信它是因为当我期待它们被设置时,某些值没有被设置。但我不知道在哪里设定价值观。
我将在黑暗中进行狂野刺杀,并假设这些异常被抛出,因为这些对象的值是在构造函数中设置的,但是,我不知道在哪里否则设置这些值。根据我在MSDN上看到的内容,我认为我正在将值设置在正确的位置。
<小时/> CustomEndCap例外:
&#39; formBorderPen.CustomEndCap&#39;抛出了类型的例外 &#39; System.ArgumentException&#39;
CustomStartCap异常:
&#39; formBorderPen.CustomStartCap&#39;抛出了类型的例外 &#39; System.ArgumentException&#39;
DashPattern异常:
&#39; formBorderPen.DashPattern&#39;抛出了类型的例外 &#39;的System.OutOfMemoryException&#39;
我不明白的是,为什么我会这些例外?我甚至没有玩过Caps或DashPatterns。当我手动设置时,为什么Pen和Brushes是空的?
答案 0 :(得分:2)
FormBorderThickness的笔大小可能为零,这会导致您遇到的一些问题。
此外,如果引用“宽度”或“高度”等属性,则不应使用窗体的构造函数,因为尚未完全确定这些尺寸。您应该使用OnLoad覆盖。
我个人只是创建那些笔并在Paint事件中处理它们,将它们保持在本地范围内。那个矩形也一样。
答案 1 :(得分:1)
你说对象的值是空的,但你做的Console.WriteLine
表明他们确实有值。
并且您显示的例外在您的应用程序中似乎不是例外。这些例外是在visual studio inspector中...因为它试图显示对象的所有成员的值。某些成员可能尚未初始化或处于无效状态,因此visual studio遇到异常。但是,由于您没有使用这些属性,因此对您的应用程序没有任何影响。