SendMessage函数应用(四) |
这一期是SendMessage函数巧应用的最后一期了。在这一期中,我将向大家介绍关于Ric hTextBox(简称RTF)控件的消息和ListView控件的消息控制各一。 在Windows消息中,以EM_开头的消息是专门控制TextBox类控件和RTF类控件的。下面介 绍的是如何利用EM_消息实现向RichTextBox中粘贴文本和位图.在EM_消息中,有一个EM_PA STESPECIAL消息可以从剪贴板中获取文本或者位图类数据并拷贝到RTF上。消息调用范例如?br />拢? 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,可以将剪贴板中的数据(位图或者文本)拷贝到RichTextBo x1上。 在EM_PASTESPECIAL,消息中,wParam定义剪贴板数据类型,lParam定义一个repastespe cial类型的数据,其中的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。在上面的 程序中,我们利用了VM_SETICONSPACING 消息来控制图标间距。其中SendMessage中的参数lParam定义图标间距,高位为纵向间距,?br /> 臀晃嵯蚣渚啵谏厦娴姆独校颐墙急甑淖菹蚣渚喽ㄒ逦?0像素,横向间距定义为1 90像素。 最后要向大家在介绍一下关于在SendMessage函数中lParam的定义问题。可以看到,在?br />懊娴某绦蛑校惺焙蚨ㄒ錶Param As Any,有时候定义 ByVal lParam As String。这是为什么呢?对于SendMessage函数。lParam的使用是很灵活的,在一般情况下?br /> 琹Param是一个指针,它指向的数据类型有三种:长整形、自定义数据结构类型、字符串类?br />汀6杂谇傲街掷嘈停枰玪Param定义为 lParam As Any,从而将lParam数据的指针传递到SendMessage函数。对于字符串类型,则需要定义Byva l lParam As String,因为字符串类型数据不同,只有定义ByVal,得到的才是字符串的指针,如果没有B yVal,得到的将是指向字符串指针的指针。另外对于少数的消息来说,SendMessage函数需?br />闹皇莑Param本身的值,这时就需要将lParam定义为 Byval lParam As Long,或者在程序调用时在lParam之前加ByVal,例如上面的设置ListView控件图标间距的?br />独械腟endMessage函数。 利用SendMessage函数控制控件的行为的方法还有很多,在这些文章中介绍的只是其中?br /> 囊徊糠郑绻蠹叶嗫匆幌翸SDN中的消息定义方面的文档的话,一定还可以找到其中的很?br />嗟拿钣玫摹?br> |
正文
SendMessage函数应用(四)2005-09-27 13:29:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/iamben250/5411.html
阅读(1663) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论