如何混合表单字段和图形?



我正在尝试使用在

提供的圆形进度条解决方案Visual basic圆形进度条

然而,我得到了很多错误信息,当我试图将它纳入一个Windows窗体,有文本框条目(与系统有关)。EventArgs与PaintEventArgs和MyBase。

我试过"混合";两个句柄如下:

Private Sub LoginForm1_Load(ByVal sender As System)。对象,即系统。(如PaintEventArgs)处理MyBase。负载,我。油漆

,但这当然失败了。谁能告诉我有什么别的选择吗?由于

你把很容易的事情弄得很困难。所有绘图都在Paint事件处理程序或从Paint事件处理程序调用的方法中完成。这就是绘画的全部内容。你们已经知道怎么做了因为你们已经有了另一道题的代码。使用代码。

如果绘图的代码需要从其他地方获取数据来知道要画什么,那么就这样做。使用一个或多个字段的值来完成其工作的方法并没有什么神奇之处。该字段中的数据可以通过任何其他方法放置在那里,例如表单的Load事件处理程序,TextBoxTextChanged事件处理程序或ButtonClick事件处理程序。

下面是一个简单的例子,将绘制TextBox中的任何内容作为用户类型:

Private textToDraw As String
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.Text
textToDraw = TextBox1.Text
'Force a Paint event to be raised.
Invalidate()
End Sub
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
e.Graphics.DrawString(textToDraw, Font, Brushes.Black, PointF.Empty)
End Sub

将数据放在可以访问的地方,引发Paint事件,进行绘图。简单!

需要注意的主要一点是,调用Invalidate而不带参数将导致它所调用的整个控件(在本例中是窗体)被重新绘制,如果可能的话应该避免。您应该计算并指定可能已经或可能已经更改的最小区域,并在调用Invalidate时传递该区域。这样,控件中肯定没有改变的部分就不会被重新绘制,从而加快了过程。你每次都画出所有的东西,但是在屏幕上重新绘制像素是操作的缓慢部分,因此应该最小化。

最新更新