⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vb函数sendmessage的应用_不燃灯.htm

📁 自己总结的一些VB资料
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      Form_Load()<BR>Dim iFile<BR>Dim astr As String</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Label1.Height = 
      300: Label2.Height = 300<BR>Text1.Left = 0: Text1.Top = 0<BR>Text1.Text = 
      ""<BR>Label1.Caption = ""<BR>Label2.Caption = ""</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>iFile = 
      FreeFile<BR>Open "C:\windows\readme.txt" For Input As #iFile<BR>Do<BR>Line 
      Input #iFile, astr<BR>Text1.Text = Text1.Text + astr + vbCrLf<BR>Loop 
      Until EOF(iFile)<BR>Close iFile<BR>End Sub</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Sub 
      Form_Resize()<BR>Label1.Top = Me.ScaleHeight - 300<BR>Label2.Top = 
      Me.ScaleHeight - 300</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Label1.Left = 0: 
      Label2.Left = 1200<BR>Label1.Width = 1200<BR>Label2.Width = 
1200</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Text1.Width = 
      Me.ScaleWidth<BR>Text1.Height = Me.ScaleHeight - Label1.Height<BR>End 
      Sub</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Sub 
      Text1_Click()<BR>GetCurPos Text1<BR>End Sub</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Sub 
      Text1_KeyUp(KeyCode As Integer, Shift As Integer)<BR>GetCurPos 
      Text1<BR>End Sub</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>在运行程序前,确保在你的硬盘上有 
      c:\windows\readme.txt 
      这个文件。否则程序会出错。然后运行程序。当在编辑文本时,可以看到在窗口底部可以显示当前光标所在的行、列值。在上面的程序中。我们首先发送EM_LINEINDEX消息,发送该消息可以返回某一行的第一个字符在整个文本控件中的位置,如果wParam参数设置为-1,则返回当前行的字符位置。然后发送EM_LINEFROMCHAR,发送该消息可以根据参数wParam指定的字符位置返回该字符所在的行号,文本第一行的位置为0。这样使用这两个消息就获得当前光标所在的行号。要取得列号,首先发送EM_GETSEL消息,发送该消息返回当前被选中文本的起始位置,如果没有文本被选中,则返回当前光标所在字符在文本中的位置。由于上面的EM_LINEINDEX消息返回的是当前行的第一个字符在文本中的位置。所以将两值相减,就是光标所在字符的列位置。在上面的程序中,如果你的文本中有中文字符的话,当你的光标在中文字符中移动一个位置,你会看到标签中的列位置增加了2,这是由于SendMessage发送的消息所得到的结果是不支持中文的,它将一个中文字算做两个字符。这也算是程序中的一个Bug吧(这也就是为什么我要使用EM_GETSEL消息而不直接使用TextBox控件的SelStart属性来获取光标所在字符位置了,因为如果使用SelStart返回的值将一个中文算一个字符,同EM_LINEINDEX返回值相减有可能得到负值),如果你有什么更好的建议,欢迎到我的主页 
      http://member.netease.com/~blackcat同我讨论。</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>2、获得文本控件中整行文本<BR>利用EM_GETLINE消息我们可以获得文本控件中某一行的文本。具体的范例如下:</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Option 
      Explicit</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Declare 
      Function SendMessage Lib "user32" Alias "SendMessageW" _<BR>(ByVal hwnd As 
      Long, ByVal wMsg As Long, ByVal wParam As Long, _<BR>lParam As Any) As 
      Long<BR>Private Declare Function SendMessageStr Lib "user32" Alias 
      "SendMessageA" _<BR>(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam 
      As Long, _<BR>ByVal lParam As String) As Long</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Const 
      EM_LINEFROMCHAR = &amp;HC9<BR>Const EM_LINEINDEX = &amp;HBB<BR>Const 
      EM_GETLINE = &amp;HC4</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Sub 
      Text1_Click()<BR>Dim astr As String<BR>Dim l, iLineY As Long</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>astr = 
      Space(1024)<BR>l = SendMessage(Text1.hwnd, EM_LINEINDEX, -1, 0)<BR>iLineY 
      = SendMessage(Text1.hwnd, EM_LINEFROMCHAR, l, 0)<BR>l = 
      SendMessageStr(Text1.hwnd, EM_GETLINE, iLineY, ByVal astr)<BR>Me.CurrentX 
      = 30: Me.CurrentY = 30<BR>Me.Print "该行包含文本长度:" + Str(l)<BR>Text2.Text = 
      Trim(astr)<BR>End Sub</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>要运行上面的程序,首先你要在Form中加入两个TextBox控件,并将Text1的MultiLine属性设置为True。然后运行程序,在text1中点击鼠标,Text2中就会显示光标所在行的文本。</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>3、其它消息<BR>下面介绍一些控制TextBox控件行为的消息<BR>EM_GETFIRSTVISIBLELINE<BR>发送EM_GETFIRSTVISIBLELINE消息可以获得文本控件中处于可见位置的最顶部的文本所在的行。如果消息处理成功,将返回该行的索引,以0为基数。<BR>EM_LINESCROLL<BR>发送该消息可以控制textBox水平或垂直滚动。参数wParam指定水平滚动的字符数。参数lParam指定垂直滚动的行数,定义以及调用方法如下:</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Declare 
      Function SendMessage Lib "user32" Alias "SendMessageW" _<BR>(ByVal hwnd As 
      Long, ByVal wMsg As Long, ByVal wParam As Long, _<BR>lParam As Any) As 
      Long</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Const 
      EM_LINESCROLL = &amp;HB6</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>SendMessage 
      Text1.hwnd, EM_LINESCROLL, 5, ByVal 1 
'将Text1中的文本向下滚动1行,向右滚动5个字符</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>EM_SETREADONLY<BR>发送该消息可以设置文本控件是否具有只读属性,如果将SendMessage参数wParam设置为True,则控件具有只读属性,否则控件可读写。范例如下:</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Const 
      EM_SETREADONLY = &amp;HCF<BR>SendMessage Text1.hwnd, EM_SETREADONLY, True, 
      0 '设置text1为只读</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>EM_UNDO<BR>发送该消息将使文本控件回复上一次的操作,相当于运行时在文本控件的右键菜单中选择"撤销"操作。</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列表(TreeView)控件的功能。相信对于树型列表控件大家十分的熟悉,典型的应用就是Windows资源管理器中的目录列表。而在VB中,树型列表控件包含在Microsoft 
      Windows Common Control 6.0(页可能是5.0,视你的VB或者系统版本而定)中。在Windows 
      API中,有一系列的以TVM_ 开头的消息值,这些消息就是扩展树型列表控件所特定的消息值,下面向大家介绍其中的一些应用</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>1、设置树型列表控件的背景颜色<BR>首先做如下的定义:<BR>Private Declare Function 
      SendMessage Lib "user32" Alias "SendMessageA" _<BR>(ByVal hwnd As Long, 
      _<BR>ByVal wMsg As Long, _<BR>ByVal wParam As Long, _<BR>ByVal lParam As 
      Long) As Long</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Const TV_FIRST = 
      &amp;H1100<BR>Const TVM_SETBKCOLOR = TV_FIRST + 29<BR>然后再做如下调用:<BR>Call 
      SendMessage(TreeView1.hwnd, TVM_SETBKCOLOR, 0, RGB(255, 0, 
      0))<BR>上面的SendMessage调用将TreeView1的背景颜色设置为红色。<BR>大家可能注意到了。在上面的Sendmessage函数定义中,我们将lParam定义为 
      ByVal lParam As 
      Long,而不是象前面的那些范例那样定义为Any或者String类型,关于这个问题,我会在最后的一章中做介绍。</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>2、设置树型列表控件标题行高度<BR>利用TVM_SETITEMHEIGHT消息可以设定控件的标题行的高度,该消息的定义及调用方法如下:<BR>定义:<BR>Const 
      TV_FIRST = &amp;H1100<BR>Const TVM_SETITEMHEIGHT = TV_FIRST + 
27</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Declare 
      Function SendMessage Lib "user32" Alias "SendMessageA" _<BR>(ByVal hwnd As 
      Long, _<BR>ByVal wMsg As Long, _<BR>ByVal wParam As Long, _<BR>lParam As 
      Any) As Long<BR>调用:<BR>Call SendMessage(TreeView1.hwnd, TVM_SETITEMHEIGHT, 
      60, 0)<BR>上面的代码将TreeView1的标题行高度设置到60像素高</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>3、为树型列表控件中不同的标题行设置不同的提示<BR>在第一期的ListBox控件介绍中,我向大家介绍了如何为列表中的每一个标题行设置不同的提示(ToolTips),在这里为要向大家介绍如何为树型列表控件中的每一个标题设置不同的提示。同ListBox控件不通,树型列表控件中并没有根据光标位置获得标题行索引的消息,我们需要另外想办法。在TVM类消息中有一个TVM_HITTEST消息,发送该消息可以检测控件表面上的某一点,如果该点位于一个标题上,则返回该标题的句柄。 
      而利用TVM_GETITEM消息,则可以根据标题句柄返回该标题行的文本。所以结合利用这两个消息可以获取光标所在标题行的标题文本。具体的范例代码如下:</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Option 
      Explicit</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Type 
      TPoint<BR>x As Long<BR>y As Long<BR>End Type</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Type 
      TVHITTESTINFO<BR>pt As TPoint<BR>flags As Long<BR>hItem As Long<BR>End 
      Type</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Type 
      TVITEM<BR>mask As Long<BR>HTreeItem As Long<BR>state As Long<BR>stateMask 
      As Long<BR>pszText As Long<BR>cchTextMax As Long<BR>iImage As 
      Long<BR>iSelectedImage As Long<BR>cChildren As Long<BR>lParam As 
      Long<BR>End Type</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Const TV_FIRST = 
      &amp;H1100<BR>Const TVM_HITTEST = TV_FIRST + 17<BR>Const TVM_GETITEM = 
      TV_FIRST + 12<BR>Const TVHT_ONITEMLABEL = &amp;H4<BR>Const TVIF_TEXT = 
      &amp;H1<BR>Const GMEM_FIXED = &amp;H0</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Declare 
      Function SendMessageRef Lib "user32" Alias "SendMessageA" _<BR>(ByVal hwnd 
      As Long, _<BR>ByVal wMsg As Long, _<BR>ByVal wParam As Long, _<BR>lParam 
      As Any) As Long<BR>Private Declare Sub CopyMemory Lib "kernel32" Alias 
      "RtlMoveMemory" _<BR>(ByVal Destination As String, _<BR>ByVal Source As 
      Long, _<BR>ByVal Length As Long)<BR>Private Declare Function GlobalAlloc 
      Lib "kernel32" _<BR>(ByVal wFlags As Long, _<BR>ByVal dwBytes As Long) As 
      Long<BR>Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As 
      Long) As Long</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Dim hItemPrv As 
      Long</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Sub 
      Form_Load()<BR>Dim ndX As Node</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>'加入若干Item<BR>Set 
      ndX = TreeView1.Nodes.Add(, , "R", "Root")<BR>Set ndX = 
      TreeView1.Nodes.Add("R", tvwChild, "Key1", "Node1")<BR>Set ndX = 
      TreeView1.Nodes.Add("Key1", tvwChild, "SubKey1", "SubNode1")<BR>Set ndX = 
      TreeView1.Nodes.Add("SubKey1", tvwChild, "SubKeys1", "SubNode1")<BR>Set 
      ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey2", "SubNode2")<BR>Set 
      ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey3", "SubNode3")<BR>Set 
      ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey4", "SubNode4")<BR>End 
      Sub</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Sub 
      TreeView1_MouseMove(Button As Integer, Shift As Integer, _<BR>x As Single, 
      y As Single)</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Dim ptA As 
      TPoint<BR>Dim tf As TVHITTESTINFO<BR>Dim tv As TVITEM<BR>Dim hStr As 
      Long<BR>Dim hItem As Long<BR>Dim astr As String * 1024<BR>Dim 
      bstr</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>On Error GoTo 
      errLab</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>'获得当前光标所在的位置坐标<BR>ptA.x = Int(x / 
      Screen.TwipsPerPixelX)<BR>ptA.y = Int(y / Screen.TwipsPerPixelY)<BR>tf.pt 
      = ptA<BR>tf.flags = TVHT_ONITEMLABEL</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>'获得光标所在的Item的句柄<BR>hItem = SendMessageRef(TreeView1.hwnd, 
      TVM_HITTEST, 0, tf)<BR>'如果未获得句柄或者同上一次是同一个Item的句柄则退出<BR>If ((hItem &lt;= 0) 
      Or (hItem = hItemPrv)) Then Exit Sub</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>hItemPrv = 
      hItem<BR>'分配一定的内存空间用以存储Item的标题<BR>hStr = GlobalAlloc(GMEM_FIXED, 
      1024)</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>If hStr &gt; 0 
      Then<BR>tv.mask = TVIF_TEXT '获取标题文本<BR>tv.HTreeItem = hItem 
      'Item句柄<BR>tv.pszText = hStr<BR>tv.cchTextMax = 
      1023<BR>'发送TVM_GETITEM获得标题文本<BR>Call SendMessageRef(TreeView1.hwnd, 
      TVM_GETITEM, 0, tv)<BR>'将标题文本拷贝到字符串astr中<BR>CopyMemory astr, hStr, 
      1024<BR>bstr = Left$(astr, (InStr(astr, Chr(0)) - 
      1))<BR>TreeView1.ToolTipText = bstr<BR>'释放分配的内存空间<BR>GlobalFree 
      hStr<BR>End If<BR>Exit Sub<BR>errLab:<BR>Resume Next<BR>End Sub</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>运行上面的程序,当光标在TreeView1上面移动时,TreeView1的ToolTips就会根据光标所在的不同标题行而变动。<BR>以上程序在Win98、Win2000,VB6下编写运行通过。 
      </FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>这一期是SendMessage函数巧应用的最后一期了。在这一期中,我将向大家介绍关于RichTextBox(简称RTF)控件的消息和ListView控件的消息控制各一。</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>在Windows消息中,以EM_开头的消息是专门控制TextBox类控件和RTF类控件的。下面介绍的是如何利用EM_消息实现向RichTextBox中粘贴文本和位图.在EM_消息中,有一个EM_PASTESPECIAL消息可以从剪贴板中获取文本或者位图类数据并拷贝到RTF上。消息调用范例如下:</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Type 
      repastespecial<BR>dwAspect As Long<BR>dwParam As Long<BR>End 
      Type</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Const WM_USER = 
      &amp;H400<BR>Const EM_PASTESPECIAL = WM_USER + 64<BR>Const CF_BITMAP = 
      2<BR>Const CF_TEXT = 1<BR>Const DVASPECT_CONTENT = 1<BR>Const 
      DVASPECT_ICON = 4</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Declare 
      Function SendMessage Lib "user32" Alias "SendMessageA" _<BR>(ByVal hwnd As 
      Long, _<BR>ByVal wMsg As Long, _<BR>ByVal wParam As Long, _<BR>lParam As 
      Any) As Long</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Sub 
      Command1_Click()<BR>Dim re As repastespecial</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>re.dwAspect = 
      DVASPECT_CONTENT<BR>If Clipboard.GetFormat(vbCFText) Then 
      '剪贴板中为文本信息<BR>Call SendMessage(RichTextBox1.hwnd, EM_PASTESPECIAL, 
      CF_TEXT, re)<BR>ElseIf Clipboard.GetFormat(vbCFBitmap) Then 
      '剪贴板中为位图信息<BR>Call SendMessage(RichTextBox1.hwnd, EM_PASTESPECIAL, 
      CF_BITMAP, re)<BR>End If<BR>End Sub</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>运行程序,点击Command1,可以将剪贴板中的数据(位图或者文本)拷贝到RichTextBox1上。<BR>在EM_PASTESPECIAL,消息中,wParam定义剪贴板数据类型,lParam定义一个repastespecial类型的数据,其中的dwAspect说明<BR>数据以何种方式显示到RTF对象上,如果是DVASPECT_CONTENT 
      ,则将整个数据显示在RTF上,如果是DVASPECT_ICON ,则只在RTF上显示一个图标。</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>ListView控件也是Windows界面开发中重要的控件,典型的应用就是Windows资源管理器中的文件列表。而在VB中,ListView<BR>控件包含在Microsoft 
      Windows Common Control 6.0(页可能是5.0,视你的VB或者系统版本而定)中。在Windows 
      API中,有一系列的以LVM_ 
      开头的消息值,这些消息就是扩展ListView控件所特定的消息值,下面的范例介绍如何通过LVM_消息设置ListView控件中图标的间距。范例如下:</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Type 
      RECT<BR>Left As Long<BR>Top As Long<BR>Right As Long<BR>Bottom As 
      Long<BR>End Type</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Const LVM_FIRST = 
      &amp;H1000<BR>Const LVM_SETWORKAREA = LVM_FIRST + 65<BR>Const 
      LVM_SETICONSPACING = LVM_FIRST + 53</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Declare 
      Function SendMessage Lib "user32" Alias "SendMessageA" _<BR>(ByVal hwnd As 
      Long, ByVal wMsg As Long, _<BR>ByVal wParam As Long, lParam As Any) As 
      Long</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Private Sub 
      Form_Load()<BR>Dim xn As ListItem</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
color=#000000>Me.Show</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>ListView1.Width = 
      4500<BR>ListView1.Height = 3000<BR>ListView1.Refresh</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>Set xn = 
      ListView1.ListItems.Add<BR>xn.Text = "List1"<BR>Set xn = 
      ListView1.ListItems.Add<BR>xn.Text = "List2"<BR>Set xn = 
      ListView1.ListItems.Add<BR>xn.Text = "List3"<BR>Set xn = 
      ListView1.ListItems.Add<BR>xn.Text = "List4"<BR>Set xn = 
      ListView1.ListItems.Add<BR>xn.Text = "List5"<BR>Set xn = 
      ListView1.ListItems.Add<BR>xn.Text = "List6"</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>ListView1.Refresh<BR>Call SendMessage(ListView1.hwnd, 
      LVM_SETICONSPACING, 0, _<BR>ByVal (60 * 65536 + 190&amp;))<BR>End 
      Sub</FONT></P>
      <P><FONT style="BACKGROUND-COLOR: #ffffff" 
      color=#000000>要运行上面的程序,首先要确保ListView1的Arrange属性为1,View属性为0。在上面的程序中,我们利用了VM_SETICONSPACING<BR>消息来控制图标间距。其中SendMessage中的参数lParam定义图标间距,高位为纵向间距,低位为横向间距,在上面的范例中,我们将图标的纵向间距定义为60像素,横向间距定义为190像素。<BR>最后要向大家在介绍一下关于在SendMessage函数中lParam的定义问题。可以看到,在前面的程序中,有时候定义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,例如上面的设置ListView控件图标间距的范例中的SendMessage函数。<BR>利用SendMessage函数控制控件的行为的方法还有很多,在这些文章中介绍的只是其中的一部分,如果大家多看一下MSDN中的消息定义方面的文档的话,一定还可以找到其中的很多的妙用的。</FONT></P></DIV></TD></TR></TBODY></TABLE><BR>
<DIV class=opt><A title=查看该分类中所有文章 
href="http://hi.baidu.com/29277723/blog/category/Api">类别:Api</A> | <A 
title=将此文章添加到百度搜藏 onclick="return addToFavor();" 
href="http://cang.baidu.com/do/add" target=_blank>添加到搜藏</A> | 浏览(<SPAN 
id=result></SPAN>) | <A 
href="http://hi.baidu.com/29277723/blog/item/3ac19c0938a6ac86d0581b72.html#send">评论</A>&nbsp;(0)
<SCRIPT language=javascript>/*<![CDATA[*/var pre = [true,'关于FindWindowEx 的用法', '关于FindWindowEx 的用法','/29277723/blog/item/03fd4e4f998ddd32aec3ab78.html'];var post = [true,'vb Sendkeys','vb Sendkeys', '/29277723/blog/item/9c3113df0e34fb1748540347.html'];if(pre[0] || post[0]){	document.write('<div style="height:5px;line-height:5px;">&nbsp;</div><div id="in_nav">');	if(pre[0]){		document.write('上一篇:<a href="' + pre[3] + '" title="' + pre[1] + '">' +  pre[2] + '</a>&nbsp;&nbsp;&nbsp;&nbsp;');	}	if(post[0]){		document.write('下一篇:<a href="' + post[3] + '" title="' + post[1] + '">' +  post[2] + '</a>');	}	document.write('</div>');}/*]]>*/</SCRIPT>
 </DIV>
<DIV class=line></DIV>
<STYLE type=text/css>#in_related_doc A {
	TEXT-DECORATION: none
}
</STYLE>

<DIV id=in_related_tmp></DIV>
<SCRIPT language=javascript type=text/javascript>/*<![CDATA[*/function HI_MOD_IN_RELATED_DOC_CALLBACK(arg){    if(arg.length <= 1) return false;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -