1、4 模拟用户操作。我们冇时希望模拟用户的操作,比如关闭其他应用程序的窗口。其实只耍我们能知 道那个窗口的句柄,我们就可以发送WM.CLOSE消息给那个窗口,窗口接受到这条消息就会关闭,如同用 户关闭窗口一样3. wParam 4Param:附加的消息信息。这两个是可选的参数,用來捉供关于wMsg消息更多的信息,不同的wMsg可能使 用这两个参数中的0、1或2个,如果不需要哪个附加参数,则将实参赋为NULL (在VB中赋为0)。IParam 定义为Any类型。指定Any类型可禁止VB进行类型检査,从而允许将任意数据类型传递给该过程。由于 每条消息対参数的类型和传递方式的要求都不同:有的可能要求为
2、Long型,有的可能要求为自定义类型; 大多数要求按传值方式传递,但也有一些要求按传地址方式。为了满足各种要求,我们将这个参数定义为 Any类型。比如,我们要传递一个Long型变量IData。如果消息要求传地址方式传递,可以使用: SendMessage , I Data而如果要求传值方式传递,则使用SendMessage , By Vai I Data如果传递常数,我们则需要使用类型后缀来指定常数的类型,比如”0&爲表示Long型的常数0,如 SendMessage By Vai 0&我们也可以使用类型转换函数CLng将常数指定为Long型,如CLng(O)。程序中,有时定义IParam A
3、s Any,有时定义By Vai IParam As String.,这是为什么呢对于SendMessage函数,IParam的使用是很灵活的,在一般情况下,IParam是一个指针,它指向的数据类型有 三种:长整形、口定义数据结构类型、字符串类型。对于前两种类型,需要将IParam定义为IParamAsAny, 从而将IParam数据的指针传递到SendMessage函数。对于字符串类型,则需要定义Byval I Pa ram As String,因为字符串类型数据不同,只有定义ByVai,得到的才是字符串的指针,如果没有ByVai,得到的将 是指向字符串指针的指针。另外对于少数的消息來说,S
4、endMessage函数需要的只是IParam本身的值,这 时就需要将IParam定义为Byval IParam As Long,或者在程序调用时在IParam之前加By Vai当用户在编辑控件上进行各种操作时,共父窗口将收到WM_COMMAND通知消息,IParam带控件句 柄(hWnd),同时wParam的低16位带控件的ID,高16位带有如下表的消息代码: 常用编辑控件消息:EC_LEFTMARGIN(&H1) EC_USEFONTINF 设置左边距时使用EC_RIGHTMARGIN EC_USEFONTINF 设置右边距时使用EC_USEFONTINF,O,边距设置编辑控件的左、右边距
5、,当wParam含EC_LEFTMARGIN时在IParam的低16位 指定左边距点数,当wParam含EC_RIGHTMARGIN时在IParam的高16位指定右边距点数。当指定wParam 为EC_USEFONTINFO吋,则用当前字体的字符“A“的宽度指定右边距和字符“C”的宽度指定左边距IParam被 忽略。EM_CHARFROMPOS(&HD7=215)A取得编辑控件屮指定位置的字符相对于文本头部的偏移量。使川本操作 应先在第4个参数的高16位指定行号,低16位指定列号(或一个POINTAPI结构),行列是按编辑控件的客 户区左上角为原点(0,0)计算的。如果指定的位置超出控件客户区
6、则返冋1EM_CANUNDO(&HC6=198)A0 决定前一次编辑操作是否能够撤消:检测控件撤消缓冲区是否为空,通常 控件把故后一次在控件的编辑操作保存在一个撤消缓冲区,如果缓冲区非空则返回TRUE表示上次操作可 以撤消,否则返回FALSE,应用程序可以利用该返回值來禁止或允许菜单或工具条的“撤消“项。EM_EMPTYUNDOBUFFER(&HCD=205 ),0,0消除控件的撤消缓冲区,使其不能撤消前-次编辑操作 EM_FMTLINES(&HC8=200) 决定是否在取冋的文本宇串中包含软冋车字符EM_GETFIRSTVISIBLEINE(&HCE=206),0z0获得文木控件中处f可见位
7、置的最顶部的文木所在的行号 EM_GETLINE(&HC4=196 ),行号,ByVai变量获取编辑控件某一行的内容,变量须预先赋空格 EM_GETLINECOUNT(&HBA=186,0/0获取编辑控件的总行数EM_GETMODIFY(&HB8=184)zO,0判断编辑控件的内容是否己发生变化,返回TRUE则控件文本己被修改, 返冋FALSE则未变。EM_GETPASSWORDCHAR( ),0,0 获取编辑控件的密码字符,返回NULL表示没有字符 EM_GETRECT(&HB2=178),0,结构 获取编辑控件的格式化矩形EM_GETTHUMB(&HBE=190)A0取得多行文木编辑控件的
8、滚动框的当前位置(注惫:是象素值) EM_GETSEL(&HB0=176)/0,变屋获取光标位置(以字节数表示),或:(缓冲区起点,缓冲区终点)取得编辑控件中 选定内容的范围,返回值中低16位为起点,高16位为终点EM_GETHANDLE(&HBD=189),0,0 取得文木缓冲区EM_GETWORDBREAKPROC(&HD1=209)Z0,0 取得整字换行回调两数 EditWordBreakProc 指针 EM_GETLIMITTEXT(WM_USER+37=1061),0/0获取一个编辑控件屮文本的最大长度EM_GETMARGINS( ),0,0获取编辑控件的左、右边距,返回值低16位为
9、左边距,高16位为右边距(不得用于 NT3. 51)EM_LMTTEXT(&HC5“97),最大值,0设置编辑控件中的文木长度EM_SCROLLCARET(&HB7=183),0,0把可见范用移至光标处EM_LINEFROMCHAR(&HC9=201)Z偏移值,0获取指定位置(或:-1,0表示光标位置)所在的行号 EM_LINEINDEX(&HBB=187L行号,0获取指定行(或:-1,0表示光标所在行)首字符在文木中的位置(以字节数表 示)EM_UNELENGTH(&hCl=193),偏移值,0获取指定位置所在行(或,0表示光标所在行)的文本长度(以字节数表示)EM_POSFROMCHARP
10、OINT,结构地址,偏移值取得指定字符位置的行列号,偏移值是字符相对于文本头部的 偏移。EM_LINESCROLL(&HB6=182),列数,行数指定行数的文木水平滚动,每次滚动N列EM_EXGETSEL (&H434 = 1076)EM_EXSETSEL(&H437=1079)/0/结构RichEdit控件设置文本选定范围,参阅EM_SETSEL消息,结构是指 CHARRANGE 结构EM_PASTESPECIAL(&H440=1088)/2(l),l RichEdit 控件粘贴剪贴板中的位图(或文本) EM_FINDTEXT(&H738=1080) RichEdit 控件正文搜索操作EM_
11、FINDTEXTEX(&H44F=1103)同上EM_SETTEXTEX(&H461=1121) RichEdit 控件正文替换/插入操作EM_SETTARGETDEVICE, GetDC(RichText.hWnd), RichText.Width / 15)设置 RichTextBox 口动换行,后续代码是: RichText.RightMargin = iif(RichText.RightMargin = 0,1,0)EM_SETTARGETDEVICE, 0,1 设置 RichTextBox 不自动换行EM_POSFROMCHAR(&HD6或&H426)判断指定字符在编辑控件的位置(用
12、于NT3. 51) EM_SCROLL(&HB5=181),*,0文本垂直滚动。第三个参数*控制滚动方向:SB_LINEDOWN(1)向下滚动一行, SB_UNEUP(0)向上滚动一行,SB_PAGEDOWN向下滚动一页,SB_PAGEUP向上滚动一页。EM_REPLACESEL(&HC2=194),l(0)z字符串用指定字符串替换编辑控件中的当前选定内容,如果第三个参数 wParam为1,则本次操作允许撤消,0禁止撤消。字符审可用传值方式,也可用传址方式(例:SendMessage Textl.hwnd, EM_REPLACESEL, 0, Text2.Text 这是传值方式)EM_SETS
13、EL(&HB1=177),起点,终点设置编辑控件屮文本选定内容范围(或设置光标位置),该范囤被反相显 示,用于为复制、替换、粘贴、剪切、删除等编辑功能指定范围,光标将被移至指定的终点后面。还可使 用指定相同起点和终点来移动光标而不是选定范围。当指定的起点等于0和终点等于1时,文本全部被选 中,此法常用在清空编辑控件。当指定的起点等于2和终点等于时,全文均不选,光标移至文本未端, 此法常用在文本未端追加内容。注意:当控件没有输入焦点时,本操作将会失败,一般在执行本操作前都 应调用SetFocus先取得输入焦点。EM_UNDO(&HC7J99),0,0撤消前一次编辑操作,当重复发送木消息,控件将在
14、撤消和恢复中來回切换 EM_SETCHARFORMAT(&H444)改变选定文本的颜色EM_SETHANDLE (&HBO188),缓冲区指针,0为编辑控件指定新的文木缓冲区。此操作仅适用对话框创建带 DS_LOCALEDIT风格的控件。EM_SETLIMITTEXT,t度(字节),0设置编辑控件屮的文本最大长度(不得用于NT3. 51) EM_SETMARGINS(&HD3=211)设置编辑控件的左、右边距(不得用于NT3. 51) EM_SETMODIFY(&HB9=185)4(OLO设置或淸除-个编辑控件的修改标志 EM_SETPASSWORDCHAR(&HCC=204)Z字符,0指定控
15、件用來显示密码的字符,缺省为”初。当第三个参数 wParam为0时,本操作将清除控件的ES_PASSWORD风格,并按实际字符显示。EM_SETREADONLY(&HCF=207),1(0)/0决定是否将编辑控件设为只读,同时决定控件的ES_READONLY风格 EM_SETRECT(&HB3=179)/0(或RECT),结构地址为一个编辑控件设置格式化矩形EM_SETRECTNP(&HB4=180)z0(或RECT),结构地址为一个编辑控件设置格式化矩形,只是控件此时不会重画 EN_CHANGE(&H300=768)编辑控件的内容发生改变。与EN_UPDATE不同,该消息是在编辑框显示的正文
16、被 刷新后才发出的。EN_ERRSPACE(&H500=1280)任何时候只要由于内存不足以完成一项编辑操作EN_HSCROLL(&H601=1537)用户单击了编辑控件的水平滚动条。这条消息是在控件更新显示之前发 送出去的。EN_VSCROLL(&H602=1538)用户单-击了编辑控件的乖直滚动条。EN_KILLFOCUS(&H200=512)编辑控件失去了输入焦点EN_SETFOCUS(&H100=256)编辑控件获得了输入焦点EN_UPDATE(&H400=1024)控件准备显示改变了的正文时发送该消息。它与EN_CHANGE通知消息相似,只 是它发生于更新文本显示出来Z前。EN_MA
17、XTEXT(&H501=1281)用户输人的文字数超出由EM_LIMITTEXT消息规定的界限,或超出由VB Maxlength属性规定的界限,就会发送这条消息。此外,倘若不允许口动进行水平滚动,同时插入点要超出 控件的宽度;或者不允许自动垂直滚动,同时插入点要超出控件的高度,那么也会触发这条消息。在没有 ES_AUTOHSCROLL或ES_AUTOVSCROLL的编辑框中,当正文超出了编辑框的边框吋也会发出该消息。编辑风格消息:ES_MULTILINE 指定编辑控件能否进行多行文本编辑,若多行编辑器不指定ES_AUTOHSCROLL风格,则会 口动换行,用户每按一次Enter,在当前光标处输
18、入一个回车换行符(ODh,OAh),文木增加一行。若不指定 ES_AUTOVSCROLL,则多行编辑器会在窗口中正文装满时发出警告声响。ES_LEFT文木显示居左ES_CENTER文本显示居中ES_RIGHT文本显示居右ES_LOWERCASE把用户输入的字母统统转换成小写字母ES_UPPERCASE把用户输入的字母统统转换成人写字母ES_OEMCONVERT把输入的文本从ANSI码转换成OEM码,然后乂转换成ANSI码,H的是保证函数 AnsiToOem的正确调用。这在编辑框屮包含文件名时是很有用的。ES_AUTOHSCROLL (自动增加水平滚动条)当用户在行尾键入一个字符时,正文将自动向
19、右滚动10个字符, 当用户按回车键时,正文总是滚向左边。ES_AUTOVSCROLL 当用户在最后一个可见行按回车键时,正文向上滚动一页。ES_NUMBER 只接收数码输入,其它字符输入-律无效。ES_NOHIDESEL(&H100=256)当编辑框失去输入焦点时,选中的文本将隐藏,正文中的选择保持不变。缺省 时正文中的选择将失效,当获得输入焦点后才又显示出來。ES_READONLY将编辑框设胃成只读的ES_PASSWORD(&H20=32)使所有键入的字符都用”和来显示。ES_WANTRETURN使多行编辑器接收回车键输入并换彳亍。如果不指定该风格,按冋乍键会选择缺省的命令 按钮,这往往会导
20、致对话框的关闭。列表框操作:LB_FINDSTRING(&H18F=399),-l/ByVal字串査找列表项的字符串,返回值=字符串所在的列表项的索引。J 表示从第0行开始查找,如果改为一个有效的列表项索引值,将从该行开始查找。LB_ITEMFROMPOINT(&H1A9=425)获取光标所在的列表项的索引 LB_SETHORIZONTALEXTENT(&H194=404),长度,0设置列表框的横向滚动条以及滚动长度,长度为象索值 组合框操作:CB_SHOWDROPDOWN(&H14F),1(0),0 打开(关闭)组合框的列表TVM_SETBKCOLOR(&HHOO+29=4381)设置扩展树
21、型列表控件的背景色(TVM开头的常数)常用窗口消息:WM_GETFONT(&H31=49)得到当前控件绘制文本的字体(的句柄)WM_GETTEXT(&HD=13)Z变量长度,变量取得窗体的标题,变量须预先赋空字串(chr(O),变量氏度二Len(变量) WM_SETTEXT(&HC=12),0?ByVal H字串”设置窗体的标题WM_NCLBUTTONDOWN(&HAl=161)/2/0在非客户区,即边框及标题栏上(假如定义的是一个组件,则非客 户区包fS Form等)按下鼠标左键;WM_LBUTTONDOWN(&H201=513)Z2,0在客户区,也就是除边框及标题栏以外按下鼠标左键 WM_
22、VSCROLL(&H115=277),&H10000*p+SB_THUMBPOSITION(&H4),0 同步滚动文本,p 是位置改变量 WM_PAINTWM_USER (&H400 = 1024)WM_CUT(&H300=768),0,0 剪切 WM_COPY(&H301=769)A0 复制WM_PASTE(&H302=770),0z0 粘贴WM_CLEAR(&H303=771)z0,0 删除WM_UNDO(&H304=772),0,0 撤消按纽消息:BM_SETSTYLE(&HF4)设置按纽样式BS_RADIOBUTTON(&H4)收音机旋纽式的按纽,是BM_SETSTYLE使用的参数 S
23、endMessage 隊|数应用(一)在Windows系统的很多消息中,有-些不仅仅是提供-个窗口消息那么简单。它们可以控制窗口的 动作和属性。下面向大家介绍SendMessage函数在扩充列表(ListBox)控件功能方面的应用。在Windows中,冇一系列的以LB_开头的列表消息,这里介绍的就是利用LB消息控制的ListBox 的应用1使列表中光标移动到不同的列表项上有不同的提示(ToolTip)在列表框控件中有一个ToolTipText属性,该属性决定了当光标在列表框上移动时出现的提示文 字。但是如何使得当光标在不同的列表项上移动时的提示文字也不同呢问题的关键是要知道在光标移 动时光标所
24、在的列表项的索引,使用SendMessage函数发送LBJTEMFROMPOINT消息就可以获得。在Forml中加入一个ListBox控件,运行程序,当光标在列表中移动时,可以看到根据光标所在 的不同的列表项,提示文字也不相同。代码如下(我己试验成功):Const LB_ITEMFROMPOINT = &H1A9Private Sub Form_Load()Dim ZXS As LongDrivel.Drive = G: Dirl.Path = ”G:江秋水的文档”Combol.Text = Combol.List(O)ZXS = SendMessage(Textl.hwnd86, 0, 0)
25、Labell.Caption =共 “&ZXS&” 行,& Len(Text 1.Text) &字”For i = 1 To 200: Listl.Additem str(i) + n 列表框试验项 U NextEnd SubPrivate Sub Listl_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)Dim IXPoint As Long, lYPoint As Long, llndex As LongIf Button = 0 Then,确定在移动鼠标的同时没有按卞功能键或者鼠标键IXPo
26、int = CLng(x / Screen.TwipsPerPixelX)获得光标的位置,以像素为单位lYPoint = CLngfy / Screen.TwipsPerPixelY)With Listlllndex = SendMessage(.hwnd, LBTEMFROMPOINT, 0, ByVai (lYPoint * 65536) + IXPoint)1 获得光标所在的标题 行的索引If llndex 丄istCount Then .TooltipText = .List(llndex) Else .TooltipText = ,M,End WithEnd If2向列表中加入横向滚
27、动条使得可以浏览长列表项当向列表中加入的列表项超出了列表的显示范围后,列衣并不会出现横向滚动条让你可以通过滚动来 浏览项H的全部内容。利用LB_SETHORIZONTALEXTENT消息可以设置列表框的横向滚动条以及滚动长度。在Forml中加入一个ListBox控件,运行程序,可以看到列表中出现了横向滚动条,而且滚动范围正 好是列表项的长度代码如下(我己试验成功):Option ExplicitPrivate Type RECTLeft As LongTop As LongRight As Longbottom As LongEnd TypePrivate Declare Function D
28、rawText Lib Alias DrawTextA11 (ByVai hDC As Long, _By Vai IpStr As String, By Vai nCount As Long, IpRect As RECT, By Vai wFormat As Long) As LongPrivate Declare Function SendMessage Lib user32H Alias SendMessageA11 (ByVai hwnd As Long, _By Vai wMsg As Long, By Vai wParam As Long, IParam As Any) As LongConst LB_SETHORIZONTALEXTENT = &H194Const DTJZALCRECT = &H400Public Function ListTextWidth(ByRef IstThis As ListBox) As Long 获取最上项 U 的象素上度值Dim i As LongDim tR As RECTDim IW As LongDim IWidth As LongDim IHDCAs LongWith IstThis.Parent.Font.
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2