怎样用VBvba 窗体显示图片载入三张图片,并且三张图片的位置不一样?

文档分类:
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,
下载前请先预览,预览内容跟原文是一样的,在线预览图片经过高度压缩,下载原文更清晰。
您的浏览器不支持进度条
下载文档到电脑,查找使用更方便
还剩?页未读,继续阅读
播放器加载中,请稍候...
该用户其他文档
下载所得到的文件列表vb 图形和绘图操作.doc
文档介绍:
图形和绘图操作坐标系统使用颜色使用绘图工具使用图形方法绘图坐标X值:是沿X轴点的位置,窗体中最左端是缺省位置0是沿X轴点的位置,窗体中最左端是缺省位置0是沿Y轴点的位置,窗体中最上端是缺省位置0Y值:是沿Y轴点的位置,窗体中最上端是缺省位置0X,Y的值可以小于的值可以小于0X,Y的值可以小于0,也可以大于容器宽度或高度相对于Form1(0,0)相对于Form1()相对于Frame1(0,0)坐标值的刻度缺省使用缇(缺省使用缇(Twip)为测量单位.)为测量单位.缇是打印机的一磅的1/20(1440缇等于一英寸;567缇缇等于一英寸;缇是打印机的一磅的(缇等于一英寸缇等于一厘米)这些测量值指示对象打印后的大小.等于一厘米).这些测量值指示对象打印后的大小.利用缇可以精确地控制图形打印输出的质量.利用缇可以精确地控制图形打印输出的质量.通过设置控件的ScaleMode属性,可以采用不同的刻属性,通过设置控件的属性度来表示坐标值ScaleMode属性属性ScaleMode属性,可以取以下常量值:属性,可以取以下常量值:属性vbUser:0,用户自定义.若直接设置了ScaleWidth,ScaleHeight,ScaleTop或ScaleLeft,则ScaleMode属性自动,,设为0vbTwips(缺省值):1,缇(缺省值),vbPoints:2,vbPoints:2,磅,72磅等于一英寸72磅等于一英寸vbPixels:3,像素.像素是监视器或打印机分辨率的最小单位,:,像素.像素是监视器或打印机分辨率的最小单位,每英寸里像素的数目由设备的分辨率决定vbCharacters:4,字符.打印时,一个字符有1/6英寸高,英寸高,:,字符.打印时,1/12英寸宽vbInchs:5,英寸:,vbMillimeters:6,毫米:,vbCentimeters:7,厘米:,颜色指定颜色有四种方式:指定颜色有四种方式:使用RGB函数,该函数有三个参数,分别取值0255;RGB函数1)使用RGB函数,该函数有三个参数,分别取值0-255;使用QBColor函数,该函数有一个参数,取值015,QBColor函数2)使用QBColor函数,该函数有一个参数,取值0-15,16种QuickBasic颜色中的一种颜色中的一种;16种MicrosoftQuickBasic颜色中的一种;使用内部描述颜色的常量,vbR3)使用内部描述颜色的常量,如vbR直接输入一种颜色值.4)直接输入一种颜色值.1)调色板颜色值:正常的RGB颜色的有效范围,是从0到调色板颜色值:正常的RGB颜色的有效范围,是从0RGB颜色的有效范围16,777,215(&HFFFFFF&)16,777,215(&HFFFFFF&).即可以用十六进制数按照下述语法来指定颜色:述语法来指定颜色:&HBBGGRR&2)系统颜色值:最高位设置为时,颜色值不再代表系统颜色值:最高位设置为1时颜色值不再代表RGB颜颜而是从Windows&控制面板&指定的系统环境范围颜控制面板&色,而是从控制面板这些数值对应的系统颜色范围是从&H到色.这些数值对应的系统颜色范围是从到&H..图形框,图像框,直线和形状控件图形框控件(图形框控件(PictureBox)用于显示图片和图像,)用于显示图片和图像,或作为其它控件的容器.或作为其它控件的容器.图像框控件(图像框控件(Image)也可以用于显示图片和图像,)也可以用于显示图片和图像,Image控件是轻量图形控件,需要较少的系统资源,控件是轻量图形控件,控件是轻量图形控件需要较少的系统资源,显示速度较快.显示速度较快.直线控件(Line)用于画线.直线控件(Line)用于画线.形状控件(Shape)用于构造简单的图形,形状控件(Shape)用于构造简单的图形,如:正方形,圆形,圆角正方形等.方形,圆形,圆角正方形等.PictureBox控件PictureBox控件此控件用于显示图像,此控件用于显示图像和作为其它控件的容器Picture属性指定显示图像属性,属性1.设计时在&属性窗口&中的Picture属性栏中,选择图片设计时在&属性窗口&中的Picture属性栏中,Picture属性栏中文件,就可将图片加载到PictureBox控件中;PictureBox控件中文件,就可将图片加载到PictureBox控件中;2.从其它应用程序中复制图形后把它粘贴到PictureBox控从其它应用程序中复制图形后把它粘贴到PictureBoxPictureBox控件中.件中.3.在程序中使用LoadPicture函数对Picture属性赋值,因在程序中使用LoadPicture函数对Picture属性赋值,LoadPicture函数对Picture属性赋值Picture属性是对象类型所以需要使用Set关键字,属性是对象类型,Set关键字为Picture属性是对象类型,所以需要使用Set关键字,如:SetPicture1.Picture=LoadPicture(&d:\map\中国中国.jpg&)中国SetPicture2.Picture=LoadPicture(&d:\map\美国美国.jpg&)美国SetPicture2.Picture=LoadPicture'清除图片PictureBox控件PictureBox控件AutoSize属性:使控件自动调节以适应图像大小属性:属性第一个图形框第一个图形框AutoSize属性为属性为False属性为第二个图形框AutoSize属性为属性为True第二个图形框属性为PictureBox控件PictureBox控件图形框有三组表示高和宽的属性,分别代表不同的含义:图形框有三组表示高和宽的属性,分别代表不同的含义:图形框控件的高和宽:同其它控件一样,PictureBox控件的图形框控件的高和宽:同其它控件一样,控件的Height和Width属性分别记录图形框控件所占空间的高度和宽属性分别记录图形框控件所占空间的高度和宽和属性度.图片的高和宽:图片可能小于或超过控件的范围,要取得图图片的高和宽:图片可能小于或超过控件的范围,片的真实大小,可以利用控件的Picture对象来获取,Picture对象来获取,片的真实大小,可以利用控件的对象来获取对象的Height和Width属性分别记录图片的高度和宽度,如属性分别记录图片的高度和宽度对象的和属性分别记录图片的高度和宽度,Picture1.Picture.Height可取得第一个图形框内图片的高度,可取得第一个图形框内图片的高度,可取得第一个图形框内图片的高度但要注意的是这两个属性的度量单位与控件的缺省度量单位不同.不同.图形框内部绘图区的高和宽:在VB中,PictureBox控件有两图形框内部绘图区的高和宽:中控件有两个特殊的属性:个特殊的属性:ScaleWidth和ScaleHeight,它们代表的是图和,形框内部区域的水平或垂直度量单位,形框内部区域的水平或垂直度量单1
内容来自淘豆网www.taodocs.com转载请标明出处.
文件大小:0 KB
下载次数:VB程序设计多重窗体与环境应用
我的图书馆
VB程序设计多重窗体与环境应用
10.1建立多重窗体应用程序
10.1.1& 建立多重窗体的语句和方法
[].Show []
Form1Form2Form3Form2Form1Form3
Form2Form3
(1) 1Form1Text1Text2
(2) 2Form2&&& (3) 3Form3
1Admin12345623
Private Sub Command1_Click()&&&&&&&&& &&&&&& '
& If Text1.Text = "Admin" And Text2.Text = "123456" Then
&&& &Form2.Show
&&& &Form3.Show
&&& Form1.Hide
Private Sub Command2_Click()&&&& &&&&&&&& '
Form2Form2Form1.
Private Sub Command1_Click()&&&&&&&&& &&&&&& '
& &Form1.Show
& &Unload Me
From3Form3Form3
Private Sub Form_Click()&& &&&&&&&&&&&&&&&&&&&& '
& Unload Me
10.1.3& 多重窗体程序的执行和存取
1.设置启动窗体
.vbp.frm.bas
10.2&& Visual Basic
Visual Basic3
10.2.1& 标准模块与窗体模块
1. 标准模块
lPublicDimPrivate
lVisual BasicSub Form_Load
10.2.2Sub Main过程
Visual BasicSub Main
lSub MainVisual Basic
(2) Sub Main
(3) Sub Main
lSub MainSub Main
Sub Main()
&&& Form1.show
Visual Basic
Visual Basic.vbp.bas.frm.cls
10.3 &&DoEvents
1. 闲置循环
2 . DoEvents
=DoEvents[()]
DoEventsVisual Basic
Private Sub Command1_Click()
& For I&=1 to
&&&& X=DoEvents
&&&& For j=1 to 1000
&&&& Next j
&&&&& Print I&
I&X=DoEvents
lDoEventsDoEvents
在Visual Basic应用程序设计中,只有单一窗体的应用程序往往不能满足需要,特别是较复杂的应用程序,都必须通过多重窗体(Multi-Form)来实现。在多重窗体程序中,每个窗体可以有自己的界面和程序代码,分别完成不同的功能。利用多重窗体,可以设计较复杂的多功能对话窗口,从而取代如InputBox或MsgBox这样的标准对话框。本讲介绍了Visual Basic多重窗体程序设计及其环境应用的有关内容。
1、在多窗体程序中,怎样在各个窗体之间切换?
2、多窗体程序与单窗体程序有什么区别?它们在执行时又有什么区别?
3、怎样保存和装入多窗体程序?怎样指定启动窗体?
4、Visual Basic程序由哪几类模块组成?在标准模块中用Dim语句定义的变量是否是全局变量?
5、什么是闲置循环?DoEvents语句有何作用?
6、设计一个“学校情况简介”程序,该程序由8个窗体构成,其中一个窗体为封面窗体,一个窗体为列表窗体,其余6个窗体分别用来显示学校6个部门或系的介绍内容。程序运行后,先显示封面窗体,接着显示列表窗体,在该窗体中列出所要查看的部门目录(6个),双击某个目录,在另一个窗体的文本框中显示该部门的简介内容(内容自拟),每一个部门用一个窗体显示。
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢VB中Image与PictureBox控件的一些使用技巧
图像框(Image)和图片框(PictureBox)都是用于显示图形,可以显示... ..gif等类型的文件.图片框不仅可以显示图像,还可以作为其他控件的容器,因此PictureBox控件比Image控件功能更强.
  一些属性:
  (1)Picture属性:用于设置在图像框与图片框重要显示的图像文件名.科在设计是通过属性或在运行时调用LoadPicture函数来设置.
Picture1.Picture=LoadPicture("D:\Pic\Girl.jpg")
  (2)Align属性
  Align属性用于设置图片框再窗体中的显示方式.0(默认)无特殊显示,1为与窗体一样宽,位于窗体顶端;2为与窗体一样宽,位于窗体底端;3为与窗体一样高, 位于窗体左端;4为与窗体一样高,位于窗体右端.
  (3)Image的Stretch属性
  Stretch属性用于确定图像框如何与图片相适合.True为图像将适应图像框的大小,False为图像框将适应图像的大小.
  (4)图片框的AutoSize属性
  AutoSize属性用于确定图片框如何与图像相适应.False为保持原始尺寸,当图形比图片框大时,超出的部分被截去,True为图片框根据图形大小自动调整,也就是说图片多大,图片框就变成多大.
  下面我就基于这两个控件介绍两个很简单的技巧:
  (一)如何实现对于过大图片的按比例缩小
  有的同学看到这里可能就会问缩小一副图片只要将Image的Stretch属性设为True不就行了吗.话随这样说,但是仔细想一下这样不可能实现将一副图片按照相同的比例缩小.因为图像框的大小不能保证和图片是成比例的.那么用什么方法解决这个问题呢?应该用Move方法解决.
  其实Move方法可以用在很多控件中,甚至数据库控件中也有它的身影.但我只介绍一下他在本问题里的应用.Move方法既可用于Image控件又可用于PictureBox控件中.他的用法为:
  对象.Move
Left,Top,Width,Hight
  其中"对像"为要使用的控件名,这里可以是Image1或PictureBox1."Left,Top"分别为对象左上角在所在容器的坐标,"Width,Hight"为对象的宽和高.现在知道了这个方法那么实现图片的按比例缩小就显得很简单了.我们可以将图片放于一个Image或者PictureBox中,然后用Move语句设置图片的位置,与缩小的比例.但还需要一个步骤,你还要求出图片的宽度与高度才能按照你规定的比例缩小.求图片的宽和高可用下面的语句: Image1.Picture.Width,
Image1.Picture.Height.可求出他们.现在大功告成了,图片可以缩小了.缩小时可用下面的语句:
 Image1.Move
,Val(Image1.Picture.Width)/3,Val(Image1.Picture.Height)/3
  '为图片的左上坐标.将图片缩小1/3.
  (二)如何实现图片的拖动
  上面的例子其实很简单,但假如你想不到Move的话就不那么好办了.下面的技巧同样很简单,但是要实现图片的拖动就不得不使用MouseDown, MouseUp,MouseMove三个事件.现在我们先分析一下图片拖动的过程.首先你要用鼠标拖动一副图时下按下了鼠标左键,这就触发了MouseDown事件.当你拖住鼠标并移动鼠标时就触发了MouseMove事件,拖动完毕放开左键时又触发了MouseUp事件.
  下面我先介绍一下这三个事件:
MouseUp和MouseDown用法一样
MouseDown(Button As Integer, Shift
As Integer, X As Single, Y As Single)
MouseUp(Button As Integer, Shift
As Integer, X As Single, Y As Single)
变量Button决定鼠标哪个键被按下.
1--鼠标左键按下
2--鼠标右键按下 4--鼠标中键按下
变量Shift提供鼠标键按下时SHIFT,Ctrl,Alt件组合的代码:
&  No key pressed&&&&&
Shift&&&&&&&&&&&&&&&&
  Shift+Ctrl&&&&&&&&&
Shift+Alt&&&&&&&&&&&&
  Alt&&&&&&&&&&&&&&&&
Alt+Ctrl&&&&&&&&&&&&&
  Ctrl&&&&&&&&&&&&&&&
Shift+Ctrl+Alt&&&&&&&
  X,Y:控件或窗体的当前位置坐标--MouseDown,MouseUp事件触发的水平和垂直位置.
  MouseMove
  MouseMove(Button As
Integer, Shift As Integer, X As Single, Y As
  Button,Shift参数与前面的相似,这里不再赘述.X,Y为MouseMove触发时鼠标的水平和垂直位置.下面用一段例程说明如何用这三个元素实现图片的拖动:
  Dim xp As
  Dim yp As
  Dim xz As
  Dim yx As
Private Sub
Image1_MouseDown(Button As Integer, Shift As Integer, X As Single,
Y As Single)
  Button =
  Image1.MousePointer =
Private Sub
Image1_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
  If xp && 0 And yp
    Image1.Left =
Image1.Left + (X - xp)
    Image1.Top =
Image1.Top + (Y - yp)
Image1.Left
Image1.Top
Private Sub Image1_MouseUp(Button
As Integer, Shift As Integer, X As Single, Y As
  Button =
  xp = yp =
  Image1.MousePointer =
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。vb.net的多窗体操作
  在微软Visual Basic 6.0 中,一条简单的 &Form2.Show& 语句就能显示项目中的第二窗体 (Form2)。然而,它在 Visaul Basic.NET 中却行不通了,因为 .NET 版在窗体处理机制上有了很大的变化。刚刚转向 .NET 版的 Visaul Basic程序员实在难以接受这么大的变化,因为现在连&显示第二窗体&这么简单的任务都无从下手。我希望能够通过本文向大家介绍 Visaul Basic .NET 与早期的 Visual Basic 在窗体处理机制上有哪些不同之处,以及如何按照 .NET 的模式进行多窗体。
  二、Visual Basic 6.0 对 Visual Basic .NET
  窗体(窗体类)正如其它类一样,无论在哪个版本的 Visual Basic 中都是必不可少的。窗体也有属性、方法和事件,且在同一个项目中也允许创建多个窗体实例 (参见 http://msdn.microsoft.com/library/en-us/off2000/html/defInstance.asp)。例如:假设你在 Visual Basic 6.0 项目中定义了一个窗体 Form2 ,则你可以创建它的 3 个实例并同时显示出来。代码如下:
Dim myFirstForm As Form2
Dim mySecondForm As Form2
Dim myThirdForm As Form2
Set myFirstForm = New Form2
Set mySecondForm = New Form2
Set myThirdForm = New Form2
myFirstForm.Show
mySecondForm.Show
myThirdForm.Show
  以上代码用 3 条 Set 语句生成了 3 个 Form2 实例。你可以把它原封不动地搬到 Visual Basic .NET 中运行,它照样能够正确显示 3 个 Form2 窗体。在这里,&Form2& 其实相当于一个普通的类。Visual Basic 6.0 允许代码直接访问尚未实例化的窗体类;然而Visual Basic .NET 却规定在访问任何类之前都要进行实例化,而且必须借助实例来访问类。这种变化当然有可能造成许多疑惑。Visual Basic 6.0 等早期版本能自动生成每个窗体的默认实例,从而允许直接通过窗体名称来访问窗体。例如:在Visual Basic 6.0项目中,可以直接用代码&Form2.Show &显示 Form2 的默认实例;然而在 Visual Basic .NET 中,这么做只会引发错误,因为 Visual Basic .NET 既不会创建默认的窗体实例,也不允许直接访问尚未实例化的窗体类。
  这就是 Visual Basic .NET 与早期 Visual Basic 在窗体处理机制上的关键区别&&你只有先创建窗体实例,然后才可以显示窗体外观、访问窗体属性及其控件。它们还有另一个区别:Visual Basic 6.0 项目自动创建的默认窗体实例都能被当成全局变量使用,也就是说,项目中的任何代码都能直接引用窗体,并且每次被引用的都是该窗体的同一个实例。例如:你可以在窗体中 button 控件的 Click 事件处理程序里用代码 &Form2.Show& 显示 Form2 窗体,然后用下列代码改变 Form2 中某个 textbox 控件 (TextBox1)的内容:
Form2.TextBox1.Text = &Fred&
  可是,你在 Visual Basic .NET 中运行它却会得到一条错误消息:&Reference to a Non-Shared Member Requires an Object Reference&(引用非共享类成员必须使用对象指针)。这是在提醒你:你正在访问的类尚未进行实例化。有一个简便的解决方案:当你在调试过程中得到上述错误消息时,就把相应的语句:
Form2.Show()
Dim myForm2 As New Form2()
myForm2.Show()
  此方案适用于大多数场合。然而,当项目中还有其它代码访问同一个 Form2 实例 (比如改变其中 TextBox1 的文本) 时,你可能会考虑把下列语句:
Form2.TextBox1.Text = &Fred&
Dim myForm2 As New Form2()
myForm2.TextBox1.Text = &Fred&
  不幸的是,这段代码创建了一个新的 Form2 实例,结果你所访问的窗体不再是原先的 Form2 ,这岂不麻烦了!更坏的是,你不会因此而得到任何错误消息提示,同时你先前调用 Show() 显示的 Form2 窗体也不会发生任何变化。
  三、升级向导如何解决它
  如果你用升级向导 (Upgrade Wizard) 把 Visual Basic 6.0 项目升级为 Visual Basic .NET 版,则它会在每个窗体中自动添加一段特殊代码,通过显式创建窗体实例来模拟早期 Visual Basic 版本中的默认实例化机制。此段代码被包裹于标号为 &Upgrade Support&的代码区块内,借助一个新增的 Shared 属性来生成当前窗体的实例:
Private Shared m_vb6FormDefInstance As Form1
Private Shared m_InitializingDefInstance As Boolean
Public Shared Property DefInstance() As Form1
If m_vb6FormDefInstance Is Nothing _
OrElse m_vb6FormDefInstance.IsDisposed Then
m_InitializingDefInstance = True
m_vb6FormDefInstance = New Form1()
m_InitializingDefInstance = False
DefInstance = m_vb6FormDefInstance
Set(ByVal Value As Form1)
m_vb6FormDefInstance = Value
End Property
  代码中的 DefInstance 是一个 Shared 属性,它能以 &窗体名.DefInstance& 的形式直接访问。它所在项目中的任何代码访问它都将得到同一个窗体实例。这样,你就能模拟 Visual Basic 6.0 项目对窗体的直接引用了,只不过在代码中以&Form2.DefInstance&代替&Form2& 而已。
  这时,你只需用 Form2.DefInstance.Show() 和Form2.DefInstance.TextBox1.Text = &Fred& 分别替换原先对 Form2 相应的直接引用就大功告成了。假如你不用升级向导,而是在 Visual Basic .NET 窗体中手工插入上述代码 (以及升级向导在窗体的 New过程中自动添加的代码),也行。当然了,你并不一定非要修改窗体代码,因为有一种编程模式可以在 .NET 项目中模拟默认窗体实例的创建。本文将用余下的篇幅来介绍这种编程模式。
  四、.NET 窗体之间的交互
  在 Visual Basic 6.0 等早期版本中,多个窗体之间的交互通常需要借助默认窗体实例来完成。下面我将结合某些具体的编程任务来讲解如何在 .NET 下实现多窗体交互,希望它能对你的开发任务有所帮助。
  1、保持窗体引用的全局性
  前面提到,进行 .NET 窗体编程时应该牢牢把握下列原则:在访问窗体之前,你必须进行窗体实例化;如果在项目中有多处代码访问同一窗体,则你必须把它的同一实例指针传递给这些代码。对于早已习惯了直接把默认窗体实例当成全局变量来使用的 Visual Basic 6.0 程序员来说,这可是个严重的挑战。好在 .NET 为你提供了两条出路:其一,把窗体实例指针保存在全局变量中;其二,把窗体实例指针传递给任何需要访问它的窗体、类、模块或者过程。
  2、.NET 中的数值全局化
  我以前曾经指出,Visual Basic .NET 不支持全局变量,现在我又要说,在 .NET 中可以在某种程度上实现数值全局化。这算不算此一时,彼一时?不,我不是那种人。Visual Basic .NET 确实不支持全局变量,然而它借助 Shared (相当于C# 中的 static) 变量却能模拟全局变量。事实上,前面介绍的 Visual Basic 升级向导自动添加到窗体代码中的 DefInstance 属性就是 Shared 类成员。无论容纳 DefInstance 属性的窗体类是否已经实例化,它都能被项目中的任何代码所引用。象这样的 Shared 属性不就相当于全局变量吗?因此,你可以创建这样的类:
Public Class myForms
Private Shared m_CustomerForm As CustomerForm
Public Shared Property CustomerForm() As CustomerForm
Return m_CustomerForm
Set(ByVal Value As CustomerForm)
m_CustomerForm = Value
End Property
  你需要在首次实例化一个窗体时,把该窗体的实例保存到一个类中:
Dim myNewCust As New CustomerForm()
myNewCust.Show()
myForms.CustomerForm = myNewCust
  这里的 CustomerForm 属性值就是你的窗体实例。于是,其它代码就能从项目的任何地方通过它来间接访问你的窗体了:
Module DoingStuffWithForms
Sub DoExcitingThings()
myForms.CustomerForm.Text = _
DateTime.Now().ToLongTimeString
End Module
  象这样把窗体实例保存为属性值就能按照你的要求模拟 Visual Basic 6.0 中的全局变量。如此模拟的&全局变量&其作用域比类域 (class scope) 高一个层次。所谓类域,是指变量仅仅在定义它的类(确切地说,应该包括模块、类或窗体)中有效。比类域还低一层次的是过程域 (procedure scope),即变量仅仅在定义它的例程中有效。
  3、窗体指针在项目中的传递
  除了把窗体实例全局化以外,你还可以把窗体类指针保存在变量中传递给需要访问该窗体的例程。假设你有一个窗体 Form1,并希望在点击 Form1 中某个按钮 (Button1) 时打开另第二窗体 Form2 ,然后在点击第二窗体 Form2 中的另一个按钮 (Button2) 时进行某项计算。你可以把整个代码都写在 Form1 中,即:
Public Class Form1
Inherits System.Windows.Forms.Form
Dim myForm2 As Form2
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
myForm2 = New Form2()
myForm2.Show()
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Calculations.CompoundInterestCalc(myForm2)
  无论是把窗体指针全局化,还是把它以参数的形式传递,都是可行的。然而,你必须根据项目的需要选择最佳方案。当 .NET 项目中只有少数几个过程需要访问特定窗体时,我建议你给这些过程增加一个参数,以在必要时接受窗体指针。当你的项目有太多过程需要访问该窗体时,你就应该考虑设置一个全局窗体指针变量。当然了,你最好还是考虑调整项目代码结构,使得真正访问该窗体的类或者过程只有一个。如果你希望用窗体来显示登录信息,则你可以先创建一个类,把窗体实例保存为它的 Shared 类成员,然后添加一个 Shared 方法 WriteToLogWindow 来完成实际的窗体访问。于是,项目中的任何代码只需调用此 WriteToLogWindow 方法就能间接访问显示登录信息的窗体了:
Public Class Log
Private Shared m_LogForm As Form2
Public Shared Property LogForm() As Form2
Return m_LogForm
Set(ByVal Value As Form2)
m_LogForm = Value
End Property
Public Shared Sub WriteToLogWindow(ByVal Message As String)
Dim sb As New _
StringBuilder(m_LogForm.txtLogInfo.Text)
sb.Append(Environment.NewLine)
sb.Append(Message)
m_LogForm.txtLogInfo.Text = sb.ToString()
  4、读取和改变窗体内的信息
  到现在为止,我们讨论的只是如何创建和访问窗体实例,而没有涉及如何读取或改变窗体内的信息。如果你的窗体已经按照前述方法实例化,并且访问窗体的代码都位于窗体所在的项目中,则你可以直接操作窗体中的任何控件来读取和改变窗体内的信息。但我觉得这样并不理想。与其直接访问窗体中的文本框、按钮等控件,还不如增加一个 Public 属性,通过它来控制窗体中的控件。如果你有意尝试这种特殊的窗体访问方式,请跟我来:
  (1)在 Visual Basic .NET 中新建一个 Windows 应用程序项目。 此时项目中已经自动生成了一个窗体 Form1 。
  (2)现在添加另一个窗体 Form2 :在&解决方案资源管理器&中按右键单击项目名称 -& &添加& -& &添加 Windows 窗体& -& 点击&打开&以接受默认名称 Form2.vb 。
  (3)在 Form1 中添加两个按钮,分别按照默认值命名为 Button1 和 Button2 ,并且调整它们在窗体中的位置以免重叠。
  (4)在 Form2 中添加一个简单文本框,按照默认值命名为 TextBox1。
  把下列代码添加到 Form2 的&End Class&前面 (在&解决方案资源管理器&中按右键单击 &Form2&-& &查看代码&,再粘贴下列代码):
Public Property CustomerName() As String
Return TextBox1.Text
Set(ByVal Value As String)
TextBox1.Text = Value
End Property
  接下来要做的是:
  a. 切换到 Form1 的代码,在 &Inherits System.Windows.Forms.Form& 后面增加一行:
Dim myForm2 As New Form2()
  b. 在 Form1 中双击Button1 按钮,在它的 Click 事件处理程序代码中输入下列代码:
myForm2.CustomerName = &Fred&
myForm2.Show()
  c. 在 Form1 中双击Button2 按钮,在它的 Click 事件处理程序代码中输入下列代码:
MessageBox.Show(myForm2.CustomerName)
myForm2.CustomerName = &Joe&
  d. 按 F5 运行项目,并点击窗体中的 Button1 和 Button2 按钮,以观察代码运行情况。
  表面看来,通过 CustomerName 属性来访问 Form2 与直接访问 Form2 非常相似。然而,这种间接的窗体访问方式能够带来很多好处,其中最重要的一点就在于它实现了更高的抽象性。换言之,哪怕你不知道 Form2 中控件的任何细节 (比如:窗体中是否包含 textbox 控件) ,也能与 Form2交换数据;你所要做的只是读取或设置 CustomerName 属性值而已。有了这种抽象,你就能在修改 Form2 的实现时不影响项目中的其它代码,因而大大简化了整个项目代码的维护。单从本文的例子来看,这种基于属性的窗体编程模式似乎并不比常规方式简单。然而,它以属性的形式隐藏了窗体的全部细节,故能用简洁、一致的代码来访问窗体。所以,它在一些相当复杂的用户界面编程中能够大显身手。总而言之,通过属性值来访问窗体及其控件的编程模式虽然不太直观,却对程序员很有价值:它不但比直接访问窗体的编程模式来得更专业,而且让整个项目的代码清晰易读。
  五、结论
  Visual Basic .NET 取消了早期版本中的&默认窗体实例&,却引起了不少 .NET 编程新手的困惑。Visual Basic .NET 规定,只有通过引用窗体实例,才能访问窗体的属性、方法及其控件。你所保存的窗体实例指针应该尽量让整个项目都能直接访问到它。Visual Basic .NET 的窗体处理机制已经变得更合理、更强大,可对于刚接触 .NET 的程序员来说,它的改进偏偏是造成许多困惑的根源。
我在VS2005下编写WINCE5.0的程序,使用中每个窗体都添加这样的操作代码:
1.添加静态变量
 Private Shared m_vb6FormDefInstance As Form3
&&& Private Shared m_InitializingDefInstance As Boolean
&&& Public Shared Property DefInstance() As Form3
&&&&&&& Get
&&&&&&&&&&& If m_vb6FormDefInstance Is Nothing Then
&&&&&&&&&&&&&&& m_InitializingDefInstance = True
&&&&&&&&&&&&&&& m_vb6FormDefInstance = New Form3()
&&&&&&&&&&&&&&& m_InitializingDefInstance = False
&&&&&&&&&&& End If
&&&&&&&&&&& DefInstance = m_vb6FormDefInstance
&&&&&&& End Get
&&&&&&& Set(ByVal Value As Form3)
&&&&&&&&&&& m_vb6FormDefInstance = Value
&&&&&&& End Set
&&& End Property
2.在new()中进行初始化
&&& Sub New()
&&&&&&& ' 此调用是 Windows 窗体设计器所必需的。
&&&&&&& InitializeComponent()
&&&&&&& ' 在 InitializeComponent() 调用之后添加任何初始化。
&&&&&&& DefInstance = Me
&&& End Sub
3.每次关闭时都对其进行处理
&&& Private Sub Form3_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
&&&&&&&&&& m_vb6FormDefInstance = Nothing
&&& End Sub
'===========================================================================
对于含有登陆窗体的多窗体程序设计;由于VB.net的限制性,可以采用如下模式实现多窗体:
首先建立一个模块,里面含有一个登陆成功标志和sub main()过程。(或者在主窗体中添加public shared sub main()过程)
public& LoginFlag as boolean=false
sub main()
dim frmLogin as new formLogin
frmLogin.showdialog()
if LoginFlag =true then
application.run(new FrmMain)
其次登陆窗体这样设计:
&在登陆按钮中:
&&&&&&& If (登陆验证成功) Then
&&&&&&&&&&& bResult = True
&&&&&&&&&&& Me.Close()
&&&&&&& Else
&&&&&&&&&&& MsgBox(&请输入正确的用户名和密码!&, , &提示&)
&&&&&&&&&&& txtUser.Focus()
&&&&&&&&&&& Exit Sub
&&&&&&& End If&
摘自& 执着于我的执着&

我要回帖

更多关于 窗体如何上传图片 的文章

 

随机推荐