ListYS.bas
上传用户:luoweizhao
上传日期:2022-08-01
资源大小:1290k
文件大小:5k
源码类别:

外挂编程

开发平台:

Visual Basic

  1. Attribute VB_Name = "ListYS"
  2. '
  3. '----------------------By 陈锐------------------------------
  4. '如果你要在Internet或BBS上转贴文章,请通知我知道
  5. 'Email: blackcat@nease.net  develope@163.net
  6. '请参观我的站点 http://www.nease.net/~blackcat
  7. Option Explicit
  8. Private Type RECT
  9.         Left As Long
  10.         Top As Long
  11.         Right As Long
  12.         Bottom As Long
  13. End Type
  14. Private Type DRAWITEMSTRUCT
  15.         CtlType As Long    '控件类型
  16.         CtlID As Long      '控件ID
  17.         itemID As Long      '菜单项、列表框或组合框中某一项的索引值
  18.         itemAction As Long  '控件行为
  19.         itemState As Long  '控件状态
  20.         hwndItem As Long    '父窗口句柄或菜单句柄
  21.         hdc As Long        '控件对应的绘图设备句柄
  22.         rcItem As RECT      '控件所占据的矩形区域
  23.         itemData As Long    '列表框或组合框中某一项的值
  24. End Type
  25. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  26. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  27. 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
  28. 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
  29. Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
  30. Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
  31. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  32. Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
  33. Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
  34. 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
  35. Private Declare Function DrawFocusRect Lib "user32" (ByVal hdc As Long, lpRect As RECT) As Long
  36. Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
  37. Private Const COLOR_HIGHLIGHT = 13
  38. Private Const COLOR_HIGHLIGHTTEXT = 14
  39. Private Const COLOR_WINDOW = 5
  40. Private Const COLOR_WINDOWTEXT = 8
  41. Private Const LB_GETTEXT = &H189
  42. Private Const WM_DRAWITEM = &H2B
  43. Private Const GWL_WNDPROC = (-4)
  44. Private Const ODS_FOCUS = &H10
  45. Private Const ODT_LISTBOX = 2
  46. Private lPrevWndProc As Long
  47. Private Function SubClassedList(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  48. On Error Resume Next
  49.     Dim tItem As DRAWITEMSTRUCT
  50.     Dim sBuff As String * 255
  51.     Dim sItem As String
  52.     Dim tem As String
  53.     Dim lBack As Long
  54.     If Msg = WM_DRAWITEM Then  '绘制菜单消息
  55.     Call CopyMemory(tItem, ByVal lParam, Len(tItem))
  56.         If tItem.CtlType = ODT_LISTBOX Then  '只处理控件类型为listbox的控件
  57.         Call SendMessage(tItem.hwndItem, LB_GETTEXT, tItem.itemID, ByVal sBuff) '获得具体值
  58.             sItem = Replace(sBuff, Chr(0), "")
  59.             If (tItem.itemState And ODS_FOCUS) Then  '判断某项是否具有焦点
  60.               lBack = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT))
  61.                 Call FillRect(tItem.hdc, tItem.rcItem, lBack)
  62.                 Call SetBkColor(tItem.hdc, GetSysColor(COLOR_HIGHLIGHT))
  63.                 Call SetTextColor(tItem.hdc, GetSysColor(COLOR_HIGHLIGHTTEXT))
  64.                 TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem)
  65.                 DrawFocusRect tItem.hdc, tItem.rcItem
  66.             Else  '如果没有焦点,则
  67.                 lBack = CreateSolidBrush(GetSysColor(COLOR_WINDOW))
  68.                 Call FillRect(tItem.hdc, tItem.rcItem, lBack)
  69.                 Call SetBkColor(tItem.hdc, GetSysColor(COLOR_WINDOW))
  70.                 Call SetTextColor(tItem.hdc, tItem.itemData)
  71.                 TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem)
  72.             End If
  73.             Call DeleteObject(lBack)
  74.             SubClassedList = 0
  75.             Exit Function
  76.                     End If
  77.             End If
  78.     SubClassedList = CallWindowProc(lPrevWndProc, hWnd, Msg, wParam, lParam)
  79. End Function
  80. Public Sub SubLists(ByVal hWnd As Long)
  81.     lPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubClassedList)
  82. End Sub
  83. Public Sub RemoveSubLists(ByVal hWnd As Long)
  84.     Call SetWindowLong(hWnd, GWL_WNDPROC, lPrevWndProc)
  85. End Sub