Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 技术类

[转]SendMessage函数的常用消息及其应用5

时 间:2008-12-05 08:09:36
作 者:andymark   ID:1350  城市:深圳
摘 要:SendMessage函数的常用消息及其应用
正 文:

2.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 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定义图标间距,
高位为纵向间距,低位为横向间距,在上面的范例中,我们将图标的纵向间距定义为60像素,横向间距
定义为190像素。
    

SendMessage函数的应用(四)
  
1,获得光标位置和字符个数.
Cpos=SendMessage(text1.hwnd,187,-1,0)   '光标所在行的首字符在文本中的位置
Lpos=SendMessage(text1.hwnd,201,Cpos,0) '光标所在的行号
Line=SendMessage(text1.hwnd,193,Cpos,0) '这行的字符数.

2.获取第N行的文本
Dim ST As String
ST = Space(110)'必须要事先赋空格
Line=SendMessage(text1.hwnd,196, N-1, ByVal ST 'ST返回获取到的文本,Line返回文本的长度字节数

'下面的未成功
Dim str(256) As Byte, K As Integer
str(1)=1 '最大允许存放256个字符
K = SendMessage (Text1.hwnd,196,2,str(0)) '获取第3行的数据放在str中
text1.text = StrConv(str,vbUnicode) '转换为字符串后显示
  
  说明:在调用SendMessage获取第N行字符串时,lParam需要说明为字节数组,在调用完成后,再将
字节数组转换为字符串;另外,调用前必须在lParam的前两个字节指明允许存放的最大长度,其中第一
个字节为低位,第二个字节为高位,本例将高位(即str(1))置1.说明最大允许存放256个字符。
 
3.开关显示器.

SendMessage Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0 '关闭显示器.
SendMessage Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1 '打开显示器

4.程序控制拉下或收起组合框的下拉列表
   一般情况下,为了拉下或收起组合框的下拉列表,需要用键盘或鼠标进行操作,而有时我们希望程
序运行的某个时刻自动拉出下拉列表(比如在一些演示程序中),为了实现这个目的,我们也只有借助
于SendMessage函数,方法是发一个CB_SHOWDROPDOWN(&H14F)消息给组合框。
   在发CB_SHOWDROPDOWN消息时,wParam参数决定了是拉下列表(=True)还是收起表(=False),
lParam无用(设为0)。
   为说明具体的使用方法,下面提供简单的程序片段:

Const CB_SHOWDROPDOWN=&H14F

   当程序中某处需要拉下组合框Combol的列表时,调用如下语句:

SendMessage Combol.hwnd,CB_SHOWDROPDOWN,True,0

   当需要收起组合框Combol的列表时,调用如下语句:

SendMessage Combol.hwnd,CB_SHOWDROPDOWNN,False,0


5. 返回控件中显示的第一行的行号。

LineNo = SendMessageBynum(CTextBox.hwnd, EM_GETFIRSTVISIBLELINE, 0, 0)
  
6.下面的函数能够滚动控件,不过在滚动之前最好判断控件的文本行数和能够显示的行数,以免滚动时
发生混乱。函数SendMessageBynum是SendMessage函数的安全声明函数,其定义与SendMessage函数完全
相同,只是函数名不同。

Function ScrollTextBox(CTextBox As TextBox, nVal As Long, Optional nVertical As _
  Boolean = True) As Long
If nVertical Then
 ScrollTextBox = SendMessageBynum(CTextBox.hwnd, EM_LINESCROLL, 0, nVal)
Else
 ScrollTextBox = SendMessageBynum(CTextBox.hwnd, EM_LINESCROLL, nVal, 0)
End If
End Function

7.下面的函数将返回控件能显示的行数:(经试,总是引起程序崩溃)

'获取当前字体的矩形区域(即字体的高度与平均宽度等信息)
Private Declare Function GetTextMetrics Lib "gdi32" Alias "GetTextMetricsA" (ByVal hdc As Long, lpMetrics As TEXTMETRIC) As Long
Private Type TEXTMETRIC
  tmHeight As Long           '字符高度
  tmAscent As Long           '字符上部高度(基线以上)
  tmDescent As Long          '字符下部高度(基线以下)
  tmInternalLeading As Long  '由tmHeight定义的字符高度的顶部空间数目
  tmExternalLeading As Long  '加在两行之间的空间数目
  tmAveCharWidth As Long     '平均字符宽度
  tmMaxCharWidth As Long     '最宽字符的宽度
  tmWeight As Long           '字体的粗细轻重程度
  tmOverhang As Long         '加入某些拼接字体上的附加高度
  tmDigitizedAspectX As Long '字体设计所针对的设备水平方向
  tmDigitizedAspectY As Long '字体设计所针对的设备垂直方向
  tmFirstChar As String      '为字体定义的第一个字符
  tmLastChar As String       '为字体定义的最后一个字符
  tmDefaultChar As String    '字体中所没有字符的替代字符
  tmBreakChar As String      '用于拆字的字符
  tmItalic As Byte           '字体为斜体时非零
  tmUnderlined As Byte       '字体为下划线时非零
  tmStruckOut As Byte        '字体被删去时非零
  tmPitchAndFamily As Byte   '字体间距(低4位)和族(高4位)
  tmCharSet As Byte          '字体的字符集
End Type
Type RECT
  Left As Long
  Top As Long
  Right As Long
  bottom As Long
End Type
Public ST As String

Function GetVisibleLines(CTextBox As TextBox) As Long
Dim rc As RECT  '以象素为单位
Dim tm As TEXTMETRIC
Dim hDC&, lfont&, oldfont&
Dim di&, lc&
lc = SendMessage(CTextBox.hwnd, EM_GETRECT, 0, rc)
lfont = SendMessage(CTextBox.hwnd, WM_GETFONT, 0, 0)
hDC = GetDC(CTextBox.hwnd)
If lfont <> 0 Then oldfont = SelectObject(hDC, lfont)
di = GetTextMetrics(hDC, tm)
If lfont <> 0 Then lfont = SelectObject(hDC, oldfont)
GetVisibleLines = (rc.bottom - rc.top) / tm.tmHeight
di = ReleaseDC(CTextBox.hwnd, hDC)
End Function



Access软件网QQ交流群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助