精华内容
下载资源
问答
  • Java目录监视源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。...
  • VB 窗体设计及应用

    2014-05-08 23:39:22
     掌握窗体设计 100 u   掌握多重窗体的设计与应用 u   掌握响应鼠标与键盘事件 上机运行了局如下:画直线,在鼠标被按下的位置画一个端点,在鼠标松开的位置画另一个端点。   重点:窗体及...

     

    进修目标:

    u      掌握窗体设计

    100

    u      掌握多重窗体的设计与应用

    u      掌握响应鼠标与键盘事件

    上机运行了局如下:画直线,在鼠标被按下的位置画一个端点,在鼠标松开的位置画另一个端点。

     

    重点:窗体及常用控件的基本属性、事件和方法

    难点:鼠标事件和键盘事件

     

    Private Sub Form_Activate()

    窗体是一种对象,是所有控件的容器。由属性定义其外观,由方法定义其行为,由事件定义其与用户的交互。

    End Sub

    [注意]:(1)窗体中只能有一个按钮设置为撤消按钮(值为True)。

           设置窗体内部容器可用区域左上角的坐标,缺省值为(0,0

    .Name属性:即“名称”属性

           在工程中添加的第一个窗体,其Name属性缺省值为Form1,添加的第二个窗体,其Name属性缺省值为Form2……

           也可给Name属性设置一个有实际意义的名称。

     

        设置窗体的标题,即窗体标题栏中显示的文本,其缺省值为Name属性值

     

        设置窗体轮廓的显示方法,0-平面,1-立体(缺省)。

    .AutoRedraw属性

     

    CurrentX = X

        设置窗体的边界样式。见表3-1(P.45)

    .BackColor和ForeColor

        BackColor决定窗体的布景颜色,缺省时为系统颜色中的按钮轮廓颜色。

        ForeColor决定窗体的前景颜色,即窗体中文本和图形的颜色。缺省时为系统颜色中的按钮文本颜色。

    End If

    设置是否能吸收多行文本,缺省值为False,表示只允许输入单行文本。若设置为True时,可自动换行和回车换行。

    .ControlBox

        设置窗体的左上角是否安排控制框。True:有控制框,False:无控制框

    3)该撤消按钮的功能是:使用户可以撤消还未确认的改变,并把窗体恢复到先前状况。

        设置激和或屏蔽窗体。True:缺省值,允许窗体对事件作出反应,False:该窗体不再对任何事件作出反应。

    .Visible

     

    5.5.2  Tab挨次

    Fontname: 设置字体的类型

    Fontsize: 设置字体的大小

    文本框常用的事件有:Click , DblClick , GotFocus , LostFocus , Change等事件。

    FontItalic: 设置斜体

    FontStrikethru: 设置比划体(删除线)

     

    【注意】上述与字体有关的属性如何设置?

    Ø界面设计时,在属性窗口中找到Font属性来设置;

    Ø代码设计时,才划分援用这些属性名来进行设置。

    .Height和Width

    Case 6

    .KeyPreview

        决定是窗体还是具有焦点的控件响应键盘事件。

        False: 默认值,只有窗体具有焦点时才引发键盘事件;True:由窗体响应键盘事件。

    5.8.2 基本事件

        设置窗体左边沿和上边沿的坐标。

    MaxButton和MinButton

        设置窗体右上边是否有最大/最小按钮

    .Picture

        设置窗体中要显示的图形,设置时只需指明图片所在位置及文件名即可。如果界面设计时设置了Picture属性,图片被保存起来并与窗体同时加载。

    .ScaleHeight和ScaleWidth

           设置窗体内部容器可用区域的高度和宽度。

            其他窗体要载入内存,必需通过Load语句或Show方法一个个地载入。

    运行了局:当Form1被加载时,通过使用AddItem方法,将七个列表项添加到列表框List1MsgBox函数的功能是在屏幕上显示消息。

    End Sub

        设置窗体的状况,有三个值:0(缺省值)- 一般;1-最小化;2-最大化

    .CurrentX

        设置在窗体上输出文本或图形时的起始X坐标。

    .CurrentY

    .Fontname、Fontsize、FontBold、FontItalic、FontStrikethru和FontUnderline

    设置哪一个命令按钮为窗体的缺省按钮(设置为True

    5.2 窗体常见事件

    5.2.1 鼠标事件

    1 概述

           与窗体相关的鼠标事件有五个:ClickDblClickMouseDownMouseUpMouseMove

     

    1                   Private Sub Form_Load()

     

    If Button = 2 Then Print "你按下了右键"

    0

             一组单选按钮中,最多只有一个按钮的value值为True

    l         ListIndex属性

    Select Case Shifttest

    .MouseUp事件:释放任意鼠标按钮时产生。

     

     

    它们之间的联系和区别:

    单击鼠标,按挨次引发的事件过程为:MouseDown MouseUp Click

    l         PassWordChar属性

    双击鼠标,按挨次引发的事件过程为:MouseDown MouseUp ClickDblClickMouseUp

    双击鼠标时还移动鼠标,则按挨次引发的事件过程为:MouseDown MouseUp ClickMouseMoveDblClickMouseUp

    Click事件和DblClick事件不能识别当事件产生时鼠标指针的位置;而MouseDown MouseUp MouseMove等不仅能识别当事件产生时鼠标指针的位置,还能识别各鼠标按钮以及是否同时按下了键盘上的ShiftCtrlAlt键。

    l         Form1的MDIChild属性设置为True。

    MouseDown MouseUp MouseMove等事件的参数如下表:

    参数

    阐明

    备注

    Button

    一个位域参数,其二进制低三位描述鼠标按钮状况

    2、  甚么是一组单选按钮?

    010—右(2

    100—中(4

    Shift

    一个位域参数,其二进制低三位描述事件产生时键盘上ShiftCtrlAlt键的状况

    Drawnow = False

    010Ctrl 2

    100Alt 4

    X,Y

    Case 3

     

     

    注意:上述五个鼠标事件的事件过程的格式,见P.48P.49

    l         主菜单——窗体标题栏下方的菜单。

    2           MouseDown事件

    当按下鼠标按钮时就可触发此事件。

     

    例:       Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Command1.Move X, Y

    End Sub

    Move方法可将命令按钮移动到窗体的不同位置,单击窗体时鼠标指针的位置(X,Y)决定命令按钮的新位置。(X,Y)决定命令按钮的左上角坐标。可上机试。

     

    Button参数是位域参数,其每位代表一个状况。Button参数的最低三位划分表示鼠标的左键、右键和中键。

    语句:    Line (X1, Y1)-(X2, Y2)

    功能:    绘制一条从点(X1, Y1)到点(X2, Y2)的直线。

    语句:    Line -(X2, Y2)

    功能:    绘制一条从上次绘制点到点(X2, Y2)的直线。

    l         Enable属性

    5.5  命令按钮(CommandButton

    End Sub

    2  Load事件

     

    3           MouseUp事件

    当释放鼠标按钮时产生此事件。

    MouseUp事件往往与MouseDown事件或MouseMove事件配合使用。看下面的例子:(上机试。)

    Option Explicit

    Private x1, y1

     

    6  Deactivate事件

    x1 = X

    End Sub

    End Sub

     

    Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Line (x1, y1)-(X, Y)

    List1.AddItem "星期五"

     

    u      掌握菜单的设计与应用

    drawnow = False

    5  Hide方法

    当鼠标指针在屏幕上移动时就会引发MouseMove事件。

    例1                  结合Line方法使用MouseMove事件

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Clear方法

    用户选中的或最后单击的列表项的索引值,如果用户自行输入,无论输入的文本是否与列表项相符,ListIndex的值均为-1

    注意:    ⑴此例的运行了局是曲线。(当然,从微分的角度看也是线段。)上机试。

                  ⑵当鼠标指针移过屏幕时要调用多少次MouseMove事件?并不是对鼠标经过的每个像素城市产生MouseMove事件,操作环境每秒生成有限多个鼠标消息。

    5.3  文本框

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Line -(X, Y)

    Circle (X,Y),50

    End Sub

    上机运行了局:鼠标指针移动得越快,在任意两点之间所能识其它MouseMove事件越少。浩繁圆圈挤在一起表明鼠标在此位置移动缓慢。

    11  Paint事件

    例3     MouseMove事件往往也与MouseDown事件或MouseUp事件配合使用。

    Dim Drawnow As Boolean

    Change事件是当滚动条中滑块位置产生变化,即value值产生变化时所引发的事件。

    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Drawnow = True

    2

    CurrentY = Y

    控件是包孕在窗体内的对象。每种类型的控件都有自己的一套属性、事件和方法,以适用于特定的目的。

    End Sub

    Text1 , Text2 , Command1

    If Drawnow Then Line -(X, Y)

    y1 = Y

    ……

    ⑶可用MouseMove事件检测是否同时按下了两个或两个以上按钮。

    001Shift1

    End Sub

     

    3的运行了局:只有按下鼠标任意按钮时才绘线(曲线),而在释放按钮时停止绘线。

    l         WordWrap属性(文本回绕)

    Print "你按下了Shift"

    可用Button参数的返回值来判断鼠标事件产生时按下或释放了哪个鼠标按钮。

    Ø结合Line方法使用MouseDown事件

    Button参数一般可用十进制数值或常数来表示,如下表:

    二进制值

    援用时:列表框名.selected(Index)

    常数

    l         WindowList属性

    适用事件

    000

    0

     

    未按下或释放任何按钮

    MouseMoveMouseDownMouseUp

    001

    1

    vbLeftButton

    按下或释放左键

    返回列表框中项目的个数。

    010

    2

    vbRightButton

    5.8  框架(Frame

    MouseMoveMouseDownMouseUp

    100

    4

    vbMiddleButton

    按下或释放中键

    阐明:此语句只是把窗体载入内存,窗体在屏幕上并不可见,但此时可任意操作该窗体。

     

    3

     

    Dim Shifttest As Integer

    MouseMove

    101

    5

                  窗体名.Hide

    文本框获得焦点的方法   ②用鼠标单击

    MouseMove

    110

    l         ScrollBar属性

     

    同时按下中、右键

    MouseMove

    111

    7

        上式中,Index是项目的索引值。

    同时按下左、右、中键

    If Button = 4 Then Print "你按下了中键"

     

    注意:    ⑴在MouseDown事件中使用Button参数可判断按下了哪个按钮;MouseUp事件中使用Button参数可判断释放了哪个按钮。

    List即为字符串数组,下标由0开始,可利用List属性为列表框增加或删除列表项。

    Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

     

    1       Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

     

    5.2.3              检测ShiftCtrlAlt键的状况

    l         Value属性

     

    2            Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

    4  Show方法

    If KeyCode = vbKeyA Then

    If Button = 4 Then Print "你释放了中键"

    l         Alignment属性             

     

    3            Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    If Button = 1 Then Print "你仅按下了左键"

    阐明:Spc(n)表示插入n个空白字符。

    注意:    ⑴一次MouseMove事件可以设置Button参数的所有位或某些位,而不是只能设置一位。

    3的运行了局:如果仅按下左键,则显示上述信息。但如果同时按下左键和右键,则不显示任何信息。

     

    l         新建一个工程(此时已有一个窗体Form1)

    If Button And 1 Then Print "你按下了左键"

    If Button And 2 Then Print "你按下了右键"

    KeyDown事件:按下任意键(键盘上的物理键)

    注意:    4的运行了局:只要按下左键,就显示信息,而不管是否同时按下其他键。

                       ⑵此例应使用And操作符。

    5  LostFocus事件

    5            综合练习题:以例3为基础,编写一个应用程序,要求只有按下鼠标左键时才绘线(曲线),而在释放左键时停止绘线;按下鼠标右键时画直线。此题要求同学们上机操作。

    3  Load语句

     

    Dim drawnow As Boolean

    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    控制标签的大小是否随文本长度的变化而火平扩充。默认值为:False,即标签大小不会随文本长度的改变而改变。

    drawnow = True

    设置或返回编辑域(文本框)中的文本内容。

    CurrentY = Y

    End If

    If Button = 2 Then

    Line -(X, Y)

    End If

    Line -(X, Y)

    vbCascade

    功能与列表框相同。

    If drawnow Then

    Line -(X, Y)

    End If

    End Sub

     

    Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

     

    End Sub

     

     

           当鼠标指针位于窗体上方时,窗体将识别鼠标事件;当鼠标指针位于控件上方时,控件将识别鼠标事件。

    Timer控件在设计时放入窗体的大小是固定的,运行时,它是不可见的。

        设置窗体在屏幕上的重建方法。有两个值:True和False

    二进制值

    当在组合框的文本框上输入数据时,就会引发该事件过程。

    常数

    意义

    000

    0

    Ø结合Move方法使用MouseDown事件

    l         ActiveForm属性

    001

    KeyDown事件和KeyUp事件的返回参数有两个:KeyCodeShift,而KeyPress事件的返回参数只有一个:KeyAscii

    Print "你按下了Alt"

    按下Shift

    010

    SelText ——设置替代前所选择文本的字符串内容。

    vbCtrlMask

    .ScaleLeft和ScaleTop

    u      掌握标准控件的应用

    5.8.1 基本属性

    vbAltMask

     

    011

        即便对于当前窗口而言,它也可能含有多个能进行输入的部件(窗体或控件)。Windows规定当前窗口中也只能有一个部件能接收键盘事件,而其他部件则不能接收键盘输入、响应键盘事件。称这个能处理键盘事件的部件“拥有输入的焦点”,简称“具有焦点”;而称那些不能接收键盘输入的部件“不具有焦点”。

     

    0vbListBoxstandard):缺省值,标准样式(图5-1,教版本)。

    101

    5

        设置窗体是否看见。

    同时按下ShiftAlt

    110

        指当前处于活动状况、能接收键盘事件的窗体或控件。

     

    同时按下CtrlAlt

    111

    7

     

    同时按下ShiftCtrlAlt

    .MouseMove事件:每当鼠标指针移动到屏幕新位置时产生。

    阐明:使用Shift参数的方法与Button参数相同。

    1     VB6.0编程实用教程P.222

    Option Explicit

     

    组合框实际上可看作是列表和文本框的组合,它有三种形态(由Style属性决定):下拉式组合框、简单组合框和下拉式列表框。见图5-3P.94.

    Shifttest=shift And 7

    l         SelCount属性

    Case 1

    5.2.2      检测鼠标按钮

    Case 2

    Print "你按下了Ctrl"

    l         Enabled属性

    vbShiftMask

    事件产生时鼠标指针的位置坐标

    Print "你按下了ShiftCtrl"

    If KeyCode = vbKeyA And Shift =1 Then

           当用户关闭窗体时,会依次激发QueryUnloadUnloadTerminate事件。

        设置全部窗体的高度和宽度。

    Print "你按下了CtrlAlt"

    End Sub

    Print "你按下了ShiftCtrlAlt"

    End Select

    End Sub

    隐藏

    对象名. SetFocus

    5.2.4              键盘事件

    1 几个概念

                               1——标题在按钮的左边

    6

        Windows虽允许同一时刻有多个程序一起运行,但只允许其中有一个窗口处理键盘事件,而其他窗口则得不到键盘输入,这个能接收键盘输入的窗口就是当前窗口,当前窗口的标题栏是加亮显示的。

    3

     

        改变焦点的方法

     

           对程序员而言,若想使用代码改变焦点,可使用SetFocus方法。其用法是:

           部件名.SetFocus

    注意:SetFocus方法只适用那些EnabledVisible属性为True的对象部件。

     

    2         键盘事件概述

    窗体和控件能识其它键盘事件有三种:

    KeyPress事件: 按下某个ASCII码对应的键

    End Sub

    KeyUp事件:   释放任意键

    阐明:⑴只有获得焦点的对象才可以接收键盘事件。

    ⑵键盘事件彼此并不排斥,而是有联系的。当按下某一键时,将依次产生KeyDown事件和KeyPress事件,而松开此键后产生KeyUp事件。

    KeyDown事件和KeyUp事件提供最低级的键盘响应,如ShiftCtrlAlt键的组合、箭头键、PageUpPageDown、区分数字小键盘的数字键与打字键盘的数字键,还有一些功能键。而KeyPress事件检测的键只对应于所有标准的ASCII字符,如KeyPress事件对F1CtrlShiftAlt等不响应。

    KeyDown事件和KeyUp事件划分响应按下键的操作和释放键的操作,而KeyPress事件只响应按下键操作。

    1

    l         Caption属性

          

    3     KeyPress事件

           当按下与ASCII字符对应的键时产生。

           一般情况下,要处理标准ASCII字符时都要使用KeyPress事件。KeyPress事件能区别大小写字符。

    1     Private Sub Text1_KeyPress(KeyAscii As Integer)

    KeyAscii = Asc(UCase(Chr(KeyAscii)))

    思考题3:利用Timer控件使文字在窗体内往返振荡,碰着窗体边缘即改变方向运动。

    运行了局:文本框Text1中输入的所有字符都强制转换成大写字符。

    阐明:    KeyPress事件的返回参数只有一个:KeyAscii ,其返回的是对应于按键的ASCII码的十进制值。

    Chr函数将ASCII字符代码转换成对应的字符;

    5.3.4  举例1

      Asc函数将字符转换成对应的ASCII码。

     

    设置框架的标题,使用户明确框架内控件的用途。

           KeyDown事件和2000名大学生公园纵酒狂欢KeyUp事件讲演键盘按键准确的物理状况:按下或松开。

           与此对照的是,KeyPress事件并不讲演键盘状况,不能识别键的按下或松开状况。

    .WindowState

     

    参数                            阐明

    KeyCode                      指示按下的物理键的键代码(此时“A”与“a”作为同一个键返回)

    Shift                                   指示CtrlShiftAlt键的状况

     

        见教材P.90.

     

    1       Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

    If Button = 2 Then Print "你释放了右键"

    MsgBox "你按下了A"

    End If

           KeyDown事件和KeyUp事件提供两个参数KeyCodeShift来返回输入字符的信息,如下表:

     

    阐明:⑴功能键F1的键代码是vbKeyF1,Home键的键代码是vbKeyHome,……

    KeyCode参数只能识别物理键,不能识别大小写。如果要判断输入的字符是大写形式或小写形式,需使用Shift参数。(见下例)

    ⑶键盘事件使用Shift参数的方法与鼠标事件相同。(见上节3.2.3)

     

    2      Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

    Case 5

    MsgBox "你按下了大写A"

    .ClipControls

    End Sub

     

    3        Dim shiftkey As Integer

    Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

    shiftkey = Shift And 7

    Select Case shiftkey

    Case 1

      1Change事件

    Case 2

    Print "你按下了Ctrl"

    Case 4

    Print "你按下了Alt"

    Case 3

    Print "你按下了ShiftCtrl"

    Case 5

    如何援用列表中选定的项目?应使用如下语法:

    Case 6

    Print "你按下了CtrlAlt"

    Case 7

    Print "你按下了ShiftCtrlAlt"

    End Select

    End Sub

     

    4        讲解习题二:第2题(教材P.44),要求输入成绩后按回车,马上就在另一个文本框中显示该分数对应的等级。

    有关程序代码参看:VB上机讲义\实验二演示\工程一。

     

    5.2.5       其他窗体事件

           Visual Basic程序是由事件驱动的,编写一个VB程序的最主要工作就是为大量事件编写程序代码。

           当用户开始运行只有一个普通窗体的应用程序时,一般会依次产生以下四个事件:InitializeLoadActivateGotFocus事件。

    1  Initialize事件

           首先触发的是Initialize事件,它是在窗体作为一个对象被第一次创建时触发,此时窗体并没有成型。因此,在此事件过程中通常是一些设置窗体属性的代码,其格式为:

    框架的作用是将同一类对象分组(例如有多个单选按钮)。

    ……

    End Sub

     

    上述程序运行的了局是:只要按下鼠标,就会绘制一条从上次绘制点到鼠标当前位置的直线。第一条直线始于缺省起点,也就是窗体的左上角。  (上机试。)

           此事件在Initialize事件产生后异常短的时间内,在窗体被载入内存时产生。在此事件过程中,通常指定控件的初始设置值。例如,指定要装入ComboBoxListBox控件的列表项内容,或给窗体级变量赋初始值等等。其格式为:

    注意:鼠标事件以及后面要介绍的键盘事件并不是窗体独有的,其他控件也支持鼠标事件和键盘事件。

     

     

     

    Private Sub Form_Load()

    List1.AddItem "星期一"

    List1.AddItem "星期二"

    If Button = 1 Then

    List1.AddItem "星期四"

    End Sub

    List1.AddItem "星期六"

    List1.AddItem "星期日"

    MsgBox "Form1正在被卸载!"

    End Sub

    5.1   窗体基本属性

     

    3         Activate事件

    当只有一个窗体时,则此窗口一定是活动的,所以会引发Activate事件。在此事件过程中,可以在窗体上输出文本或图形。其格式为:

    窗体也称表单,它是VB应用程序运行时用户与应用程序之间交互的界面,用户主要通过窗体以及放在窗体上面的控件来与应用程序进行交互。所以说窗体是应用程序的操作平台。

    ……

    End Sub

    滚动条是用来协助窥察数据和调整数据的工具,一般不需知道具体的数值。滚动条有两种:火平滚动条和垂直滚动条。

    4  GotFocus事件

    按下或释放右键

    阐明:在程序运行中,当控件或窗体用户通过单击的方法使控件或窗体首次获得焦点时,将先引发Click事件,然后引发GotFocus事件;但是一旦控件已获得焦点,则再次单击控件时,将只产生Click事件。

     

     

           此事件在窗体失去焦点时产生。

     

    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    l         Caption属性

    标签的常用属性:

    7  QueryUnload事件

       DIForm1ActiveFormActiveControl

           QueryUnload事件在Unload事件之前产生,此事件的典型用法是在关闭一个应用程序之前用来确保包含在该应用程序中的窗体是否还有未完成的任务。例如,如果还未保存某一窗体中的新数据,则应用程序会提示保存该数据。其格式为:

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

    ……

     

     

    设置标题的位置,有两个值   0(默认值)——标题在按钮的右边

           Unload事件的引发原因与QueryUnload事件相同,当窗体从内存中卸载时产生。

           一般来说,可用一个Unload事件过程来确认窗体是否应被卸载或用来指定想要产生的操作。

    2    Private Sub Form_Unload(Cancel As Integer)

    MsgBox "本窗体正在被卸载!", "Unload事件"

    End Sub

    运行程序,单击标题栏上的关闭按钮,会弹出一个消息框。

     

    9  Terminate事件

           当窗体从内存中卸载完时产生。其格式为:

    Private Sub Form_Terminate()

    该属性返回命令按钮的状况: True时,表示按钮被按下

    图标方法排列子窗体

    注意:用End语句来结束应用程序,这三个事件:QueryUnloadUnloadTerminate事件均不会产生。

    vbArrangeIcons

    10  Resize事件

     

    .Appearance属性

    3              Private Sub Form_Resize()

    Command1.Left = (ScaleWidth - Command1.Width) / 2

    Command1.Top = (ScaleHeight - Command1.Height) / 2

    用于删除列表框中某指定列表项(即删除List数组中的指定元素),其格式为:

    运行了局:当调整窗体的大小时,命令按钮一直连结在窗体中央。

     

    控制文本框失去焦点时,文本框内被选择的文本是否仍以反白方法显示。默认值为True,即不再以反白方法显示。

           在一个对象被移动或放大之后,或覆盖现象结束之后,或使用Refresh方法时,将引发Paint事件。

    本节思考题:

     

    参考答案:(实例演示:见\VB上机讲义\实验二演示)

    5.2.6       窗体的方法

    1  Cls方法

           该方法清除窗体上所有的图形和文本。其格式为:

    Visual Basic提供了一个计时器控件,此控件提供一个时间间隔属性,每隔一个时间间隔,就会引发计时器事件。

     

    2  Print方法

           向窗体输出表达式的值。其格式为:

                  对象名.Print  {Spc(n)|Tab(n)} expression charpos

    End Sub

    Tab(n)表示将插入点定位在绝对列号为n的列上。

    charpos参数指定下次打印时插入点的位置。有三个取值:

    ;————接在上次打印的字符之后

    l         Default属性

    Tab  ——定位在下个打印区的起始位置。

     

     

           用来将窗体或控件载入内存。格式为:

                  Load 窗体名或控件名

    MouseMoveMouseDownMouseUp

    注意:当程序开始执行时,只有设置为启动对象的那个窗体会自动载入内存并在屏幕上显示,且自动引发该窗体的Load事件。

    按下Ctrl

     

    If Button = 1 Then Print "你释放了左键"

           Load语句加载窗体时并不显示它,仅把它装入内存。为了在屏幕上显示窗体,应使用Show方法。调用Show方法与设置窗体Visible属性为True具有相同的效果。其格式为:

                  窗体名.Show  [0/1]

           默认值为0,表示以非模态形式显示窗体,即能通过鼠标将焦点转移到其他窗体上。

    4  用户单击一个名为Cmdsport的按钮,则显示一个名为Frmsport的对话框,在该对话框中提供一个运动项目列表。

    Private Sub Cmdsport_Click()

    Load Frmsport                                                 '首先加载窗体

    Frmsport!LstsportAddItem  "足球"        '为窗体中的列表框控件添加项目

    Frmsport!LstsportAddItem  "篮球"

    Frmsport!LstsportAddItem  "排球"

    [注意]:“列表框名.Text”与“列表框名.List(列表框名.ListIndex ”的意义相同。

    End Sub

     

    注意:    若事先没有用Load语句加载窗体,当直接使用Show方法时也能先加载窗体并显示窗体。为何一般都是先使用Load语句加载窗体再使用Show方法显示窗体,而不是直接使用Show方法呢?

           其一,用户希望加载窗体时隐藏它,这样用户可以对窗体及窗体中的控件进行设置和操作,待完成后再显示窗体;

           其二,如果窗体已事先加载,则再使用Show方法时窗体的显示速度会更快。

     

    4           MouseMove事件

           如果希望从屏幕上隐藏一个窗体,而在内存中保存它以便能继续使用,应使用Hide方法。调用Hide方法与设置窗体Visible属性为False具有相同的效果。其格式为:

    5-2  三类组合框比较表

    阐明:⑴窗体被隐藏后,下次执行Show方法或Load语句时,不会再次引发该窗体的Load事件。

    ⑵若执行Hide方法时,窗体未事先装入内存,则此时会先加载窗体再隐藏该窗体。

     

    6  Unload语句

           将窗体从内存中卸载。其格式为:

                  Unload 窗体名

    例如:  Unload Me

    阐明:⑴窗体被卸载后,下次执行Show方法或Load语句时,会将窗体再次装入内存并引发该窗体的Load事件。

    ⑵窗体从内存中被卸载前,会引发QueryUnload和Unload事件。

     

    5.2.7       图象处理

           程序运行时若要在窗体中加入布景图案,可通过Loadpicture函数实现。其格式为:

    Private Sub Form_Initialize()

    上式中,对象名可以是窗体、图片框或图像框,缺省时为窗体。“文件名”为文件全名。

    阐明:  ⑴可在界面设计阶段设置窗体的Picture属性,此时图片会被保存并与窗体同时加载;如果在程序运行时通过Loadpicture函数来加载图片,该图片不和应用程序一起保存。

    ⑵可使用Savepicture语句来保存某个对象的图片属性。其格式为:

    菜单的设计主要是利用菜单编辑器来实现,打开“菜单编辑器”的方法是:

    保存Picture属性中的图片时,若原文件是位图、图标、元文件或增强元文件,则图片将以原始文件的格式保存;若原文件是GIF或JPEG文件,则图片保存为位图文件。

    另外,Image属性中的图片总是以位图(bmp)的格式保存,而不管其原文件的格式。

     

    5.2.8       多窗体设计

           对于多窗体设计,VB提供了多重窗体设计方法和多文档界面设计方法,两者的区别是:

    多重窗体设计方法中,多个窗体之间是并列的关系。

    多文档界面设计方法中,多个窗体中只有一个MDI窗体,称为父窗体,其他窗体称为子窗体。MDI窗体与子窗体之间是包含与被包含的关系。子窗体最小化后,它的图标显示在MDI窗体用户区的底部;子窗体最大化后将填满MDI窗体的全部工作区,此时,它的标题与MDI窗体的标题一起显示在MDI窗体的标题栏。如图3-1、图3-2、图3-3所示。(教材P.53

    If Button = 1 Then Print "你按下了左键"

    1  多重窗体设计方法

           添加多个窗体的方法是:

    ⑴单击“工程”菜单的“添加窗体”命令。

    ⑵选择启动窗体,即程序从哪个窗体开始执行。默认的启动窗体为Form1,若要改变启动窗体,方法是:单击“工程”菜单的“工程1属性”命令,在“启动对象”栏中选择启动窗体。

    1:设计一个含三个窗体的项目,进行学生成绩登记。(教材P.54

     

    2  多文档界面设计方法

    ⑴设计步骤:

    4            Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    l         单击“工程”菜单的“添加MDI窗体”命令

    l         MDI窗体中设计一个“窗口”菜单,用来管理子窗体。

     

    l         若还想添加子窗体,则单击“工程”菜单的“添加窗体”命令,再将它的MDIChild属性设置为True。

    未按下任何键

    该属性在设计状况时不可用。

    l         ActiveControl属性

    MDI窗体的属性,返回活动子窗体上具有焦点的控件。

    1

    不能

     

    l         AutoShowChildren属性

    单击鼠标时还移动鼠标,则按挨次引发的事件过程为:MouseDown MouseUp Click MouseMove

    意义

    菜单的属性,在菜单编辑器中设置。(教材P.121

    l         Arrange方法

    MDI窗体的属性,排列MDI窗体中的子窗体。其格式为:

           MDI窗体名.Arrange 排列方法值

    排列方法值的取值及含义见下表:

    排列方法值

    常量

    阐明

    该属性决定按钮是否有效,值为True时有效。

    FontUnderline:  设置下划线

    例:要援用活动子窗体上具有焦点的控件,可用下列代码:

    vbTileHorizontal

    l         Style属性

    子窗体的方法,调整子窗体的位置。其格式为:

    vbTileVertical

    垂直方法排列子窗体

    4)若焦点在同一窗体的另外一个命令按钮上,按Enter键选择有焦点的命令按钮。

           当改变一个窗体的大小时产生。

     

     

    l         Zorder方法

    Print "你按下了ShiftAlt"

    [子窗体名]Zorder [位置值]

    ⑵设计MDI窗体的限制:

          位置值有两种:010为缺省值,表示将此子窗体移动到最前端同时为活动子窗体;1表示将子窗体移到后方。

     

    3  多文档界面设计时的注意事项

    ⑴加载和卸载

    加载子窗体时,一定会加载MDI窗体;而加载MDI窗体时,不会加载子窗体。

        关闭MDI窗体时,首先引发MDI窗体的QueryUnload事件,接着是子窗体的QueryUnload事件,然后是子窗体的Unload事件,最后是MDI窗体的Unload事件。

    End Sub

    阐明:子窗体名省略时,表示当前活动子窗体。

    一个应用程序只能有一个MDI窗体。

    Align属性的控件和具有没有界面的控件可以安排于MDI窗体,而其他控件不可。

     

    设计子窗体时不能有菜单。

     

    注意:Align属性是PictureBoxData等控件的属性,用于肯定控件在窗体上的位置。

    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    2:设计一个程序:已知初速度、加速度、时间,求间隔及末速度。

    2        下例程序在每次识别MouseMove事件之处,都绘制一个小圆圈。因此,可窥察到在一段时间内实际上有多少次MouseMove事件产生。(上机试。)

     

    对于程序设计人员来说,程序窗口中包含的菜单、按钮、列表等,尽管从外表和功能上有很大区别,但都是一个个的对象(既有属性又有事件)。在Visual Basic中,把菜单、按钮、列表等对象称为控件。

    下图显示了Visual Basic 6.0的标准工具箱(控件箱):

     

    文本框是一个异常重要的控件,它为用户提供了输入信息(如暗码)和显示信息的场所,且在文本框内,可做与文本编辑有关的动作,如剪切、复制、粘贴、选定文本、删除等操作。

    文本框的缺点是不能接收太大的数据。

    5.3.1 基本属性

    l         Alignment属性                  0:默认值,左对齐

    控制控件上显示文本的对齐方法   1:右对齐

    2:居中对齐

           例如,拖动一个窗体的边框,或者一个窗体被最大化、最小化或还原。当父窗体调整大小时,可用Resize事件过程来移动控件或调整控件大小,也可用此事件过程来重新计较那些变量或属性。

           Paint事件过程中,通常编写需要重新绘制图形的代码。但若AutoRedraw属性被设置成True,重新绘图会自动进行,于是就不需要Paint事件过程。

           此事件在窗体(而非其他控件)获得焦点时产生。

    l         SelLengthSelstartSelText属性

    MDI窗体的属性,控制装载子窗体时是否自动显示子窗体。有两个值:TrueFalse

    设置保密字符,一般设为“*”。

    当设置该属性时,文本的吸收、存储皆为输入的正文,但在屏幕上显示的却是设置字符的连续显示。(如一连串的“*”)

    见教材P.68. 

    设定文本框中是否出现火平或垂直滚动条,此属性只能在设计模式下设定,且MultiLine属性为True时才有效。

    此属性有4个值:0 ——不要滚动条

                    1 ——要火平滚动条

                    2 ——要垂直滚动条

                    3 ——要火和悦垂直滚动条

    下拉式组合框

    l         Enable属性

    l         Text属性

    存放文本框中显示或输入的文本。

    l         SelLengthSelStartSelText属性

    这三个属性用来实现文本编辑的很多功能,它们即可用于返回值,也可用于设置值。

    1)当用于返回值时(即选定一段文本后):

    SelLength ——返回文本框内反白区域的字符串长度。

    .Caption属性

    SelText ——返回文本框内反白区域的字符串内容。

    2)当用于设置值时:

    SelLength ——设置所选择的字符数。

    SelStart ——设置所选择文本的起始点(从0开始)。

    2

    [注意]:这三个属性在设计时不能设置,只能在程序中进行读写。

    5.3.2 基本事件

    FontBold: 设置黑体

    Print "你按下了Shift"

    当用户改变文本框内容或用代码改变Text属性值时会引发Change事件,其过程为:

        Sub 文本框名_Change( )

        ……

     

      2GotFocusLostFocus事件过程

    文本框获得焦点或失去焦点时划分引发的事件过程。

                           ①按[Tab]

                           ③在代码中使用SetFocus方法

    5.3.3 基本方法

    l         SetFocus方法

    该方法用于使对象获得焦点,其格式为:

        End Sub

      UCase函数将字符转换成大写字符;

    设计一个简易写字板……

    见教材P.61~64

    举例2:(讲完“标签”一节后再讲)

    设计一个程序……

    见教材P.64~66

    5.4  标签(Label

    标签也是显示文本信息的一个控件,但运行时用户不能输入任何信息,也不能修改、编辑。

    因此,标签通常用来作注释或显示数据了局。

    同时按下左、右键

    l         Autosige属性

    List1.AddItem "星期三"

    l         Backstyle属性(布景状况)

    控制标签控件的布景是否要变成透明,其值有01两种。默认值为1(不透明)。

    l         Borderstyle属性(边框风格)

    该属性即前述的select数组,它返回或设置一个项目是否被选中,该属性在设计时不可用。

    l         Caption属性(设置标题)

    肯定标签显示的文本,其长度<1000个字符。

    可在设计状况下从属性窗口中设置该属性;也可在运行过程中通过下列语句来修改标签显示内容:  标签名.Caption = 显示的文本串

           对用户而言,若想改变焦点,可使用鼠标单击的方法。

    使用该属性的前提是Autosige属性值为True

    当文本超出标签范围,该属性为False(默认值)时,标签沿火平方向扩展;否则,沿垂直方向扩展。

    举例:见教材P.64.  (2)

    5.5.1 基本属性

    End Sub

           此事件在窗体不再是活动窗体时产生(在LostFocus事件之后)。

    设置命令按钮上显示的文本。

    [注意]:(1)可通过Caption属性创建命令按钮的访问键快捷方法。

            方法是:将标题中某一字符前加上“&”字符,使构成该命令按钮的热键,运行时,该字符带下划线。

    例:& Command

        程序运行时,命令按钮上显示“Command”。

        可用Alt+C来选定该命令按钮。

                               False时,表示按钮未被按下

    Tab(n)——定位在绝对列号为n的列上。

     

    [注意]:(1)一个窗体中只能有一个命令按钮为缺省按钮。

    001—左(1

    3)当命令按钮的Default设置为True且所在窗体是活动的,且焦点不在其它命令按钮上,用户可按Enter键来引发此缺省按钮的Click事件过程。

    3

    5.12.2 常用的事件过程

    该属性有两个值:True(默认值)和False

     

    l         Cancel属性

    命令按钮的Cancel属性设置为True时,该按钮是撤消按钮。此时,不论该按钮是否具有焦点,按[ESC]键均相当于单击该按钮。

     

    2)当一个命令按钮的,同一窗体中其它命令按钮的Cancel属性自动地设置为False

    .Enabled

    l         Value属性

    ……

    2)若不想创建访问键,又要使标题中包含“&”字符,则应添加两个连字符“&&”,这样,在标题中就只显示一个连字符,而不显示下划线。

    该属性在设计状况下无效。

           设置在窗体上输出文本或图形时的起始Y坐标。

    1、  基本控件中除计时器、菜单、框架和标签外,都可以具有焦点。凡是需要和用户交互的控件都能拥有焦点。

    2、  获得焦点的方法

    (1)       鼠标单击控件

    (2)       [Tab]

    3、  通常情况下,[Tab]键的游走次序和控件竖立的挨次一致,但可通过控件的TabIndex属性来改变游走的挨次。

     1:在窗体上先后竖立了Text1Text2Command1等三个控件,则这三个控件的TabIndex值划分为:012。按[Tab]键时,这三个控件获得焦点的挨次为:

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    5.6.1 基本属性

    4、  具有TabIndex属性的控件还有一个属性TabStop,其缺省值为True。若某个控件的TabStop值设置为False,则按[Tab]键时,焦点将不会在此控件上停留。

    5.5.3 举例:

    设计一个电话号码的输入……

    6

    十进制值

     

    2:若想改变上述三个控件获得焦点的挨次,则可在设计状况或程序代码中改变这三个控件的TabIndex值。

    l         maxmin属性

    这两个属性划分规定了滚动条滑块位于最左边(下边)和最右边(上边)时的值,即规定了滚动条的取值范围。

    VB规定:maxmin属性的设置值必需在-3276832768之间。

    max的默认值为32768min的默认值为0

    l         Value属性

    设置或返回当前滚动条滑块在滚动条中的位置值。要注意,在设置Value属性时,min<=value<=max ,缺省值为0

    l         LargeChange属性

    设定在用户单击滚动条空白区时递增或递减的value属性改变值。默认值为1

    l         SmallChange属性

    设定在用户单击滚动条箭头时递增或递减的value改变值。默认值为1

    5.6.2 基本事件

    滚动条的支持事件有ChangeGotFocusLostFocusKeyDownKeyDressKeyUpScroll

     

    Scroll事件是指拖动滑块所引发的事件。

    5.6.3 举例:

    1:设计一个简易调色板。

          见教材P.73.

    l         HideSelection属性

          见教材P.74.

    阐明: RGB函数是最简单的指定颜色值的方法,它将红色、蓝色和绿色每种颜色的亮度分为256个等级,由0~255来表示,将不同亮度值的三种颜色调和,形成一种新的颜色,其格式为:  对象名.属性名=RGB(红色亮度值,绿色亮度值,蓝色亮度值)

    按下Alt

     

    5.7  单选按钮和复选按钮

    1、  甚么是单选按钮、复选按钮?用户使用时的功能?

    不能

    一个容器里的按钮为一组,窗体、框架、图片框都可作容器。见教材P.77. 4-8

    3、  基本属性(两类按钮的属性意义相近,一起阐明)

    End Sub

    8  Unload事件

    MouseMove

     

    l         Caption属性

    设置标题的文本内容。

    End Sub

    设置按钮在运行时的状况。            0  按钮未选中

    1)对于复选按钮,此属性有三个值: 1  按钮被选中

    2         按钮被选中,且不能再修改

             2)对于单选按钮,此属性有两个值   True :被选中

    False(默认值)

    .DblClick事件:对一个窗体对象来说,当用左键或右键双击窗体空白区域时产生;对一个控件来说,仅当双击左键时产生。如果DblClick事件在系统双击时间限制内没有出现,则对象识别为两个Click事件。

    l         MultiLine属性

                  对象名.Picture = Loadpicture("文件名")

    [注意]:在设计框架及其内部的控件时,要正确地将控件放入框架内,让框架和控件形成一体,以便移动框架时,其上的控件也能一起移动。正确的设计方法是:

    (1)       绘制框架(单击方法或双击方法都可)

    (2)       在框架上安排控件,此时只能使用单击方法来绘制及安排控件。

    4

    ⑹一般情况下应首先使用KeyPress事件,当KeyPress事件的功能不够使用时,才考虑使用KeyDown事件和KeyUp事件。

    清除列表框中的所有列表项(即清除List数组中的所有元素)。

    确认文本框是否能输入信息,缺省值为:True

    该属性有两个值:  True(默认值)

                      False :框架内控件模糊,不会对事件响应。

    .Left和Top

    ClickDblClick ,用法如前。

    5.8.3 举例:见教材P.78. 一个例子(框架及单选按钮的用法)。

     

    5.9  计时器(Timer

                  窗体名.Cls

           鼠标事件和键盘事件都用Shift参数判断事件产生时是否按下了ShiftCtrlAlt键,以及以甚么样的组合按下这些键。

    5.9.1 常用属性和事件

    例:       Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    该属性肯定计时器能否对Timer事件作出响应。

    有两个值:TrueFalse ,其中True为缺省值,表示允许计时器对Timer事件响应,即有效。

    l         Interval属性

    时间间隔属性,取值范围为1~65535,单位为毫秒。缺省值为0,此时相当于Timer计时器无效。

    此属性可在设计状况或运行时来设置。

     

    l         Timer事件

    此事件在计时器有效时的每个Interval属性值的时间间隔之后产生。其格式为:

    ……

    End sub

    5.9.2 举例:

    l         AddItem方法

        见教材P.81. 起。

    2:设计一个程序,……

        见教材P.83. 起。

    011

    思考题1:利用循环实现文字的动态移动。

    思考题2:利用Timer控件实现文字的动态移动。

    End Sub

    SelStart ——返回文本框内反白区域的起始位置。

     

     

    直接在文本框中输入

    例如:要将列表框List1中新加入的项目变为当前选项,可用下行语句:

    5.10.1 常用方法

    先介绍两个重要数组:List数组和Select数组。

    List数组中存放各列表项正文的内容,数组下标从0开始,即List(0)为第1个元素,依次类推。

    Select数组元素与List的数组元素一一对应,Select数组元素是Boolean型的,例如:List(1)放的是第2个列表项的内容,而Select(1)存放的是此列表项是否被选中的信息,True表示被选中,False表示未被选中。

    1:设计一个可关闭的计时器。

    [注意]:在设计时,可以使用List属性在列表中增加或删除项目;

    在运行时,可以使用AddItem方法向列表框中添加项目,使用RemoveItem方法删除项目,使用Clear方法清除列表框中的所有项目。

    使用AddItem方法的格式为:

    对象名.AddItem  “列表项内容”[Index]

    上式中,对象名可以是列表框的Name属性,也可是组合框的Name属性。

    新增的列表项安排于数组的甚么位置,由Index参数决定,为0时,新增列表项置于数组第1个元素;Index参数缺省时,新增列表次置于数组的最后。

    l         RemoveItem方法

    Case 7

            对象名.RemoveItem Index

    上式中,Index为列表项的索引值,例如:

            RemoveItem 3             ‘删除List(3)元素

    l         Clear方法

    4     KeyDown事件和KeyUp事件

    5.10.2  常见属性

    l         List属性

    ⑵对每个MouseDown事件或MouseUp事件只设置一位,故无法检测是否同时按下了两个以上按钮;如果同时按下多个按钮,Viaual Basic会将此操作诠释为两个或多个独立的事件。

    l         Columns属性

    指定列表中的列数,0为缺省值,表示单列表示;若为非0的正值n,则多列显示。

    l         ListCount属性

    MouseMoveMouseDownMouseUp

     

    返回或设置当前所选项目的索引值,若未选中任何1项,则ListIndex= -1List(-1)返回一个空字符。

    MDI窗体的属性,返回具有焦点或最后被激活的子窗体。

    如果是多重选择,则ListIndex返回用户最后单击的列表项的索引值。

    如何援用列表中的项目?应使用如下语法:

             列表框名.List(Index)

    End Sub

    Print "你按下了ShiftAlt"

             列表框名.List(列表框名.ListIndex

    l         Multiselec属性

    用来控制是否可以多重选取列表项。

    有三个值:012 0为默认值,表示不能多重选取。

    1——表示简单多重选择

    2——表示扩展的多重选择:即可使用[Shift][ctrl]键。

    .MouseDown事件:按下任意鼠标按钮时产生。

    返回被选中项目的数量。

    十进制值

    肯定标签是否有边框,其值有01两种。默认值为0(无边框)

    l         Selected属性

    Index的取值范围:0~ListCount-1

    l         Sorted属性

    决定列表项是否按字母挨次自动排序。

    有两个值:TrueFalse False为缺省值,表示“否”。

    火平方法排列子窗体

    该属性描述了列表框的状况,有两个值01

    同时按下ShiftCtrl

    1vbListBoxCheckbox):每个列表项前都有一个复选框(新版本)。

    l         Text属性

    存放用户当前选定的或最后单击的列表项内容。

    FrmsportShow                                      '在屏幕上显示窗体

    l         ItemData属性

    该属性是一个长整型数的数组,其数组元素的个数与响应的List数组的元素数目相同,此数组用来标识List数组的各个列表项。常用作列表框控件中项目数组的索引。

    [注意]:用AddItem方法在列表中增加一个项目时,ItemData数组中也会自动插入一项,其缺省值为其对应项目的值。

    l         NewIndex属性

    返回最近加入到列表中的选项的索引值,该属性运行时才有效。此属性在使用自动按字母排序列表中异常有用。

    列表框将选项列于框中;用户可用鼠标在上面选取一个或多个选项;若选项较多时,VB会自动给列表框加上垂直滚动条或火平滚动条;但列表框中的选项只能在设计时事先给出或在运行时通过代码来增减选项,不能由用户通过鼠标来任意增减选项。

    List1.ListIndex=List1.NewIndex

    5.10.3 举例:

    例:设计一个程序,界面如图5-2所示……

    下拉式列表框

    5.11  组合框(ComboBox

     

         组合框和列表框的异同:

    1、  相同点:都是通过AddItem添加列表项,用RemoveItemClear清除列表项,都是通过List数组存放列表项。还有很多属性的功能相同。

    2、  不同点:(1)组合框内一次只能选取一个列表项;而列表框可以选取多个列表项。

              2)列表框不可在框内输入数据;而组合框可以直接在组合框内输入数据,纷歧定要在框内选取列表项。

    5.11.1 基本属性

    l         Style属性

                                  0(默认值):下拉式组合框

    肯定组合框的形态,有三个值:  1:简单组合框

    2:下拉式列表框

    三者的特点和区别如表5-2所示:(P.94.

    此属性用来设置经过多少时间间隔对Timer事件调用一次。

    阐明

    Case 4

    简单组合框

    KeyDown事件和KeyUp事件的事件过程的格式:见教材P.47

    Style

    5.10  列表框(ListBox

    列表一直显示

    引发click事件过程

    引发Dblclick事件过程

    引发change事件过程

    0

    .Click事件:对一个窗体对象来说,当用左键或右键单击窗体空白区域或一个无效控件时产生;对一个控件来说,当用左键或右键单击该控件时产生,但对CheckBoxCommandButtonListBoxOptionButton控件来说,Click事件仅当单击左键时产生。

     

    2)某个命令按钮的Default设置值为True时,窗体中其它的命令按钮自动设置为False

    1

    ⑵相关属性和方法

    显示

    级联方法排列子窗体

    ⑴焦点

    2

    不可

    5.13  菜单

    CurrentX = X

    不能

             Shift参数的取值及意义如下表:

    l         Text属性

    l         ListListCountSorted属性

    对于下拉式组合框、简单组合框,Text属性在设计时可以输入信息,作为运行时的初始值显示;而下拉列表框的Text属性为只读型,设计时不能输入信息,只用来在运行时显示列表中确当前选项。

    .BorderStyle

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    l         ListIndex属性

    End Sub

    设置窗体重建时是只画新表露部分还是重画全部窗体。(与AutoRedraw属性配合使用,见第九章)

    此三个属性的用法与文本框相同。

    l         Enable属性

    Change事件过程:

    5.6  火平/垂直滚动条

    5.12.3 常用的方法

    AddItem方法

    RemoveItem方法

    Line -(X, Y)

    上述方法均与列表框的使用方法相同。

    5.12.4 举例:

    例:设计一个程序,……

        见教材P.95.

    Private sub Timer1_Timer( )

    隐藏

    菜单也是一种控件,菜单分为两类:主菜单和快捷菜单。

    上式中,属性名可以是BackcolorForecolorFillcolorBordorcolor等任一属性。

    l         快捷菜单——按鼠标右键显示的菜单。

    5.13.1  菜单的设计

          Savepicture 对象名.属性名, "文件名"

    →“工具”菜单/“菜单编辑器”命令→弹出“菜单编辑器”窗口

    同时按下左、中键


    展开全文
  • 其实本文标题说得有点大,一个窗体设计器包含的功能实在是太多而且非常复杂,网上有很多地方也讲到这方面的内容,不过基本上都是E文,...

    其实本文标题说得有点大,一个窗体设计器包含的功能实在是太多而且非常复杂,网上有很多地方也讲到这方面的内容,不过基本上都是E文,http://www.codeproject.com/Articles/24385/Have-a-Great-DesignTime-Experience-with-a-Powerful该处作者实现了一个简单的Form Designer,而且附有源码,不过也只是点到为止,功能不多,还有一个老外的开源项目http://www.icsharpcode.net/OpenSource/SD/,基本上涵盖了界面设计、生成代码、编译、调试等功能,能和VS IDE有一拼,源码压缩包有几十M,复杂度可想而知,我大概看了一下这两个的源码结构,基本上都是利用微软FCL中提供的接口、类来实现的,它们主要存在System.ComponentModel,Design命名空间中,比如DesignSurface、IDesignerHost、ISelectionService等,诸位也知道,微软的东西用起来很方便,理解起来嘛,那是相当的困难,因为你根本不知道为啥要那么搞,所以本篇文章我打算试着从底层来说明“窗体可视化设计”到底是个什么东西,诸位看官如果之前了解也不妨看看,不了解的话也没事,基本上涉及到的都是平时用到的技术,不涉及到System.ComponentModel,Design中的任何东西。文章最后附带Demo源码下载地址。

    我不知道窗体设计器对诸位来说是个什么样的概念,从开始学习可视化编程时,我们就开始接触了它,就我来说,用过VC6.0、VB以及现在的VS,基本上都是一样,在界面上拖拖控件,写写事件处理程序,编译后就能运行一个简单功能的Windows桌面应用程序了,但是,有以下疑问(Winform为例):

    1. 在新建一个Windows窗体时,设计器中默认出现的窗体是个什么东西?是真实实例化的一个Form(或其派生类)对象,还是其他替代品?
    2. 从工具箱中向窗体上拖一个Button控件,是一个什么样的过程?
    3. 类似1,拖进的Button控件是个什么东西?是真是实例化的一个Button类对象,还是其他替代品?
    4. 在设计器中选中一个控件(或者窗体),周围出现的方框是什么东西?鼠标又是怎么改变控件的位置和大小?
    5. 怎样选中多个控件,让其按照某一规则自动对齐?怎样实现设计器中的“剪切”、“粘贴”等菜单?

    暂时先列这么几个问题,其实还有很多,只是其他的本文没有给出解释,比如双击Button按钮时,怎么自动生成事件代码?最重要的是,怎样根据设计的界面生成代码?这些问题其实利用.net中提供的类都能实现,只是不太容易去探究它底层的具体实现细节。下面我就来原汁原味地解释一下以上提出的疑问,Demo中我用自己的方法从底层开始实现了跟常用设计器效果基本一样的功能,当然我不保证.net类库中的类底层就是像我解释的这样去实现的,因为我也没看该部分类的源码,呵呵。

    以下就是解释:

    1. 设计器中的默认窗体是真实实例化的一个Form(或其派生类)对象,也就是说,它跟桌面左下角“开始”按钮一样,是一个真实存在的控件(窗体即控件,控件即窗体,详见我前面的博客),至于为什么,这个很好解释,因为如果不是真实存在的控件,是不可能通过属性窗口(一般为PropertyGrid控件)来动态显示和修改它的属性。另外,诸位可以用Spy++查看设计器中的窗体和控件,你会发现能看到他们的句柄(Handle)。
    2. 当用户(Programmer)从工具箱向窗体中拖一个Button控件时,对于设计器来说,做的事情很简单:实例化一个控件,将其加到设计器中的默认窗体中,设置属性窗口中的PropertyGrid.SelectedObject = 实例化的控件。
    3. 跟1相同。其实这时候出现了一个问题,既然1中3中说到,设计器中的窗体和控件都是像桌面左下角“开始”按钮一样真实存在的,那么它应该能接受用户输入吧?!比如鼠标点击、键盘输入等,可是如我们所见,所有的设计器中的窗体和控件几乎都不能按照正常方式去响应用户输入,这是为什么?其实,我们的眼睛骗了我们,因为设计器中不只是窗体和控件,在它们上面还有一个透明的遮罩层,看一幅图:

    图1

    如你们所见,整个设计器可以分为三层,底层的灰色部分可以看作整个设计器的容器,中间层的蓝色部分就是设计器中的默认窗体,所有拖进设计器中的控件都是放在蓝色部分中,在蓝色部分上面,有一层透明的遮罩层(用橘黄色方框表示),大小跟底层的灰色部分一致,在用户(Programer)看来,最上面的遮罩层是“不存在”的,但是事实上,所有的鼠标键盘操作都被遮罩层拦截,由它进行处理,因此,中间层的窗体和控件不会接受任何用户输入。注:中间层的蓝色部分和最上面的橘黄色部分都属于底层灰色部分,如果把它们都看做控件,那么蓝色部分和橘黄色是平行关系,都属于灰色部分的子控件,只是Z轴顺序不同(Demo中的源码有所体现)。

         4.既然最上面有一个透明的遮罩层,那么当选中一个控件时,周围出现的选中方框可以把它画在这个遮罩层上,任何时候遮罩层中的方框跟中间层的选中控件相对应,保持一致,也就是说,无论方框大小还是位置,都跟中间层的选中控件一样,让人看起来,它两重合  ( 虽然不在同一个层面)。鼠标操作的是顶层的方框,中间层的控件跟着移动、变大、变小。

         5.在设计器中,如果选中多个控件,就会出现多个选中方框,道理一样,所有的选中方框都在最顶层,每一个方框都与中间层的某一控件相对应,操作跟4中一样。复制时,可以将选中控件的完整名称、属性、以及属性值收集起来存放在ClipBoard中,粘贴时,根据 完整名称新建控件,将属性值赋予新建控件,将其加到中间层。

    以上就是从底层开始解释一个窗体设计器的简单原理,在图1中,底层灰色部分DesignerControl是一个UserControl,HostFrame是一个控件容器(Form),Overlayer也是一个透明的UserControl,Recter为虚线效果的选中框,这些名称分别与Demo中的源码对应,诸位可以对照参考。

    另外,我说几个关键点:

    • 透明控件的实现
    View Code
     1         protected override CreateParams CreateParams
     2         {
     3             get
     4             {
     5                 CreateParams para = base.CreateParams;
     6                 para.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT 透明支持
     7                 return para;
     8             }
     9         }
    10         protected override void OnPaintBackground(PaintEventArgs e) //不画背景
    11         {
    12             //base.OnPaintBackground(e);
    13         }
    • 当移动或者改变顶层的方框时,不要让中间层的控件刷新的方法,就是过滤掉中间层控件的WM_PAINT消息,用到了System.Windows.Forms.IMessageFilter接口,该接口中有一PreFilterMessage方法,专门用来过滤需要忽略的Windows消息,具体实现如下:
    View Code
     1 class MessageFilter : IMessageFilter
     2     {
     3         HostFrame _thehost; //中间层控件容器
     4         DesignerControl _theDesignerBoard; //设计面板
     5         public MessageFilter(HostFrame hostFrame, DesignerControl designer)
     6         {
     7             _thehost = hostFrame;
     8             _theDesignerBoard = designer;
     9         }
    10         #region IMessageFilter 成员
    11         public bool PreFilterMessage(ref Message m) //过滤所有控件的WM_PAINT消息
    12         {
    13             Control ctrl = (Control)Control.FromHandle(m.HWnd);
    14             if (_thehost != null && _theDesignerBoard != null && _thehost.Controls.Contains(ctrl) && m.Msg == 0x000F) // 0x000F == WM_PAINT
    15             {
    16                 _theDesignerBoard.Refresh();
    17                 return true;
    18             }
    19             return false;
    20         }
    21         #endregion
    22     }

    使用时,用Application.AddMessageFilter()方法就可以,MSDN上对该方法有一个解释,大概意义是说此操作只对当前UI线程有效,也就是说如果一个应用程序有两个或者多个UI线程,只能过滤当前UI线程中的某一消息。当然这个不是重点,我只是简单的提一下,有关Windows消息以及WInform中的消息流动问题,请参考我之前的博客。

    • 选中方框就是一个普通的类,代码如下:
    View Code
      1 /// <summary>
      2     /// 选中控件时,周围出现的方框
      3     /// </summary>
      4     class Recter
      5     {
      6         Rectangle _rect = new Rectangle();
      7         bool _isform = false;  //是否为窗体周围的方框(如果是,则位置不可改变,且只有从下、右、右下三个方向改变大小)
      8 
      9         public Rectangle Rect
     10         {
     11             get
     12             {
     13                 return _rect;
     14             }
     15             set
     16             {
     17                 _rect = value;
     18             }
     19         }
     20         public bool IsForm
     21         {
     22             set
     23             {
     24                 _isform = value;
     25             }
     26         }
     27         public Recter()
     28         {
     29 
     30         }
     31         /// <summary>
     32         /// 绘制方框
     33         /// </summary>
     34         /// <param name="g"></param>
     35         public void Draw(Graphics g)
     36         {
     37             Rectangle rect = _rect;
     38             using (Pen p = new Pen(Brushes.Black,1))
     39             {
     40                 p.DashStyle = DashStyle.Dot;
     41                 rect.Inflate(new Size(+1, +1));
     42                 g.DrawRectangle(p, rect); //方框
     43 
     44                 p.DashStyle = DashStyle.Solid;
     45                 
     46                 //8个方块
     47                 g.FillRectangle(Brushes.White, new Rectangle(rect.Left - 6, rect.Top - 6, 6, 6));
     48                 g.FillRectangle(Brushes.White, new Rectangle(rect.Left + rect.Width / 2 - 3, rect.Top - 6, 6, 6));
     49                 g.FillRectangle(Brushes.White, new Rectangle(rect.Left + rect.Width, rect.Top - 6, 6, 6));
     50                 g.FillRectangle(Brushes.White, new Rectangle(rect.Left - 6, rect.Top + rect.Height / 2 - 3, 6, 6));
     51                 g.FillRectangle(Brushes.White, new Rectangle(rect.Left - 6, rect.Top + rect.Height, 6, 6));
     52                 g.FillRectangle(Brushes.White, new Rectangle(rect.Left + rect.Width, rect.Top + rect.Height / 2 - 3, 6, 6));
     53                 g.FillRectangle(Brushes.White, new Rectangle(rect.Left + rect.Width / 2 - 3, rect.Top + rect.Height, 6, 6));
     54                 g.FillRectangle(Brushes.White, new Rectangle(rect.Left + rect.Width, rect.Top + rect.Height, 6, 6));
     55 
     56                 g.DrawRectangle(p, new Rectangle(rect.Left - 6, rect.Top - 6, 6, 6));
     57                 g.DrawRectangle(p, new Rectangle(rect.Left + rect.Width / 2 - 3, rect.Top - 6, 6, 6));
     58                 g.DrawRectangle(p, new Rectangle(rect.Left + rect.Width, rect.Top - 6, 6, 6));
     59                 g.DrawRectangle(p, new Rectangle(rect.Left - 6, rect.Top + rect.Height / 2 - 3, 6, 6));
     60                 g.DrawRectangle(p, new Rectangle(rect.Left - 6, rect.Top + rect.Height, 6, 6));
     61                 g.DrawRectangle(p, new Rectangle(rect.Left + rect.Width, rect.Top + rect.Height / 2 - 3, 6, 6));
     62                 g.DrawRectangle(p, new Rectangle(rect.Left + rect.Width / 2 - 3, rect.Top + rect.Height, 6, 6));
     63                 g.DrawRectangle(p, new Rectangle(rect.Left + rect.Width, rect.Top + rect.Height, 6, 6));
     64             }
     65             
     66         }
     67         /// <summary>
     68         /// 判断鼠标操作类型
     69         /// </summary>
     70         /// <param name="p"></param>
     71         /// <returns></returns>
     72         public DragType GetMouseDragType(Point p)
     73         {
     74             Rectangle _rect = this._rect;
     75             _rect.Inflate(new Size(3, 3));
     76             if (new Rectangle(_rect.Left - 2, _rect.Top - 2, 4, 4).Contains(p) && !_isform)
     77             {
     78                 return DragType.LeftTop;
     79             }
     80             if (new Rectangle(_rect.Left + 2, _rect.Top - 2, _rect.Width - 4, 4).Contains(p) && !_isform)
     81             {
     82                 return DragType.Top;
     83             }
     84             if (new Rectangle(_rect.Left - 2, _rect.Top + 2, 4, _rect.Height - 4).Contains(p) && !_isform)
     85             {
     86                 return DragType.Left;
     87             }
     88             if (new Rectangle(_rect.Left - 2, _rect.Top + _rect.Height - 2, 4, 4).Contains(p) && !_isform)
     89             {
     90                 return DragType.LeftBottom;
     91             }
     92             if (new Rectangle(_rect.Left + 2, _rect.Top + _rect.Height - 2, _rect.Width - 4, 4).Contains(p))
     93             {
     94                 return DragType.Bottom;
     95             }
     96             if (new Rectangle(_rect.Left + _rect.Width - 2, _rect.Top + _rect.Height - 2, 4, 4).Contains(p))
     97             {
     98                 return DragType.RightBottom;
     99             }
    100             if (new Rectangle(_rect.Left + _rect.Width - 2, _rect.Top + 2, 4, _rect.Height - 4).Contains(p))
    101             {
    102                 return DragType.Right;
    103             }
    104             if (new Rectangle(_rect.Left + _rect.Width - 2, _rect.Top - 2, 4, 4).Contains(p) && !_isform)
    105             {
    106                 return DragType.RightTop;
    107             }
    108             if (new Rectangle(_rect.Left + 2, _rect.Top + 2, _rect.Width - 4, _rect.Height - 4).Contains(p) && !_isform)
    109             {
    110                 return DragType.Center;
    111             }
    112             return DragType.None;
    113         }
    114         
    115     }

    其余的都很简单,用到的都是简单技术,详细请参考源码。XP .net3.5测试通过,源码下载地址:http://download.csdn.net/detail/xiaozhi_5638/5185939。源码中没有剪切、复制、自动对齐等功能。

    上一张Demo效果图:

    图2

    希望有帮助,O(∩_∩)O~。感觉本文对自己有用的朋友,给个“推荐”或者建议啥的都是可以滴,非常感谢~

     

    转载于:https://my.oschina.net/newsherlock/blog/425432

    展开全文
  • VB讲课笔记06:窗体与常用控件

    千次阅读 2018-03-10 17:24:29
    窗体设计是整个VB应用程序设计的基础。一个窗体对应一个代码模块。 1、窗体设计分类 (1)单窗体设计:应用程序中只包含一个窗体,即单文档窗体。 (2)多重窗体设计:应用程序中包含多个窗体,即多个单文档窗体...
    展开全文
  • 写在前面:因为业务的需要,有时会使用到自定义运行时窗体设计器Runtime FormDesigner,实现的功能,就是IDE设计器的简化。设想一下,如果可以在程序运行时,再设计一个Form,然后编译代码,那是多么强大呀。下面...

    写在前面:因为业务的需要,有时会使用到自定义运行时窗体设计器Runtime FormDesigner,实现的功能,就是IDE设计器的简化。设想一下,如果可以在程序运行时,再设计一个Form,然后编译代码,那是多么强大呀。下面介绍几个重要的Runtime FormDesigner,其中大部分来自了微软的官方网站或MSDN。

    重要的链接资源
    下面介绍有4个重要的Form设计器,它们是:
    1,Designerhost
    http://support.microsoft.com/?id=813808
    INFO: 代码示例演示如何通过使用 VisualC # .NET 创建自定义窗体设计器
    .Net1.1下运行的Form设计器

    2,DesignerHosting
    http://msdn.microsoft.com/msdnmag/issues/06/03/DesignerHosting/default.aspx
    .Net2.0下运行的Form设计器

    3,CustomFormsDesigner
    http://download.microsoft.com/download/d/3/1/d31fff33-fd97-488f-9bbd-4b7402905716/CustomFormsDesigner.exe
    .Net1.1下运行的Form设计器

    4,Hosting
    http://www.divil.co.uk/net/articles/designers/hosting.asp
    来自divil.co.uk的Hosting
    .Net2.0下运行的Form设计器

    运行效果图
    下面是1,DesignerHost就运行图,你是不是很震惊呢?反正,我第一眼看到这个运行时窗体设计器时,实在是太震惊了,一个只有20-30个源文件的项目,运行时,能够产生如此强大的界面,真是不敢相信,又万分喜悦,而其它三个FormDesigner也是产生相似的界面。这简直就是一个IDE系统,与VisualStudio2005一样啊,而且,它可以产生代码,可以产生C# Source,VB Source和XML。

    功能介绍
    工具的左边是工具箱,右边是属性设置窗口,中间是Form设计器,工具箱,跟平时使用的VisualStudio一样,多个选项卡,WindowsForms选项卡中有多个普通工具,有Components选项卡中有部件控件,而CustomControls选项卡中有用户自定义的控件,Datas选项卡中有系统的数据链接控件,如OleDbConnection之类,当然,也不仅仅是这些内容,你可以通过代码修改来增改左侧的控件。
    往上一点看,有Design,C#Source,VB Source,XML四个视图的选择,Design是设计视图,指的就是当前看到的界面,C# Source,VB Source跟我们在IDE工具中使用查看源代码所得到的东西一样。而XML则是我们之前没有见到的。它用于描述当前的Form的内容,如Form的属性和值,布局,层次,Form中的控件等等。
    菜单栏中,File下拉后,就是日常的保存,另保存,打开,退出等功能,而Edit就是编辑功能,如,复制,剪切,删除,对齐等,View就是视图界面,如Design,C#Source,VB Source,XML,Layout就是控件的层次移动等,Debug中,就是运行,编译等功能。

    可以说上,这个控件是四个中做得比较好的。操作起来也方便。
    精彩的文章还在继续,下一会,将介绍Runtime Form Designer的机制,编写,编译方法,请留意订阅首页的Rss

    运行时窗体设计器Runtime Form Designer一出现,就会以其出色的表现,奇怪的代码吸引,怎么说是奇怪的代码呢?设计器所使用到的ImenuCommandService,InameCreationService,ItoolboxService,IUIService,IdesignerHost,IselectionService 这些接口,使用过没用?在设计一个运行时设计器时,忽然学得,自己是在学习一个新的语言,是使用.Net来表示的底层界面接口语言。简单而言,.Net已经帮助你写好了底层的底层,那就是编写设计的接口。你只要继承或重写代码,就可以实现设计器的功能。查看重要的Form设计器用这个网址:
    http://www.myfirm.cn/News/DotNetUserInterface/20080221013104408.html
    为了使用最简单的方式来说明问题,使用最简单的设计器来做说明,下面介绍Hosting

    效果图

    所有代码图

    这个项目,相当的小,上面显示的就是所有的源文件,可以高兴地认为,只要学会了上面的类,就成功了。事实上,只要学会几个重要的类,就可以了。

    重点研究的接口
    在理解下面接口的时候,可以理解为,自己是微软的高级工程师,正在为VisualStudio开发工具箱,界面,界面,菜单等等界面功能。
    IMenuCommandService
    提供的方法用于管理设计模式下可用的全局设计器谓词和菜单命令,以及显示某些类型的快捷菜单。
    简单说,就是新建的控件,在窗体Form中产生的命令,如移动,对齐,层次叠放,复制,剪切,粘贴
    INameCreationService
    提供可以生成对象的唯一名称的服务。
    因为各个拖出来的控件都必须有唯一的名称,这样,才可以编译通过的。
    IToolboxService
    提供在开发环境下管理和查询工具箱的方法和属性。
    这就是一个工具箱,一个同工具箱提供一样功能的服务。
    IDesignerHost
    提供用于管理设计器事务和组件的接口。
    这是最重要的接口,所有的控件都是由这个接口发出,可以理解为,从这个接口可以找到所有控件的引用。
    ISelectionService
    为设计器提供用于选择组件的接口。
    就是当程序运行时,在Form设计器选择控件时,产生的事件,它常常被用来更新属性窗口。
    IUIService
    启用与开发环境对象(正在承载设计器)的用户界面的交互。
    PropertyGrid
    这不是一个接口,这只是一个控件,不过,提供了属性设置服务,是用户交互最频繁的服务之一。

    服务的加载
    可以这样理解,运时时Form设计器,就是一个服务的集合,服务管理器ServiceContainer初始化之后,绑定DesignerHost,然后不断增加服务,如
    InameCreationService,名字唯一服务
    ItoolboxService,工具箱服务
    ImenuCommandService,菜单命令服务
    IselectionService,选择服务(同时产生选择变化事件,从而改变属性显示)
    PropertyGrid,属性设置服务
    最后,由DesignerHost做激活动作,host.Activate();

    关于命令服务
    在运行时设计器中,要删除选定的控件,只能使用命令接口提供的功能。如
    menuService.GlobalInvoke(StandardCommands.Delete);
    当然,一个很高明的做法是,一开始就将DesignerHost的所有可能的命令纳入线程的管理,在designerhost.exe,中有使用。你可以在上一篇介绍Runtime Form Designer的文章中,找到这个控件的链接。

    下一篇,将介绍Runtime FormDesigner的运行和编译机制,不可错过。

    之前已经有两篇文章对Form Designer运行了分析和展示,具体展示了几个重要的开源Form设计器,也介绍了最基本的Form设计器的编写方式。而在介绍Hosting设计器时,没有提及到代码的展示与编译运行机制,下面,本文就对运行时Form设计器的代码转换和编译机制进行分析和学习。下面介绍Designerhost工具。

    界面效果图

    代码的产生
    将注意力投放到SampleDesignerLoader.cs类,上图中Design,C# Source,VB Source,XML视图的变化,都会产生事件,事件处理方法就是SampleDesignerLoader类的Flush方法,表示对当前控件与代码的刷新。
    一个重要的类,类中的类
    System.CodeDom.CodeCompileUnit
    在.Net中,一个源文件,如C#写好的.cs文件,其实可以转化为一个类中类CodeCompileUnit,这个类中类有构造函数,方法体,属性,命名空间等等的定义。如引入System命名空间,你可以这样写Imports.Add(new CodeNamespaceImport("System")); CodeConstructor是用来定义构造函数的。可以说,一个类实体的定义,运行时本身就是一个CodeCompileUnit类的实例。类的序列化功能,就是由CodeCompileUnit发起的重要功能。
    类的序列化可以将一个类变成一个文件如XML,而这个XML中记录了各个属性和值,在网络环境中,就可以作为一个传送的介质,这样,就可以实现类的远程调用。

    重要的代码

    RootDesignerSerializerAttribute a =       TypeDescriptor.GetAttributes(root)[(RootDesignerSerializerAttribute)]             RootDesignerSerializerAttribute;
    Type t = host.GetType(a.SerializerTypeName);
    CodeDomSerializer cds = Activator.CreateInstance(t)  CodeDomSerializer;
    IDesignerSerializationManager manager =        host.GetService((IDesignerSerializationManager))  IDesignerSerializationManager;
    CodeTypeDeclaration td = cds.Serialize(manager, root)  CodeTypeDeclaration;


    在设计界面拖动的控件和设置的属性都通过对根设计器的序列化,被完全提取出来,成为一个CodeCompileUnit的主体部分。再增加构造函数和其它属性就可以了。

    编译与生成
    要编译的话,就必须传入数据CodeCompileUnit,然后使用CsharpCodeProvider,
    VBCodeProvider就可以生成相应代码,也就是说,在设计的时候,不必要先指定使用何种语言,在设计完Form之后,再选定就可以了。因为,Form设计器最后产生的,是CodeCompileUnit,而不是代码。
    在SampleDesignerLoader.cs类上,也提供了Build方法,这就是生成DLL或EXE文件,因为在Windows平台上,可以正常使用类集合的,就只要用这两个扩展名。只要使用CompilerParameters类和当前的程序类,传入CodeCompileUnit就可以了。之后,就只是生成选择了。详情请查看Build方法

    转载于:https://www.cnblogs.com/Yjianyong/archive/2010/02/24/1672381.html

    展开全文
  • 企业管理软件包含一些公共的组件,这些基础的组件在每个新项目立项阶段就必须考虑。...查询设计器 Query Designer 支持选择一个或多个数据库表,通过左右连接的方式构建查询结果,支持直接手写SQL语句设...
  • 1、竖着切分2、横着切分(18KB) 85,spltrbar.zip SpltrBar.ocx控件主要是用来在程序中切分窗口(15KB) 86,cooltoolsbar.zip CoolToolBar v1.0.0控件类似VC的ToolBar的功能,您也可以在VB中轻松实现拖动...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    面向对象程序设计方法提出了一个全新的概念:类,它的主要思想是将数据(数据成员)及处理这些数据的相应方法(函数成员)封装到类中,类的实例则称为对象。这就是我们常说的封装性。 类的基本概念 类可以认为是对...
  • 本节课程开始,我们一起来学习VB编程中的一个重要元素——菜单栏的设计。菜单栏是VB中一个重要内容,作为可视化编程,合理的设计菜单栏,可以极大的方便用户使用,让用户快速选择所需的各项功能,提升用户体验。下面...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
  • VB课程设计俄罗斯方块

    热门讨论 2011-02-25 10:46:55
    游戏的背景音乐是由一段代码调用系统播放器Windows Player播放背景音乐,由于本次设计主要是针对游戏如何设计的,所以在这里就不对播放背景音乐的功能做介绍了。 2.1.2俄罗斯方块的造型 相信朋友们都玩过俄罗斯方块...
  • 菜单程序设计 为什么要学菜单?菜单重要吗? windows环境下,所有的应用软件都是通过菜单实现各种操作的。??你说重要不重要?? 对于复杂的操作,菜单具有明显的优势。 菜单的作用 - 提供人机对话的界面。 让使用...
  • 知识管理系统Data Solution研发日记之一 场景设计与需求列出 知识管理系统Data Solution研发日记之二 应用程序系列 知识管理系统Data Solution研发日记之三 文档解决方案 知识管理系统Data Solution研发日记之四 ...
  • vb中的控件分为两类一种是 标准控件 另一种是 ActiveX控件。 工具箱中只有标准控件,这一章节我们将系统和深入的介绍标准控件的用法, 包括 标签 文本框 图片框 图像框 直线和形状 命令按钮 复选框 单选按钮 列表框...
  • VB.NET窗体的Localizable属性

    千次阅读 2013-09-29 15:43:49
    这个属性,可以让窗口支持多种语言 一:窗体的本地化 对于windows窗体,你需要做的第一步是确定你的...本地化窗体一个关键的步骤是将窗体的本地化属性(localizable)设置为true,此时窗体代码中自动生成的代码部
  • 1、竖着切分2、横着切分(18KB) 85,spltrbar.zip SpltrBar.ocx控件主要是用来在程序中切分窗口(15KB) 86,cooltoolsbar.zip CoolToolBar v1.0.0控件类似VC的ToolBar的功能,您也可以在VB中轻松实现拖动...
  • VB常用控件介绍

    千次阅读 2018-02-16 16:24:30
    1、窗体(Form) 2、Label(标签)控件 3、TextBox(文本框)控件 4、RichTextBox控件 5、NumericUpDown控件 6、Button(按钮)控件 7、GroupBox(分组框)控件 8、RadioButton(单选按钮)控件 9、CheckBox...
  • vb添加GIF动态图片

    万次阅读 热门讨论 2012-04-28 16:52:18
    众说周知,GIF格式动画文件具有小巧、制作方便等特点,因此在网上得到广泛应用,在vb的picturebox和image控件添加图片后变成静止的了,这给我们设计VB应用程序带来了不便。原来以为实现起来特别的麻烦,又要注册控件...
  • VB的界面设计

    千次阅读 2012-12-30 16:28:41
    第二章 VB的界面设计   第二章 VB 的界面设计 2.1 VB 用户界面设计基础 1. 概述  界面的设计有两步:先绘制控件,然后确定控件属性。  绘制控件:在工具箱里单击想画的控件,在窗体里按下鼠标并拖曳,...
  • vb.net控件

    2020-04-28 14:49:22
    label(标签)控件用于显示文本,是设计应用程序界面时经常要用到的控件之一, 主要是用于显示其他控件名称,描述程序运行状态或标识程序运行的结果信息等 等,响应程序的事件或跟踪程序运行的结果。 使用 Label 控件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,970
精华内容 1,988
关键字:

vb的窗体设计器主要是用来