我想绘制矩形。它的宽度和高度来自串口。我想在获取数据时刷新页面以进行重新绘制。我的代码在这里;
public partial class Form1 : Form
{
string RxString;
static int x = 1;
SerialPort serialPort1 = new SerialPort();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.PortName = "COM3";
serialPort1.BaudRate = 9600;
serialPort1.Open();
RxString = serialPort1.ReadLine();
x = Convert.ToInt32(RxString);
Graphics g = this.CreateGraphics();
Pen pen = new Pen(Color.Black, 2);
g.DrawRectangle(pen, 100, 100, x, x);
}
但是在(x = Convert.ToInt32(RxString);)
的行上有一个错误mscorlib.dll
中出现'System.FormatException'类型的第一次机会异常我该怎么办?之后如何刷新重绘图像的表单页面?
答案 0 :(得分:0)
由于您的代码示例尚未完成,并且您没有说明失败的字符串值是什么,因此我无法回答有关您的例外的问题。但是,我可以告诉你如何正确处理这幅画。
您需要在班级中维护数据,以跟踪您想要绘制的内容。然后,您重写OnPaint()
方法(因为在这里,您正在尝试声明类本身的对象...在其他情况下,您可能需要处理其他对象的Paint
事件)根据您获得的数据绘制的地方。
如果数据发生变化,请致电Invalidate()
表示需要重新绘制。
例如:
public partial class Form1 : Form
{
string RxString;
int x = 1;
SerialPort serialPort1 = new SerialPort();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.PortName = "COM3";
serialPort1.BaudRate = 9600;
serialPort1.Open();
// The next three lines of code, you'll do wherever you want
// to receive data and update the displayed graphics. Naturally,
// the call to serialPort1.ReadLine() might vary, depending on
// how you are managing the I/O on the serial port.
RxString = serialPort1.ReadLine();
x = Convert.ToInt32(RxString);
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawRectangle(Pens.Black, 100, 100, x, x);
}
}
我对您的代码进行了一些其他更改以改进它:
x
成员不应该是静态的,因为代码的其余部分也不是静态的,所以理论上你可以拥有这个表单的多个实例,所有实例都试图使用相同的x
在同一时间。Pens.Black
对象,而不是自己创建一个。另请注意,您的原始代码无法处置它创建的Graphics
实例,这是一个严重的错误。它在上面变得毫无意义,因为你实际上并不需要创建一个Graphics
实例。你只是画到传给你的那个(并且不要处理它......它是来电者的对象,不是你的对象)。