第十讲界面设计内容提要鼠标和键盘通用对话框制作菜单•下拉菜单•弹出式菜单鼠标指针形状鼠标MousePointer属性决定鼠标指针进入控件区域时显示的形状。对象名.MousePointer[=值]常数值描述vbDefault0(缺省值)形状由对象决定。VbArrow1箭头VbCrosshair2十字线VbIbeam3I型VbSizePointer5尺寸线(指向东、南、西和北四方向的箭头)鼠标指针形状鼠标常数值描述VbSizeNESW6右上-左下尺寸线(指向东北和西南方向的双箭头)VbSizeNS7垂-直尺寸线(指向南和北的双箭头)VbSizeNWSE8左上-右下尺寸线(指向东南和西北方向的双箭头)VbSizeWE9水-平尺寸线(指向东和西两个方向的双箭头)VbUpArrow10向上的箭头VbHourglass11沙漏(表示等待状态)VbNoDrop12不允许放下VbArrowHourglass13箭头和沙漏VbArrowQuestion14箭头和问号VbSizeAll15四向尺寸线VbCustom99通过MouseIcon属性所指定的自定义图标自定义鼠标指针鼠标当MousePointer属性被设置为99时,可利用MouseIcon属性自定义鼠标指针。对象名.MouseIcon=LoadPicture(文件路径)对象名.MouseIcon=另一对象名.PictureMousePointer=99Form1.MouseIcon=LoadPicture(c:\fire.ico)可在设计阶段通过属性窗口设置,也可在运行阶段通过代码设置鼠标事件鼠标PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)EndSubPrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)EndSubPrivateSubForm_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)EndSub事件何时发生?MouseDown单击鼠标上的任何一个按钮MouseUp松开鼠标上的任何一个按钮MouseMove移动鼠标鼠标事件过程中的参数00……中键右键左键鼠标Button参数Button=1左键被按下Button=2右键被按下Button=4中键被按下1—vbLeftButton2—vbRightButton4—vbMiddleButton使用符号常数鼠标事件过程中的参数鼠标Shift参数00……Alt键Ctrl键Shift键Shift=1Shift键被按下Shift=2Ctrl键被按下Shift=4Alt键被按下Shift=3按下Shift+Ctrl…..1—vbShiftMask2—vbCtrlMask4—vbAltMask使用符号常数鼠标事件过程中的参数X,Y参数对应当前鼠标指针所在的坐标与X,Y相关的属性是CurrentX,CurrentY。CurrentX,CurrentY记录绘图命令运行完毕时的X,Y值。其默认值是0,0。Line-(500,500)画(0,0)到(500,500)的直线,CurrentX=500CurrentY=500鼠标鼠标事件-例1PrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)Line-(X,Y)Circle(X,Y),40EndSub移动鼠标时画图鼠标鼠标事件-例2单击鼠标左键,随手画,单击鼠标右键,画直线DimdrawitAsBooleanPrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=1Thendrawit=TrueCurrentX=XCurrentY=YElseIfButton=2ThenLine-(X,Y)EndIfEndIfEndSub鼠标鼠标事件-例2PrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfdrawitThenLine-(X,Y)EndIfEndSubPrivateSubForm_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=1Thendrawit=FalseEndIfEndSub鼠标键盘事件键盘KeyPress事件按下并释放一个能产生ASCII码的键时触发KeyDown事件按下键盘上任何一个键时触发KeyUp事件释放键盘上任何一个键时触发KeyPress事件PrivateSubform_KeyPress(KeyAsciiAsInteger)……EndSubPrivateSub控件名_KeyPress([IndexasInteger,]KeyAsciiAsInteger)……EndSubKeyAscii返回按下键的Ascii码默认情况下,只有窗体上具有焦点的对象才能接收KeyPress事件,而窗体本身不会接收KeyPress事件窗体接收KeyPress事件•窗体上没有可视和有效的控件•窗体的KeyPreview属性设置为TrueKeyPreview属性窗体的KeyPreview属性设置为True时,窗体先接收KeyPress事件,然后控件继续接收该事件。假定窗体KeyPreview为True,并有下面事件过程,则当文本框中输入“1”时,实际上是得到的是“3”SubForm_KeyPress(KeyAsciiAsInteger)KeyAscii=KeyAscii+1EndSubSubText1_KeyPress(KeyAsciiAsInteger)KeyAscii=KeyAscii+1EndSub?窗体KeyPreview为False时在文本框中输入“1”时,实际上得到的是什么。KeyPreview属性-例文本框中只能输入大写字母PrivateSubForm_KeyPress(KeyAsciiAsInteger)IfKeyAscii=65AndKeyAscii=90ThenText1.Text=Text1.Text&Chr(KeyAscii)EndIfEndSubPrivateSubText1_KeyPress(KeyAsciiAsInteger)KeyAscii=0EndSub把窗体的KeyPreview属性设置为TrueKeyDown和KeyUp事件SubForm_KeyDown(keycodeAsInteger,shiftAsInteger)Sub对象_KeyDown([indexAsInteger,]keycodeAsInteger,shiftAsInteger)SubForm_KeyUp(keycodeAsInteger,shiftAsInteger)Sub对象_KeyUp([indexAsInteger,]keycodeAsInteger,shiftAsInteger)Shift参数与鼠标事件过程的Shift相同KeyCode:键盘扫描码KeyPressKeyDown和KeyUp事件发生的时间输入一个ASCII字符按任意一个键参数值KeyAscii接收到字符的ASCII值KeyCode接收到键的扫描码按Shift+A时事件发生的次数事件发生一次事件发生两次按Shift+A时参数值(键盘处于大写状态)97第一次是16第二次是65按Shift+A时参数值(键盘处于小写状态)65第一次是16第二次是65KeyPress和KeyCode区别拖放拖放是一种重要的鼠标操作,VB提供的与鼠标拖放有关的属性、方法和事件为:DragMode属性有两个取值:0和1(缺省是0)•取0时,手工拖动模式。必须在MouseDown事件过程中,使用Drag方法启动拖操作•取1时,自动拖动模式,该控件不再接收Click和MouseDown事件。拖放Drag方法用于除Line、Menu、Shape、Timer、CommonDialog之外的任何控件的开始、结束、取消拖动操作。对象名称.drag[action]action参数取值:•0-取消拖放操作,不调用DragDrop事件过程•1-开始拖放操作,调用DragDrop事件过程,缺省设置•2-结束拖放操作,调用DragDrop事件过程拖放DragOver事件当拖动源对象到某个对象上时,触发该对象的DragOver事件Sub对象名_DragOver(SourceAsControl,XAsSingle,YAsSingle,StateAsInteger)EndSubSource是被拖动的控件,含有被拖动对象的属性x,y为当前鼠标指针的坐标位置State是一个整数,可取0,1,2拖放DragDrop事件当拖动源对象到某个对象上释放鼠标时,或使用Drag方法,将其值设为2时,触发该对象的DragDrop事件Sub对象名_DragDrop(SourceAsControl,XAsSingle,YAsSingle)EndSub•x,y为释放鼠标按钮时鼠标指针的坐标位置拖放-例1在窗体上可任意拖动的图标PrivateSubForm_DragDrop(SourceAsControl,XAsSingle,YAsSingle)Picture1.MoveX,YEndSubPicture1的DragMode=1拖放-例2对象属性属性值窗体Width4650Height2175NameDragStripCaptionDragStrip手动拖动模拟文件操作:从文件夹中取出文件,放入文件柜,放入之前先打开抽屉。对象属性属性值label1Caption(空白)Aligement1command1Caption退出拖放-例2对象属性属性值Picture1NameFolderTagFolderPictureFolder02.icoDragMode1BorderStyle0DragIconFolder01.icoPicture2NameCabinetTagCabinetPictureFiles03a.icoBorderStyle0PrivateSubCommand1_Click()EndEndSub拖放-例2PrivateSubcabinet_DragOver(SourceAsControl,XAsSingle,YAsSingle,StateAsInteger)IfSource.Tag=FolderThencabinet.Picture=LoadPicture(files03b.ico)EndIfIfState=1Thencabinet.Picture=LoadPicture(files03a.ico)EndIfEndSubPrivateSubcabinet_DragDrop(SourceAsControl,XAsSingle,YAsSingle)IfSource.Tag=FolderThencabinet.Picture=LoadPicture(files03a.ico)Label1.Caption=FolderrecievedEndIfEndSubOLE拖放把数据从一个控件或应用程序中移到另一个控件或应用程序中,就是OLE拖放OLEDragMode属性(源控件设置)•0-Manual:缺省,手工•1-Automatic:自动OLEDropMode属性(目标控件设置):•0-None:缺省,目标控件不接受“放”;•1-Manual:手工实现“放”操作;•2-Automatic:自动实现“放”OLE拖放VB中几乎所有的控件都支持OLE拖放•完全支持自动OLE拖放PictureBox、