gpt4 book ai didi

c# - 绘制矩形时出现这种奇怪异常的原因是什么?如何确定?

转载 作者:行者123 更新时间:2023-12-01 22:32:44 31 4
gpt4 key购买 nike

我正在尝试在自定义控件的 OnPaint 方法中绘制一个矩形。并不是我不知道如何做,只是这次我试图正确地完成它(而不是每次调用 OnPaint 时都创建一个新的 Pen)。

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);
}
}
}

...但是,我遇到了很多异常,我相信这是因为当我期望设置某些值时没有设置它们。但我不知道还能在哪里设置这些值。

Details exceptions thrown

我将在这里进行一次大胆的尝试,并假设抛出这些异常是因为这些对象的值是在构造函数中设置的,但是,我不知道还能在哪里设置这些异常值(value)观。从我在 MSDN 上看到的内容来看,我认为我将值设置在正确的位置。


CustomEndCap 异常:

'formBorderPen.CustomEndCap' threw an exception of type 'System.ArgumentException'

CustomStartCap 异常:

'formBorderPen.CustomStartCap' threw an exception of type 'System.ArgumentException'

DashPattern 异常:

'formBorderPen.DashPattern' threw an exception of type 'System.OutOfMemoryException'

我不明白的是,为什么我会遇到这些异常?我什至没有玩过 Caps 或 DashPatterns。为什么当我手动设置笔和画笔时它们是空的?


最佳答案

对于 FormBorderThickness,您的笔大小可能为零,这将导致您遇到的一些问题。

此外,如果您引用“宽度”或“高度”等属性,则不应使用表单的构造函数,因为这些尺寸尚未完全确定。您应该为此使用 OnLoad 重写。

我个人会创建这些笔并在 Paint 事件中处理它们,将它们保留在本地范围内。那个矩形也是一样。

关于c# - 绘制矩形时出现这种奇怪异常的原因是什么?如何确定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31593842/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com