• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

SendMessage函数巧应用(四)

发布: 2007-6-21 21:57 | 作者:   | 来源:   | 查看: 33次 | 进入软件测试论坛讨论

领测软件测试网

   
  SendMessage函数巧应用(四)
    这一期是SendMessage函数巧应用的最后一期了。在这一期中,我将向大家介绍关于RichTextBox(简称RTF)控件的消息和
ListView控件的消息控制各一。

在Windows消息中,以EM_开头的消息是专门控制TextBox类控件和RTF类控件的。下面介绍的是如何利用EM_消息实现向
RichTextBox中粘贴文本和位图
在EM_消息中,有一个EM_PASTESPECIAL消息可以从剪贴板中获取文本或者位图类数据并拷贝到RTF上。消息调用范例如下:

Private Type repastespecial
    dwAspect As Long
    dwParam As Long
End Type

Const WM_USER = &H400
Const EM_PASTESPECIAL = WM_USER + 64
Const CF_BITMAP = 2
Const CF_TEXT = 1
Const DVASPECT_CONTENT = 1
Const DVASPECT_ICON = 4

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Long, _
        ByVal wMsg As Long, _
        ByVal wParam As Long, _
        lParam As Any) As Long

Private Sub Command1_Click()
    Dim re As repastespecial
    
    re.dwAspect = DVASPECT_CONTENT
    If Clipboard.GetFormat(vbCFText) Then   注释:剪贴板中为文本信息
        Call SendMessage(RichTextBox1.hwnd, EM_PASTESPECIAL, CF_TEXT, re)
    ElseIf Clipboard.GetFormat(vbCFBitmap) Then 注释:剪贴板中为位图信息
        Call SendMessage(RichTextBox1.hwnd, EM_PASTESPECIAL, CF_BITMAP, re)
    End If
End Sub
运行程序,点击Command1,可以将剪贴板中的数据(位图或者文本)拷贝到RichTextBox1上。
在EM_PASTESPECIAL,消息中,wParam定义剪贴板数据类型,lParam定义一个repastespecial类型的数据,其中的dwAspect说明
数据以何种方式显示到RTF对象上,如果是DVASPECT_CONTENT ,则将整个数据显示在RTF上,如果是DVASPECT_ICON ,则只在
RTF上显示一个图标。

ListView控件也是Windows界面开发中重要的控件,典型的应用就是Windows资源管理器中的文件列表。而在VB中,ListView
控件包含在Microsoft Windows Common Control 6.0(页可能是5.0,视你的VB或者系统版本而定)中。在Windows API中,
有一系列的以LVM_ 开头的消息值,这些消息就是扩展ListView控件所特定的消息值,下面的范例介绍如何通过LVM_消息设置
ListView控件中图标的间距。范例如下:

Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type

Const LVM_FIRST = &H1000
Const LVM_SETWORKAREA = LVM_FIRST + 65
Const LVM_SETICONSPACING = LVM_FIRST + 53

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, lParam As Any) As Long

Private Sub Form_Load()
    Dim xn As ListItem
   
    Me.Show
    
    ListView1.Width = 4500
    ListView1.Height = 3000
    ListView1.Refresh
    
    Set xn = ListView1.ListItems.Add
    xn.Text = "List1"
    Set xn = ListView1.ListItems.Add
    xn.Text = "List2"
    Set xn = ListView1.ListItems.Add
    xn.Text = "List3"
    Set xn = ListView1.ListItems.Add
    xn.Text = "List4"
    Set xn = ListView1.ListItems.Add
    xn.Text = "List5"
    Set xn = ListView1.ListItems.Add
    xn.Text = "List6"
    
    ListView1.Refresh
    Call SendMessage(ListView1.hwnd, LVM_SETICONSPACING, 0, _
        ByVal (60 * 65536 + 190&))
End Sub
要运行上面的程序,首先要确保ListView1的Arrange属性为1,View属性为0。在上面的程序中,我们利用了LVM_SETICONSPACING
消息来控制图标间距。其中SendMessage中的参数lParam定义图标间距,高位为纵向间距,低位为横向间距,在上面的范例中,
我们将图标的纵向间距定义为60像素,横向间距定义为190像素。

    最后要向大家在介绍一下关于在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函数。
    利用SendMessage函数控制控件的行为的方法还有很多,在这些文章中介绍的只是其中的一部分,如果大家多看一下MSDN
中的消息定义方面的文档的话,一定还可以找到其中的很多的妙用的。

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网