




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VB SendMessage 函数参数详解SendMessage函数原形Declare Function SendMessage Lib user32 Alias SendMessageA (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long四个参数的含义和说明如下:1.hWnd:对象的句柄。希望将消息传送给哪个对象,就把该对象的句柄作为实参传送,在 VB 中可以简单地用“对象.hWnd”获得某个对象的句柄,如 Text1.hWnd和 Form1.hWnd分别可以得到 Text1和Form1的句柄。它是一个长整型数。Windows给每个控件一个编号,这个编号就称为窗口句柄。有了这个句柄,我们就可告诉 Windows 我们要控制哪个控件,所以这个句柄在 API 调用中至关重要。VB 的大多数控件都包括hwnd属性,如下拉框、TreeView等,窗体也有这个属性。但也有一些控件没有这个属性,如标签控件。没有这个属性就无法利用Windows API函数,但可以节省系统资源。2.wMsg:被发送的消息。根据具体需求和不同的对象,将不同的消息作为实参传送,以产生预期的动作。使SendMessage 传递消息,大多是为了完成以下几个工作:设置控件的一些选项,象我们要使用的CB_SETDROPPEDWIDTH的就属于这种情况。尽管VB的每个控件都提供了许多属性,但仍然有许多控件的选项没有包括在其中。而这些选项中的大多数都可以利用该函数进行设置获得控件的一些设置。同上一种情况相反,有时我们需要获得控件的一些设置,相当于读取属性。例如,如果想知道一个下拉框的下拉部分的宽度是多少,就可以向控件发送CB_GETDROPPEDWIDTH消息。对于这种情况,SendMessage函数的返回值就是结果。执行一定的操作。例如,我们要在下拉框中寻找是否有“ABC”这个字符串,当然,我们可以编写一个循环,逐条比较看是否存在这样的字符串。如果使用API,我们只需要向下拉框发送CB_FINDSTRING消息,这条消息就会自动进行查找工作并返回结果。模拟用户操作。我们有时希望模拟用户的操作,比如关闭其他应用程序的窗口。其实只要我们能知道那个窗口的句柄,我们就可以发送WM_CLOSE消息给那个窗口,窗口接受到这条消息就会关闭,如同用户关闭窗口一样3.wParam、4.lParam:附加的消息信息。这两个是可选的参数,用来提供关于wMsg消息更多的信息,不同的wMsg可能使用这两个参数中的0、1或2个,如果不需要哪个附加参数,则将实参赋为NULL(在VB中赋为0)。lParam定义为Any类型。指定 Any类型可禁止VB进行类型检查,从而允许将任意数据类型传递给该过程。由于每条消息对参数的类型和传递方式的要求都不同:有的可能要求为Long型,有的可能要求为自定义类型;大多数要求按传值方式传递,但也有一些要求按传地址方式。为了满足各种要求,我们将这个参数定义为Any类型。比如,我们要传递一个Long型变量lData。如果消息要求传地址方式传递,可以使用:SendMessage , lData而如果要求传值方式传递,则使用SendMessage , ByVal lData如果传递常数,我们则需要使用类型后缀来指定常数的类型,比如0&,表示Long型的常数0,如SendMessage , ByVal 0&我们也可以使用类型转换函数CLng将常数指定为Long型,如CLng(0)。程序中,有时定义 lParam As Any,有时定义 ByVal lParam As String。这是为什么呢对于SendMessage函数,lParam的使用是很灵活的,在一般情况下,lParam是一个指针,它指向的数据类型有三种:长整形、自定义数据结构类型、字符串类型。对于前两种类型,需要将 lParam定义为 lParam As Any,从而将 lParam 数据的指针传递到 SendMessage 函数。对于字符串类型,则需要定义 Byval lParam As String,因为字符串类型数据不同,只有定义 ByVal,得到的才是字符串的指针,如果没有ByVal,得到的将是指向字符串指针的指针。另外对于少数的消息来说,SendMessage 函数需要的只是lParam 本身的值,这时就需要将 lParam定义为 Byval lParam As Long,或者在程序调用时在 lParam之前加 ByVal当用户在编辑控件上进行各种操作时,其父窗口将收到 WM_COMMAND 通知消息,lParam带控件句柄(hWnd),同时 wParam 的低16位带控件的 ID,高16位带有如下表的消息代码:常用编辑控件消息:EC_LEFTMARGIN(&H1) EC_USEFONTINF 设置左边距时使用EC_RIGHTMARGIN EC_USEFONTINF 设置右边距时使用EC_USEFONTINF,O,边距设置编辑控件的左、右边距,当wParam含EC_LEFTMARGIN时在lParam的低16位指定左边距点数,当wParam含 EC_RIGHTMARGIN时在lParam的高16位指定右边距点数。当指定wParam为EC_USEFONTINFO时,则用当前字体的字符 A的宽度指定右边距和字符C的宽度指定左边距lParam被忽略。EM_CHARFROMPOS(&HD7=215),0, 取得编辑控件中指定位置的字符相对于文本头部的偏移量。使用本操作应先在第4个参数的高16位指定行号,低16位指定列号(或一个POINTAPI结构),行列是按编辑控件的客户区左上角为原点(0,0)计算的。如果指定的位置超出控件客户区则返回-1EM_CANUNDO(&HC6=198),0,0 决定前一次编辑操作是否能够撤消:检测控件撤消缓冲区是否为空,通常控件把最后一次在控件的编辑操作保存在一个撤消缓冲区,如果缓冲区非空则返回TRUE 表示上次操作可以撤消,否则返回FALSE,应用程序可以利用该返回值来禁止或允许菜单或工具条的撤消项。EM_EMPTYUNDOBUFFER(&HCD=205 ),0,0 清除控件的撤消缓冲区,使其不能撤消前一次编辑操作EM_FMTLINES(&HC8=200) 决定是否在取回的文本宇串中包含软回车字符EM_GETFIRSTVISIBLEINE(&HCE=206),0,0 获得文本控件中处于可见位置的最顶部的文本所在的行号EM_GETLINE(&HC4=196 ),行号,ByVal 变量获取编辑控件某一行的内容,变量须预先赋空格EM_GETLINECOUNT(&HBA=186,0,0 获取编辑控件的总行数EM_GETMODIFY(&HB8=184),0,0判断编辑控件的内容是否已发生变化,返回TRUE则控件文本已被修改,返回FALSE则未变。EM_GETPASSWORDCHAR( ),0,0 获取编辑控件的密码字符,返回NULL表示没有字符EM_GETRECT(&HB2=178),0,结构 获取编辑控件的格式化矩形EM_GETTHUMB(&HBE=190),0,0 取得多行文本编辑控件的滚动框的当前位置(注意:是象素值)EM_GETSEL(&HB0=176),0,变量获取光标位置(以字节数表示),或:(缓冲区起点,缓冲区终点)取得编辑控件中选定内容的范围,返回值中低16位为起点,高16位为终点EM_GETHANDLE(&HBD=189),0,0 取得文本缓冲区EM_GETWORDBREAKPROC(&HD1=209),0,0 取得整字换行回调函数EditWordBreakProc指针EM_GETLIMITTEXT(WM_USER+37=1061),0,0 获取一个编辑控件中文本的最大长度EM_GETMARGINS( ),0,0 获取编辑控件的左、右边距,返回值低16位为左边距,高16位为右边距(不得用于NT351)EM_LIMITTEXT(&HC5=197),最大值,0 设置编辑控件中的文本长度EM_SCROLLCARET(&HB7=183),0,0 把可见范围移至光标处EM_LINEFROMCHAR(&HC9=201),偏移值,0 获取指定位置(或:-1,0 表示光标位置)所在的行号EM_LINEINDEX(&HBB=187),行号,0 获取指定行(或:-1,0 表示光标所在行)首字符在文本中的位置(以字节数表示)EM_LINELENGTH(&hC1=193),偏移值,0 获取指定位置所在行(或:-1,0 表示光标所在行)的文本长度(以字节数表示)EM_POSFROMCHARPOINT,结构地址,偏移值 取得指定字符位置的行列号,偏移值是字符相对于文本头部的偏移。EM_LINESCROLL(&HB6=182),列数,行数指定行数的文本水平滚动,每次滚动N列EM_EXGETSEL (&H434 = 1076)EM_EXSETSEL(&H437=1079),0,结构 RichEdit控件设置文本选定范围,参阅 EM_SETSEL 消息,结构是指 CHARRANGE 结构EM_PASTESPECIAL(&H440=1088),2(1),1 RichEdit控件粘贴剪贴板中的位图(或文本)EM_FINDTEXT(&H738=1080) RichEdit控件正文搜索操作EM_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) 判断指定字符在编辑控件的位置(用于NT351)EM_SCROLL(&HB5=181),*,0 文本垂直滚动。第三个参数*控制滚动方向:SB_LINEDOWN(1)向下滚动一行,SB_LINEUP(0)向上滚动一行,SB_PAGEDOWN (3)向下滚动一页,SB_PAGEUP(2)向上滚动一页。EM_REPLACESEL(&HC2=194),1(0),字符串用指定字符串替换编辑控件中的当前选定内容,如果第三个参数wParam为1,则本次操作允许撤消,0禁止撤消。字符串可用传值方式,也可用传址方式(例:SendMessage Text1.hwnd, EM_REPLACESEL, 0, Text2.Text 这是传值方式)EM_SETSEL(&HB1=177),起点,终点设置编辑控件中文本选定内容范围(或设置光标位置),该范围被反相显示,用于为复制、替换、粘贴、剪切、删除等编辑功能指定范围,光标将被移至指定的终点后面。还可使用指定相同起点和终点来移动光标而不是选定范围。当指定的起点等于0和终点等于-1时,文本全部被选中,此法常用在清空编辑控件。当指定的起点等于-2和终点等于-1时,全文均不选,光标移至文本未端,此法常用在文本未端追加内容。注意:当控件没有输入焦点时,本操作将会失败,一般在执行本操作前都应调用SetFocus先取得输入焦点。EM_UNDO(&HC7=199),0,0 撤消前一次编辑操作,当重复发送本消息,控件将在撤消和恢复中来回切换EM_SETCHARFORMAT(&H444) 改变选定文本的颜色EM_SETHANDLE(&HBC=188),缓冲区指针,0 为编辑控件指定新的文本缓冲区。此操作仅适用对话框创建带DS_LOCALEDIT风格的控件。EM_SETLIMITTEXT,长度(字节),0 设置编辑控件中的文本最大长度(不得用于NT351)EM_SETMARGINS(&HD3=211) 设置编辑控件的左、右边距(不得用于NT351)EM_SETMODIFY(&HB9=185),1(0),0 设置或清除一个编辑控件的修改标志EM_SETPASSWORDCHAR(&HCC=204),字符,0 指定控件用来显示密码的字符,缺省为*。当第三个参数wParam为0时,本操作将清除控件的ES_PASSWORD风格,并按实际字符显示。EM_SETREADONLY(&HCF=207),1(0),0 决定是否将编辑控件设为只读,同时决定控件的ES_READONLY风格EM_SETRECT(&HB3=179),0(或RECT),结构地址为一个编辑控件设置格式化矩形EM_SETRECTNP(&HB4=180),0(或RECT),结构地址为一个编辑控件设置格式化矩形,只是控件此时不会重画EN_CHANGE(&H300=768) 编辑控件的内容发生改变。与EN_UPDATE不同,该消息是在编辑框显示的正文被刷新后才发出的。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通知消息相似,只是它发生于更新文本显示出来之前。EN_MAXTEXT(&H501=1281) 用户输人的文字数超出由EM_LIMITTEXT消息规定的界限,或超出由VB Maxlength属性规定的界限,就会发送这条消息。此外,倘若不允许自动进行水平滚动,同时插入点要超出控件的宽度;或者不允许自动垂直滚动,同时插入点要超出控件的高度,那么也会触发这条消息。在没有 ES_AUTOHSCROLL或ES_AUTOVSCROLL的编辑框中,当正文超出了编辑框的边框时也会发出该消息。编辑风格消息:ES_MULTILINE 指定编辑控件能否进行多行文本编辑,若多行编辑器不指定ES_AUTOHSCROLL风格,则会自动换行,用户每按一次Enter,在当前光标处输入一个回车换行符(0Dh,0Ah),文本增加一行。若不指定ES_AUTOVSCROLL,则多行编辑器会在窗口中正文装满时发出警告声响。ES_LEFT 文本显示居左ES_CENTER 文本显示居中ES_RIGHT 文本显示居右ES_LOWERCASE 把用户输入的字母统统转换成小写字母ES_UPPERCASE 把用户输入的字母统统转换成大写字母ES_OEMCONVERT把输入的文本从ANSI码转换成OEM码,然后又转换成ANSI码,目的是保证函数AnsiToOem的正确调用。这在编辑框中包含文件名时是很有用的。ES_AUTOHSCROLL(自动增加水平滚动条)当用户在行尾键入一个字符时,正文将自动向右滚动10个字符,当用户按回车键时,正文总是滚向左边。ES_AUTOVSCROLL 当用户在最后一个可见行按回车键时,正文向上滚动一页。ES_NUMBER 只接收数码输入,其它字符输入一律无效。ES_NOHIDESEL(&H100=256) 当编辑框失去输入焦点时,选中的文本将隐藏,正文中的选择保持不变。缺省时正文中的选择将失效,当获得输入焦点后才又显示出来。ES_READONLY 将编辑框设置成只读的ES_PASSWORD(&H20=32) 使所有键入的字符都用*来显示。ES_WANTRETURN使多行编辑器接收回车键输入并换行。如果不指定该风格,按回车键会选择缺省的命令按钮,这往往会导致对话框的关闭。列表框操作:LB_FINDSTRING(&H18F=399),-1,ByVal 字串查找列表项的字符串,返回值字符串所在的列表项的索引。-1表示从第0行开始查找,如果改为一个有效的列表项索引值,将从该行开始查找。LB_ITEMFROMPOINT(&H1A9=425) 获取光标所在的列表项的索引LB_SETHORIZONTALEXTENT(&H194=404),长度,0 设置列表框的横向滚动条以及滚动长度,长度为象素值组合框操作:CB_SHOWDROPDOWN(&H14F),1(0),0 打开(关闭)组合框的列表TVM_SETBKCOLOR(&H1100+29=4381) 设置扩展树型列表控件的背景色(TVM开头的常数)常用窗口消息:WM_GETFONT(&H31=49) 得到当前控件绘制文本的字体(的句柄)WM_GETTEXT(&HD=13),变量长度,变量取得窗体的标题,变量须预先赋空字串(chr(0),变量长度=Len(变量)WM_SETTEXT(&HC=12),0,ByVal 字串 设置窗体的标题WM_NCLBUTTONDOWN(&HA1=161),2,0 在非客户区,即边框及标题栏上(假如定义的是一个组件,则非客户区包括Form等)按下鼠标左键;WM_LBUTTONDOWN(&H201=513),2,0 在客户区,也就是除边框及标题栏以外按下鼠标左键WM_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),0,0 复制WM_PASTE(&H302=770),0,0 粘贴WM_CLEAR(&H303=771),0,0 删除WM_UNDO(&H304=772),0,0 撤消按纽消息:BM_SETSTYLE(&HF4) 设置按纽样式BS_RADIOBUTTON(&H4) 收音机旋纽式的按纽,是 BM_SETSTYLE 使用的参数SendMessage函数应用 (一)在Windows系统的很多消息中,有一些不仅仅是提供一个窗口消息那么简单。它们可以控制窗口的动作和属性。下面向大家介绍SendMessage函数在扩充列表(ListBox)控件功能方面的应用。在 Windows 中,有一系列的以 LB_ 开头的列表消息,这里介绍的就是利用LB消息控制的ListBox的应用1 使列表中光标移动到不同的列表项上有不同的提示 (ToolTip)在列表框控件中有一个 ToolTipText 属性,该属性决定了当光标在列表框上移动时出现的提示文字。但是如何使得当光标在不同的列表项上移动时的提示文字也不同呢问题的关键是要知道在光标移动时光标所在的列表项的索引,使用SendMessage函数发送 LB_ITEMFROMPOINT 消息就可以获得。在 Form1 中加入一个 ListBox 控件,运行程序,当光标在列表中移动时,可以看到根据光标所在的不同的列表项,提示文字也不相同。代码如下(我已试验成功):Const LB_ITEMFROMPOINT = &H1A9Private Sub Form_Load()Dim ZXS As LongDrive1.Drive = G: Dir1.Path = G:一江秋水的文档Combo1.Text = Combo1.List(0)ZXS = SendMessage(Text1.hwnd, 186, 0, 0)Label1.Caption = 共 & ZXS & 行, & Len(Text1.Text) & 字For i = 1 To 200: List1.AddItem str(i) + 列表框试验项目: NextEnd SubPrivate Sub List1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)Dim lXPoint As Long, lYPoint As Long, lIndex As LongIf Button = 0 Then 确定在移动鼠标的同时没有按下功能键或者鼠标键lXPoint = CLng(x / Screen.TwipsPerPixelX) 获得光标的位置,以像素为单位lYPoint = CLng(y / Screen.TwipsPerPixelY)With List1lIndex = SendMessage(.hwnd, LB_ITEMFROMPOINT, 0, ByVal (lYPoint * 65536) + lXPoint) 获得光标所在的标题行的索引If lIndex lWidth Then lWidth = lWNextListTextWidth = lWidth 返回最长列表项的长度(像素)End FunctionPrivate Sub Form_Load()Dim astr As StringDim iDim L As LongFor i = 1 To 10: astr = str(i) + 这是真正的长项目 + astr: List1.AddItem astr: Next 加入一个很大的列表项L = ListTextWidth(List1)SendMessage List1.hwnd, LB_SETHORIZONTALEXTENT, L, 0End Sub3 使列表框可以响应用户击键有时我们需要列表根据用户的敲入字符串自动调整列表的ListIndex到最接近的列表项,就象VB中动态响应用户输入控件属性的编辑器一样。问题的关键是如何在列表中查找含有指定字符串的列表项,使用LB_FINDSTRING消息可以在列表中查找指定字符串在 Form1 中加入一个 TextBox 控件和一个 ListBox 控件,并将 List1的 Sorted 属性设置为True。运行程序,在文本框中敲入字符,例如av gm,列表就会高亮显示相近的列表项。代码如下(已成功):Const LB_FINDSTRING = &H18FDim ST As StringPrivate Sub Form_Load()For i = 65 To 90: For j = 65 To 90: List1.AddItem Chr(i) + Chr(j): Next: Next 向List中加入列表项End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer)If Len(ST) 1 Then ST = If (KeyAscii 64 And KeyAscii 96 Or KeyAscii 123) ThenDim L As LongST = ST + Chr(KeyAscii)L = SendMessage(List1.hwnd, LB_FINDSTRING, -1, ByVal ST) 注意!当参数4传入的是字符串时,必须用ByVal传递If L Then List1.ListIndex = LEnd IfEnd Sub4.在列表框中查找匹配的项目在Win95风格的帮助系统中一般都有一个“索引”页,索引页含有一个文本框和一个列表框,当用户在文本框中输入文字时,下拉列表会动态地显示与文本框中文字最匹配的项目,为用户提供了最大的方便。这种效果在应用程序的帮助系统中很容易实现(只要按照 Win95帮助系统的正常制作过程制作就可以实现),如果想在应用程序的其它地方实现这种特性就需费一番心思了。而使用SendMessage函数实现上述特性则非常简单,甚至只需一条语句就足够了,那就是在文本框的Change事件中给列表框发一条LB_FINDSTRING(&H18F)消息,该消息告诉列表框在列表中查找匹配的项目在发LB_FINDSTRING消息时,wParam参数代表从列表框的哪一个项目后面开始查找,一般情况下该参数可定为-1,表示从List1(0)即第一项开始向后循环查找,lParam则传进欲搜索的字符串(必须采用值传递)。具体的代码和运行画面与下面的 5. 合并在一起演示。5.为ListBox添加水平滚动条在VB中,列表框控件仅提供垂直滚动条,没有设置水平滚动条的能力,当某些项目的文本宽度较长时,超出列表框宽度部分的文本就无法显示出来,因此,很有必要为ListBox添加一个水平滚动条来方便操作为添加水平滚动条,只需发一条 LB_SETHORIZONTALEXTENT(&H194) 消息给列表框即可。发送消息时,wParam为滚动条的长度(以像素为单位,可通过计算得出准确的长度,上面例2 就是如此的,也可随便给一个数字,如本例的 250),lParam无用。代码如下(已试验成功):Declare Function SendMessage Lib user32 Alias SendMessageA (ByVal hwnd As Long, _ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const LB_FINDSTRING = &H18FPublic Const LB_SETHORIZONTALEXTENT = &H194Private Sub Form_Load()List1.AddItem 软件List1.AddItem 电脑游戏List1.AddItem 电视机List1.AddItem 电视台List1.AddItem 电脑List1.AddItem 电脑游戏软件SendMessage List1.hwnd, &H194, 250, 0 为列表框添加水平滚动条End SubPrivate Sub Text1_Change()注意!当lParam传入的是字符串时,必须用ByVal传递List1.ListIndex = SendMessage(List1.hwnd, LB_FINDSTRING, -1, ByVal Text1.Text)End Sub6.在API文本浏览器里,当我们在搜索栏输入任意字母,“可用项”里以该字母开头的项目以高亮显示以引起我们注意该项是不是我们所需的象这样的功能一切提供搜索选项的程序都应该具备以下例子采用SendMessage函数实现这一技术Const LB_FINDSTRING = &H18FPrivate Sub Form_Load()Dim i As IntegerFor i = Asc(A) To Asc(Z) 给列表框添加26个字母(大写)List1.AddItem Chr$(i)NextText1 = 令文本框为空End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer)Text1 = 按下任意键则令原内容消失Text1.SelLength = 1 限制长度Text1.SelText = Chr(KeyAscii) 显示键盘符号KeyAscii = 0 禁止响应ListBox中的项目文本若与文本框的一致则选中(高亮)List1.ListIndex = SendMessage(List1.hwnd, LB_FINDSTRING, -1, ByVal CStr(Text1.Text) 经试,不需CStr函数End Sub以上程序适用于单项目为多个字母的查询,但必须注意,在TextBox的KeyPress事件中要作相应的改动SendMessage函数应用 (二)介绍如何利用消息函数来扩展树型列表 TreeView 控件的功能。相信对于树型列表控件大家十分的熟悉,典型的应用就是 Windows 资源管理器中的目录列表。而在VB中,树型列表控件包含在MicrosoftWindows Common Control 6.0(也可能是5.0,视你的VB或者系统版本而定)中。在Windows API 中,有一系列的以 TVM_ 开头的消息值,这些消息就是扩展树型列表控件所特定的消息值,下面向大家介绍其中的一些应用1 设置树型列表控件的背景颜色首先做如下的定义:Const TV_FIRST = &H1100Const TVM_SETBKCOLOR = TV_FIRST + 29(4381)调用:Call SendMessage(TreeView1.hwnd, 4381, 0, ByVal RGB(255, 0, 0)上面的SendMessage调用将TreeView1的背景颜色设置为红色大家可能注意到了。在上面的 Sendmessage 函数定义中,我们将 lParam 定义为 ByVal lParamAs Long,而不是象前面的那些范例那样定义为 Any 或者 String 类型,关于这个问题,我会在最后的一章中做介绍2 设置树型列表控件标题行高度TVM_SETITEMHEIGHT消息设定控件的标题行的高度,该消息的定义及调用方法如下:Const TV_FIRST = &H1100Const TVM_SETITEMHEIGHT = TV_FIRST + 27Call SendMessage(TreeView1.hwnd, TVM_SETITEMHEIGHT, 60, 0) 将TreeView1标题行高度设置到60像素高3 为树型列表控件中不同的标题行设置不同的提示介绍如何为树型列表控件中的每一个标题设置不同的提示。同 ListBox控件不通,树型列表控件中并没有根据光标位置获得标题行索引的消息,我们需要另外想办法。在TVM类消息中有一个TVM_HITTEST消息,发送该消息可以检测控件表面上的某一点,如果该点位于一个标题上,则返回该标题的句柄。而利用 TVM_GETITEM消息,则可以根据标题句柄返回该标题行的文本。所以结合利用这两个消息可以获取光标所在标题行的标题文本具体的范例代码如下:Option ExplicitPrivate Type TPointx As Longy As LongEnd TypePrivate Type TVHITTESTINFOpt As TPointflags As LonghItem As LongEnd TypePrivate Type TVITEMmask As LongHTreeItem As Longstate As LongstateMask As LongpszText As LongcchTextMax As LongiImage As LongiSelectedImage As LongcChildren As LonglParam As LongEnd TypeConst TV_FIRST = &H1100Const TVM_HITTEST = TV_FIRST + 17Const TVM_GETITEM = TV_FIRST + 12Const TVHT_ONITEMLABEL = &H4Const TVIF_TEXT = &H1Const GMEM_FIXED = &H0Private Declare Function SendMessageRef Lib user32 Alias SendMessageA (ByVal hwnd As _Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Sub CopyMemory Lib kernel32 Alias RtlMoveMemory (ByVal Destination As _String, ByVal Source As Long, ByVal Length As Long)Private Declare Function GlobalAlloc Lib kernel32 (ByVal wFlags As Long, ByVal dwBytes _As Long) As LongPrivate Declare Function GlobalFree Lib kernel32 (ByVal hMem As Long) As LongDim hItemPrv As LongPrivate Sub Form_Load()Dim ndX As Node加入若干ItemSet ndX = TreeView1.Nodes.Add(, , R, Root)Set ndX = TreeView1.Nodes.Add(R, tvwChild, Key1, Node1)Set ndX = TreeView1.Nodes.Add(Key1, tvwChild, SubKey1, SubNode1)Set ndX = TreeView1.Nodes.Add(SubKey1, tvwChild, SubKeys1, SubNode1)Set ndX = TreeView1.Nodes.Add(Key1, tvwChild, SubKey2, SubNode2)Set ndX = TreeView1.Nodes.Add(Key1, tvwChild, SubKey3, SubNode3)Set ndX = TreeView1.Nodes.Add(Key1, tvwChild, SubKey4, SubNode4)End SubPrivate Sub TreeView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)Dim ptA As TPointDim tf As TVHITTESTINFODim tv As TVITEMDim hStr As LongDim hItem As LongDim astr As String * 1024Dim bstrOn Error GoTo errLab获得当前光标所在的位置坐标ptA.x = Int(x / Screen.TwipsPerPixelX)ptA.y = Int(y / Screen.TwipsPerPixelY)tf.pt = ptAtf.flags = TVHT_ONITEMLABEL获得光标所在的Item的句柄hItem = SendMessageRef(TreeView1.hwnd, TVM_HITTEST, 0, tf)如果未获得句柄或者同上一次是同一个Item的句柄则退出If (hItem 0 Thentv.mask = TVIF_TEXT 获取标题文本tv.HTreeItem = hItem Item句柄tv.pszText = hStrtv.cchTextMax = 1023发送TVM_GETITEM获得标题文本Call SendMessageRef(TreeView1.hwnd, TVM_GETITEM, 0, tv)将标题文本拷贝到字符串astr中CopyMemory astr, hStr, 1024bstr = Left$(astr, (InStr(astr, Chr(0) - 1)TreeView1.ToolTipText = bstr释放分配的内存空间GlobalFree hStrEnd IfExit SuberrLab:Resume NextEnd Sub运行上面的程序,当光标在 TreeView1上面移动时,TreeView1的 ToolTips就会根据光标所在的不同标题行而变动SendMessage函数应用 (三)介绍关于RichTextBox(简称RTF)控件的消息和ListView控件的消息控制。1.在Windows消息中,以EM_开头的消息是专门控制TextBox类控件和RTF类控件的。下面介绍的是如何利用 EM_ 消息实现向 RichTextBox 中粘贴文本和位图。在 EM_消息中,有一个 EM_PASTESPECIAL 消息可以从剪贴板中获取文本或者位图类数据并拷贝到 RTF 上。运行程序,点击Command1,可以将剪贴板中的数据(位图或者文本)拷贝到RichTextBox1上。在 EM_PASTESPECIAL 消息中,wParam 定义剪贴板数据类型,lParam 定义一个 repastespecial类型的数据,其中的 dwAspect 说明数据以何种方式显示到 RTF 对象上,如果是 DVASPECT_CONTENT,则将整个数据显示在 RTF 上,如果是 DVASPECT_ICON ,则只在 RTF 上显示一个图标。经试,repastespecial 格式没有作用,因此参数4设为0即可。Private Type repastespecialdwAspect As Long 显示方式dwParam As LongEnd TypeConst WM_USER = &H400Const EM_PASTESPECIAL = 1088Const CF_BITMAP = 2Const CF_TEXT = 1Const DVASPECT_CONTENT = 1Const DVASPECT_ICON = 4Pr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025河北邯郸市中煤水文局集团有限公司社会化招聘13人笔试参考题库附带答案详解
- 2025春季福建省港口集团有限责任公司校园招聘219人笔试参考题库附带答案详解
- 卸船机班安全培训制度课件
- 2025年枣庄市重点产业链急需紧缺人才需求(900人)笔试参考题库附带答案详解
- 2025年山东土地资本投资集团有限公司春季社会招聘(10人)笔试参考题库附带答案详解
- 2025年国网河北省电力有限公司高校毕业生招聘(第二批)笔试参考题库附带答案详解
- 2025年合肥市产业投资控股(集团)有限公司校园招聘31人笔试参考题库附带答案详解
- 2025山东济南翠河玫瑰制品有限责任公司招聘7人笔试参考题库附带答案详解
- 2025四川长虹美菱国际区品牌运营中心招聘产品策划岗位4人笔试参考题库附带答案详解
- 2025内蒙古京海煤矸石发电有限责任公司招聘笔试参考题库附带答案详解
- 代加工协议合同范本
- 转基因玉米培训课件
- 3.2《学习成就梦想》教案 -2025-2026学年统编版道德与法治七年级上册
- 造血干细胞移植并发症
- 2025年GCP制度培训测试题(附答案)
- 冷库维保合同(2025版)
- 2025国核示范电站有限责任公司校园招聘笔试历年参考题库附带答案详解
- 2025年护士资格证考试试题(附答案)
- 医院实验室生物安全管理体系文件
- 生活垃圾清运工安全教育培训手册
- 普通诊所污水、污物、粪便处理方案及周边环境情况说明
评论
0/150
提交评论