' '----------------------By 陈锐------------------------------ '如果你要在Internet或BBS上转贴文章,请通知我知道 'Email: [email protected][email protected] '请参观我的站点 http://www.nease.net/~blackcat'这个程序演示如何给List Box的每个列表行加上不同的提示行 '运行该程序,当鼠标移动到任一行上后,弹出的ToolTip就会提示该行的完整内容 模块 Option ExplicitPrivate Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Type DRAWITEMSTRUCT CtlType As Long '控件类型 CtlID As Long '控件ID itemID As Long '菜单项、列表框或组合框中某一项的索引值 itemAction As Long '控件行为 itemState As Long '控件状态 hwndItem As Long '父窗口句柄或菜单句柄 hdc As Long '控件对应的绘图设备句柄 rcItem As RECT '控件所占据的矩形区域 itemData As Long '列表框或组合框中某一项的值 End TypePrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 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 Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long Private Declare Function DrawFocusRect Lib "user32" (ByVal hdc As Long, lpRect As RECT) As Long Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As LongPrivate Const COLOR_HIGHLIGHT = 13 Private Const COLOR_HIGHLIGHTTEXT = 14 Private Const COLOR_WINDOW = 5 Private Const COLOR_WINDOWTEXT = 8 Private Const LB_GETTEXT = &H189 Private Const WM_DRAWITEM = &H2B Private Const GWL_WNDPROC = (-4) Private Const ODS_FOCUS = &H10 Private Const ODT_LISTBOX = 2Private lPrevWndProc As LongPrivate Function SubClassedList(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim tItem As DRAWITEMSTRUCT Dim sBuff As String * 255 Dim sItem As String Dim lBack As Long If Msg = WM_DRAWITEM Then '绘制菜单消息 Call CopyMemory(tItem, ByVal lParam, Len(tItem)) If tItem.CtlType = ODT_LISTBOX Then '只处理控件类型为listbox的控件 Call SendMessage(tItem.hwndItem, LB_GETTEXT, tItem.itemID, ByVal sBuff) '获得具体值 sItem = Left(sBuff, InStr(sBuff, Chr(0)) - 1) If (tItem.itemState And ODS_FOCUS) Then '判断某项是否具有焦点 lBack = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT)) Call FillRect(tItem.hdc, tItem.rcItem, lBack) Call SetBkColor(tItem.hdc, GetSysColor(COLOR_HIGHLIGHT)) Call SetTextColor(tItem.hdc, GetSysColor(COLOR_HIGHLIGHTTEXT)) TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem) DrawFocusRect tItem.hdc, tItem.rcItem Else '如果没有焦点,则 lBack = CreateSolidBrush(GetSysColor(COLOR_WINDOW)) Call FillRect(tItem.hdc, tItem.rcItem, lBack) Call SetBkColor(tItem.hdc, GetSysColor(COLOR_WINDOW)) Call SetTextColor(tItem.hdc, tItem.itemData) TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem) End If Call DeleteObject(lBack) SubClassedList = 0 Exit Function End If End If SubClassedList = CallWindowProc(lPrevWndProc, hWnd, Msg, wParam, lParam) End FunctionPublic Sub SubLists(ByVal hWnd As Long) lPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubClassedList) End SubPublic Sub RemoveSubLists(ByVal hWnd As Long) Call SetWindowLong(hWnd, GWL_WNDPROC, lPrevWndProc) End Sub
' '----------------------By 陈锐------------------------------ '如果你要在Internet或BBS上转贴文章,请通知我知道 'Email: [email protected][email protected] '请参观我的站点 http://www.nease.net/~blackcat'这个程序演示如何给List Box的每个列表行加上不同的提示行 '运行该程序,当鼠标移动到任一行上后,弹出的ToolTip就会提示该行的完整内容 ' Option ExplicitPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ lParam As Any) As LongPrivate Const LB_ITEMFROMPOINT = &H1A9Private Sub List1_MouseMove(Button As Integer, Shift As Integer, _ x As Single, y As Single) ' ' present related tip message ' Dim lXPoint As Long Dim lYPoint As Long Dim lIndex As Long ' If Button = 0 Then ' 如果没有按钮被按下 lXPoint = CLng(x / Screen.TwipsPerPixelX) lYPoint = CLng(y / Screen.TwipsPerPixelY) With List1 ' 获得当前的光标所在的的屏幕位置确定标题位置 lIndex = SendMessage(.hWnd, LB_ITEMFROMPOINT, 0, _ ByVal ((lYPoint * 65536) + lXPoint)) ' 显示提示行或清除提示行 If (lIndex >= 0) And (lIndex <= .ListCount) Then .ToolTipText = .List(lIndex) Else .ToolTipText = "" End If End With End If End Sub Private Sub Form_Load() Dim I As Integer For I = 0 To 15 List1.AddItem "Color " & I List1.itemData(List1.NewIndex) = QBColor(I) Next SubLists hWnd End SubPrivate Sub Form_Unload(Cancel As Integer) RemoveSubLists hWnd End Sub
还没有看到过想类似的功能
用其他控件代替部可以吗?
比如MSHFlexGrid
非得要钻牛角尖阿需要用wm paint重新画的非常麻烦
'
'----------------------By 陈锐------------------------------
'如果你要在Internet或BBS上转贴文章,请通知我知道
'Email: [email protected] [email protected]
'请参观我的站点 http://www.nease.net/~blackcat'这个程序演示如何给List Box的每个列表行加上不同的提示行
'运行该程序,当鼠标移动到任一行上后,弹出的ToolTip就会提示该行的完整内容
模块
Option ExplicitPrivate Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type DRAWITEMSTRUCT
CtlType As Long '控件类型
CtlID As Long '控件ID
itemID As Long '菜单项、列表框或组合框中某一项的索引值
itemAction As Long '控件行为
itemState As Long '控件状态
hwndItem As Long '父窗口句柄或菜单句柄
hdc As Long '控件对应的绘图设备句柄
rcItem As RECT '控件所占据的矩形区域
itemData As Long '列表框或组合框中某一项的值
End TypePrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
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 Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Private Declare Function DrawFocusRect Lib "user32" (ByVal hdc As Long, lpRect As RECT) As Long
Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As LongPrivate Const COLOR_HIGHLIGHT = 13
Private Const COLOR_HIGHLIGHTTEXT = 14
Private Const COLOR_WINDOW = 5
Private Const COLOR_WINDOWTEXT = 8
Private Const LB_GETTEXT = &H189
Private Const WM_DRAWITEM = &H2B
Private Const GWL_WNDPROC = (-4)
Private Const ODS_FOCUS = &H10
Private Const ODT_LISTBOX = 2Private lPrevWndProc As LongPrivate Function SubClassedList(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim tItem As DRAWITEMSTRUCT
Dim sBuff As String * 255
Dim sItem As String
Dim lBack As Long
If Msg = WM_DRAWITEM Then '绘制菜单消息
Call CopyMemory(tItem, ByVal lParam, Len(tItem))
If tItem.CtlType = ODT_LISTBOX Then '只处理控件类型为listbox的控件
Call SendMessage(tItem.hwndItem, LB_GETTEXT, tItem.itemID, ByVal sBuff) '获得具体值
sItem = Left(sBuff, InStr(sBuff, Chr(0)) - 1)
If (tItem.itemState And ODS_FOCUS) Then '判断某项是否具有焦点
lBack = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT))
Call FillRect(tItem.hdc, tItem.rcItem, lBack)
Call SetBkColor(tItem.hdc, GetSysColor(COLOR_HIGHLIGHT))
Call SetTextColor(tItem.hdc, GetSysColor(COLOR_HIGHLIGHTTEXT))
TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem)
DrawFocusRect tItem.hdc, tItem.rcItem
Else '如果没有焦点,则
lBack = CreateSolidBrush(GetSysColor(COLOR_WINDOW))
Call FillRect(tItem.hdc, tItem.rcItem, lBack)
Call SetBkColor(tItem.hdc, GetSysColor(COLOR_WINDOW))
Call SetTextColor(tItem.hdc, tItem.itemData)
TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem)
End If
Call DeleteObject(lBack)
SubClassedList = 0
Exit Function
End If
End If
SubClassedList = CallWindowProc(lPrevWndProc, hWnd, Msg, wParam, lParam)
End FunctionPublic Sub SubLists(ByVal hWnd As Long)
lPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubClassedList)
End SubPublic Sub RemoveSubLists(ByVal hWnd As Long)
Call SetWindowLong(hWnd, GWL_WNDPROC, lPrevWndProc)
End Sub
'
'----------------------By 陈锐------------------------------
'如果你要在Internet或BBS上转贴文章,请通知我知道
'Email: [email protected] [email protected]
'请参观我的站点 http://www.nease.net/~blackcat'这个程序演示如何给List Box的每个列表行加上不同的提示行
'运行该程序,当鼠标移动到任一行上后,弹出的ToolTip就会提示该行的完整内容
'
Option ExplicitPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As LongPrivate Const LB_ITEMFROMPOINT = &H1A9Private Sub List1_MouseMove(Button As Integer, Shift As Integer, _
x As Single, y As Single)
'
' present related tip message
'
Dim lXPoint As Long
Dim lYPoint As Long
Dim lIndex As Long
'
If Button = 0 Then ' 如果没有按钮被按下
lXPoint = CLng(x / Screen.TwipsPerPixelX)
lYPoint = CLng(y / Screen.TwipsPerPixelY)
With List1
' 获得当前的光标所在的的屏幕位置确定标题位置
lIndex = SendMessage(.hWnd, LB_ITEMFROMPOINT, 0, _
ByVal ((lYPoint * 65536) + lXPoint))
' 显示提示行或清除提示行
If (lIndex >= 0) And (lIndex <= .ListCount) Then
.ToolTipText = .List(lIndex)
Else
.ToolTipText = ""
End If
End With
End If
End Sub
Private Sub Form_Load()
Dim I As Integer
For I = 0 To 15
List1.AddItem "Color " & I
List1.itemData(List1.NewIndex) = QBColor(I)
Next
SubLists hWnd
End SubPrivate Sub Form_Unload(Cancel As Integer)
RemoveSubLists hWnd
End Sub
//还没有看到过想类似的功能
//用其他控件代替部可以吗?
//比如MSHFlexGrid一点都不难,你不知道罢了
你看得懂吗?
有需要代码的,可以PM我。