1.NET精简框中访问图形对象的方法
在显示屏上绘图,.NET精简框程序必须拥有Graphics类的一个实例。对.NET精简框类的研究发现,有两种方法可以访问Graphics对象[3]:一种方法是调Paint事件,通过Paint事件中提供的PaintEventArgs参数的属性访问Graphics对象。它由系统发出,主要处理窗体中的绘图,并通知一个窗体其内容需要重绘;另一种方法是调用CreateCraphics函数,利用调用返回的Graphics对象绘图。虽然CreateGraphics方法名称表示创建了一个Graphics对象,但事实上并非如此。它只是向窗体″租用″了Graphics对象,完成调用Graphics对象后必须调用Dispose方法返回对象。
2 WinCE操作系统下基于VB.NET的窗体背景界面实现方法
在桌面系统中为窗体设计一个漂亮的界面,可以直接加入PictureBox控件,再将其属性中的Image项修改为需要的图片。采用这种方法,程序启动时,图片就显示在背景窗体上,但读取一幅图片,需要消耗大量的内存空间。基于VB.NET的界面程序,启动时本身需求的内存空间就非常可观,如果背景图片所需内存空间过大,可能会导致程序挂起。另外,考虑嵌入式系统频率低、内存少的自身特性,编写好的应用程序,应尽量节省内存空间。制作背景时,我们采用的方法是调用绘图函数。
绘制窗体背景通常有两种方法。一种是使用窗体事件Form_Paint;另一种是使用重绘事件Onpaint。它们都提供PaintEventArgs参数,利用该参数的属性访问Graphics对象,编写绘图代码可以绘制窗体背景。由于这两个Paint事件都是由系统发出的,当窗体创建、隐藏、放大或缩小时,它们都会自动调用Paint函数中的代码重绘。值得注意的是:绘制窗体背景时,不能调用事件Form_Load。调用Form_Load事件绘制的窗体背景在窗体中一闪而过,不能长时间停留,达不到显示的效果。
OnPaint函数定义格式为Protected Overrides Sub OnPain(tByVal e As PaintEventArgs)。Form_paint函数定义格式为Private Sub Form_Pain(tByVal sender As Object,ByVal e As System.Windows.Forms.PaintEventArgs)HandlesMyBase.Paint。利用e参数的属性访问Graphics对象,可以绘制线条、多边形和各式文字。采用这种方法绘制的窗体背景所占用的内存空间比读取整幅图片时少得多,正好符合嵌入式系统内存少的特点。
3多个背景的窗体无效后重绘先前背景的实现方法
显示屏是多任务、多线程操作系统WinCE的共享资源。为了避免程序间的冲突,同一时间系统只允许向显示屏发出的一个Paint绘图事件。创建、隐藏、滚动、放大或缩小窗体和打开新文件都会使原来的窗体无效。窗体无效后,系统自动调用Paint函数重绘窗体背景。但对于多个背景的窗体,窗体无效后,如何使Paint函数重绘无效前的背景是我们要解决的问题。
我们通过在OnPaint函数中设置旗帜变量实现了窗体无效后重绘先前背景功能。方法如下:
(1)创建一个图形对象。定义格式如下:Dim gp As
Graphics=CreateGraphics();
(2)在主窗体中定义一个旗帜变量。根据不同情况设置特定枚举值;
(3)使用条件语句判断绘图代码。符合哪个枚举值,就绘制相应的背景。
下面举例说明具体的实现方法。图1是一个窗体结构示意图。其中虚箭头表示绘制窗体背景事件,实箭头表示窗体无效事件。窗体无效后,绘制哪一个背景图是我们要解决的问题。三个虚箭头分别表示绘制声音录制、波形显示和频谱显示的背景图。我们在主窗体中设定一个flag变量,标识主窗体无效前的背景图片。录制声音时,flag的值置1;显示波形时,flag的值置2;显示频谱时,flag的值置3。当主窗体调用打开保存文件、输入信息或显示结果事件后,主窗体无效。这时系统将自动调用OnPaint函数,OnPaint函数根据flag的值,绘制窗体无效前的相应背景。
4结束语
随着嵌入式系统应用领域的不断扩大,嵌入式系统开发需要考虑图形用户界面问题。我们在WinCE系统上开发语音频谱分析仪时,需要处理大量的图形绘制问题。根据我们的实践经验,总结出了一些实现图形用户界面的方法。通过调用paint函数绘制窗体背景,有效地节省了内存空间;通过在OnPaint函数中设置旗帜变量实现了窗体无效后重绘先前背景的功能。
原文链接:https://www.f2er.com/vb/263188.html