 |
操作系统:WIN98
编程工具:VB6.0
问题:我在处理列表框的时候遇到了一些问题,我打算在列表框的一行中显示两个列,在处理两个列之间的宽度时使用了SENGMESSAGE函数和LB_SETTANSTOPS,又想是第二列始终靠近列表框的最右边,代妈如下:
Option Explicit
Dim a As Integer
Private Sub Form_Load()
a = List1.Width-200
SendMessage List1.hwnd, LB_SETTABSTOPS, 1&, a
List1.AddItem "1" & vbTab & "12:34"
End Sub
Private Sub Form_Resize()
List1.Width = ScaleWidth - List1.Left
a =List1.Width -200
SendMessage List1.hwnd, LB_SETTABSTOPS, 1, a
End Sub
可是总是不能得到预期的效果,我在WINAMP中的播放列表中见到了这个效果,到底是哪里出错了呢?望专家能给我指点迷津,小生不胜感激!!(贺海波)
|
 |
Li Junfu的意见:
你写的没有错误,只你没有注意窗体的SCALEMODE与API中的LPARAM的单位差别,如果你想让第二列靠右你可能需要换算一下了。例如窗体的SCALEMODE为TWIP,帮助介绍则一个英文字符需要120缇,但我测测试了一下应取90,加上LISTBOX的两头空白取50,基本上是正确的。你还需将第二列内容进行格式化如将“2:22"格式化为“ 2:22”,这样才能保证靠右对齐。 另外程序中使用了数组做为LPARAM的参数,这样可以根据数组的维数进行多列格式。(注意:LPARAM的单位为1/4个字符,它所指定的数据是从LISTBOX的启始开算的,所以如果你的第1列数据量*4大于其值时第2列则不会正常显示)。
简单示例:
Option Explicit
Private Const LB_SETTABSTOPS = &H192
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_Resize()
Dim tabpos(0) As Long
List1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
'减去两头空白量50缇,除以90换算成字符,再减去5个英文字符,最后乘以4换算为LPARAM参量单位
tabpos(0) = (((List1.Width - 50) / 90) - 5) * 4
SendMessage List1.hwnd, LB_SETTABSTOPS, 1, tabpos(0)
List1.AddItem "1" & vbTab & "12:34"
End Sub
刘林海的意见:
Option Explicit
Dim a As Integer
Private Sub Form_Load()
a = List1.Width \ 3
a = a \ Screen.TwipsPerPixelX
SendMessage List1.hwnd, LB_SETTABSTOPS, 1&, a
List1.AddItem "1" & vbTab & "12:34"
End Sub
Private Sub Form_Resize()
List1.Width = ScaleWidth - List1.Left
a = List1.Width \ 3
a = a \ Screen.TwipsPerPixelX
SendMessage List1.hwnd, LB_SETTABSTOPS, 1, a
End Sub
此问题由刘林海等回答。
附加关键字:编程, 源程序, programming, source code, Visual Basic, VB, 标准控件, screen, button, combo, checkbox, listbox。
|