Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Const PBM_SETBARCOLOR = &H409 Public Const PBM_SETBKCOLOR = &H2001 PostMessage ProgressBar1.hwnd, PBM_SETBARCOLOR, 0,RGB(128,154,35) PostMessage ProgressBar1.hwnd, PBM_SETBKCOLOR, 0, RGB(0, 0, 0)
请问zq972,上面一段代码要放在下面程序中的什么位置? 模块: Option Explicit Public Type POINTL x As Long y As Long End Type 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 LongDeclare Function SetWindowLong _ Lib "user32" Alias "SetWindowLongA" _ (ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As LongDeclare Function SystemParametersInfo _ Lib "user32" Alias "SystemParametersInfoA" _ (ByVal uAction As Long, _ ByVal uParam As Long, _ lpvParam As Any, _ ByVal fuWinIni As Long) As Long
Declare Function ScreenToClient Lib "user32" _ (ByVal hwnd As Long, xyPoint As POINTL) As LongPublic Const GWL_WNDPROC = -4 Public Const SPI_GETWHEELSCROLLLINES = 104 Public Const WM_MOUSEWHEEL = &H20A Public WHEEL_SCROLL_LINES As Long
Global lpPrevWndProc As LongPublic Sub Hook(ByVal hwnd As Long) lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc) Call SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, WHEEL_SCROLL_LINES, 0) If WHEEL_SCROLL_LINES > Form1.VScroll1.Max Then WHEEL_SCROLL_LINES = Form1.VScroll1.Max End If End SubPublic Sub UnHook(ByVal hwnd As Long) Dim lngReturnValue As Long lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, lpPrevWndProc) End SubFunction WindowProc(ByVal hw As Long, _ ByVal uMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Dim pt As POINTL Select Case uMsg Case WM_MOUSEWHEEL If wParam = -7864320 Then If Form1.VScroll1.Value <= Form1.VScroll1.Max - 100 Then Form1.VScroll1.Value = Form1.VScroll1.Value + 100 Else Form1.VScroll1.Value = Form1.VScroll1.Max End If ElseIf wParam = 7864320 Then If Form1.VScroll1.Value >= 100 Then Form1.VScroll1.Value = Form1.VScroll1.Value - 100 Else Form1.VScroll1.Value = 0 End If End If Case Else WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) End Select End FunctionPublic Function HIWORD(LongIn As Long) As Integer HIWORD = (LongIn And &HFFFF0000) \ &H10000 End FunctionPublic Function LOWORD(LongIn As Long) As Integer LOWORD = LongIn And &HFFFF& End Function窗体中: Private Sub Form_Load() Hook Me.hwnd End SubPrivate Sub Form_Resize() If Frame1.Height > Me.Height Then VScroll1.Visible = True Else VScroll1.Visible = False End If If Frame1.Width > Me.Width Then HScroll1.Visible = True Else HScroll1.Visible = False End If HScroll1.Left = 0 HScroll1.Top = Me.ScaleHeight - HScroll1.Height VScroll1.Left = Me.ScaleWidth - VScroll1.Width VScroll1.Top = 0 HScroll1.Width = Me.ScaleWidth VScroll1.Height = Me.ScaleHeight If VScroll1.Visible = True Then If HScroll1.Visible = True Then HScroll1.Width = Abs(Me.ScaleWidth - VScroll1.Width) VScroll1.Height = Abs(Me.ScaleHeight - HScroll1.Height) End If End If HScroll1.Max = (Frame1.Width - Me.Width) + 3 * VScroll1.Width VScroll1.Max = (Frame1.Height - Me.Height) + 3 * HScroll1.Height HScroll1.ZOrder VScroll1.ZOrder End SubPrivate Sub Form_Unload(Cancel As Integer) UnHook Me.hwnd End SubPrivate Sub HScroll1_Change() Frame1.Left = -HScroll1.ValueEnd SubPrivate Sub VScroll1_Change() Frame1.Top = -VScroll1.Value End Sub
自定义颜色不清楚,但使用系统颜色ms有文档论述:http://support.microsoft.com/kb/244236/zh-cn 如何在 WindowsNT 下 ScrollBars 上使用系统颜色注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。 文章编号 : 244236 最后修改 : 2004年7月13日 修订 : 1.0 本页概要更多信息分步示例参考 概要 虽然 Windows 9.x 下要使用系统颜色背景色的水平和垂直滚动条控件是白色下 MicrosoftWindowsNT,。 要 WindowsNT, 使用系统颜色非常需要子类窗体以防止 WM_CTLCOLORSCROLBAR 窗口消息由默认窗口过程 ( WindowProc ) 对表单处理。 警告 : 失败到 unhook 窗口之前其即将出现毁坏导致应用程序错误、 无效页错误和数据丢失。 这是, 原因在于不再被指向新 WindowProc 函数存在, 但窗口已不通知的更改。 始终 unhook sub-classed 窗口卸载 sub-classed 表单或退出应用程序时。 在调试使用此技术中 Microsoft VisualBasic 开发环境 (IDE) 的应用程序时这一点尤其重要。 按 END 按钮或者从 运行 选择 END 菜单没有 unhooking 可能导致无效页面错误并且关闭 MicrosoftVisualBasic。 回到顶端 更多信息 通过把消息发送到窗口由各个应用程序创建 Windows 控件应用程序。 当它是时间来重绘, 当按下鼠标按钮时, 和所有窗口需要知道为了正确操作其他信息这些消息通知目标窗口。 因此, 小应用程序由函数处理这些消息 (称为 WindowProc )。 创建窗口, 系统知道如何发送邮件时用系统注册此函数。 当控件是要绘制 WM_CTLCOLORSCROLLBAR 消息发送到父窗口的滚动条控件。 通过响应此消息, 父窗口可用于设备上下文句柄 (hDC) 栏控件的滚动背景颜色设置。 如果此消息不传送到 WindowProc , 截取和滚动条设置为系统颜色。 以下示例由简单窗体窗体包含两 CommandButtons 和垂直滚动条。 截获 WM_CTLCOLORSCROLLBAR 消息并丢弃它。 备注 : • 滚动条控件闪烁除非至少一个其他控件是 sited 窗体上。 对 VScrollBar TabStop 属性设置为 False 防止其获得焦点。 • 通常最好来启动挂钩 _ Load 过程中和从 Form_Unload 过程结束它。 在此示例, CommandButtons 以便 VScrollBar 中差别是明显更容易使用。 回到顶端 分步示例 1. 启动新 VisualBasic 标准 EXE 工程。 默认情况下创建 Form 1。 2. 向 Form 1 添加两个 CommandButtons 和 VScrollBar。 将对 VScrollBar1 TabStop 属性设置为 False。 3. 在 项目 菜单, 单击要 BAS 模块添加到项目 添加模块 。 4. 将以下代码添加到 Module 1 的 GeneralDeclarations 部分:Option ExplicitDeclare 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 LongDeclare Function SetWindowLong Lib "user32" Alias _ "SetWindowLongA" (ByVal hwnd As Long, _ ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Const GWL_WNDPROC = -4 public Const WM_CTLCOLORSCROLLBAR = 311Public Sub Hook() lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _ AddressOf WindowProc) End SubPublic Sub Unhook() Dim temp As Long temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc) End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long If uMsg <> WM_CTLCOLORSCROLLBAR Then Debug.Print uMsg, hw WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) End If End Function
5. 以下代码添加到 Form 1 的 GeneralDeclarations 部分:Option ExplicitDim lpPrevWndProc As Long Dim gHW As LongPrivate Sub Form_Load() gHW = Me.hwnd Command1.Caption = "Hook" Command2.Caption = "Unhook" End SubPrivate Sub Command1_Click() Hook VScroll1.Refresh End SubPrivate Sub Command2_Click() Unhook End Sub
Public Const PBM_SETBARCOLOR = &H409
Public Const PBM_SETBKCOLOR = &H2001 PostMessage ProgressBar1.hwnd, PBM_SETBARCOLOR, 0,RGB(128,154,35)
PostMessage ProgressBar1.hwnd, PBM_SETBKCOLOR, 0, RGB(0, 0, 0)
模块:
Option Explicit
Public Type POINTL
x As Long
y As Long
End Type
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 LongDeclare Function SetWindowLong _
Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As LongDeclare Function SystemParametersInfo _
Lib "user32" Alias "SystemParametersInfoA" _
(ByVal uAction As Long, _
ByVal uParam As Long, _
lpvParam As Any, _
ByVal fuWinIni As Long) As Long
Declare Function ScreenToClient Lib "user32" _
(ByVal hwnd As Long, xyPoint As POINTL) As LongPublic Const GWL_WNDPROC = -4
Public Const SPI_GETWHEELSCROLLLINES = 104
Public Const WM_MOUSEWHEEL = &H20A
Public WHEEL_SCROLL_LINES As Long
Global lpPrevWndProc As LongPublic Sub Hook(ByVal hwnd As Long)
lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
Call SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, WHEEL_SCROLL_LINES, 0)
If WHEEL_SCROLL_LINES > Form1.VScroll1.Max Then
WHEEL_SCROLL_LINES = Form1.VScroll1.Max
End If
End SubPublic Sub UnHook(ByVal hwnd As Long)
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, lpPrevWndProc)
End SubFunction WindowProc(ByVal hw As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Dim pt As POINTL
Select Case uMsg
Case WM_MOUSEWHEEL
If wParam = -7864320 Then
If Form1.VScroll1.Value <= Form1.VScroll1.Max - 100 Then
Form1.VScroll1.Value = Form1.VScroll1.Value + 100
Else
Form1.VScroll1.Value = Form1.VScroll1.Max
End If
ElseIf wParam = 7864320 Then
If Form1.VScroll1.Value >= 100 Then
Form1.VScroll1.Value = Form1.VScroll1.Value - 100
Else
Form1.VScroll1.Value = 0
End If
End If
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Select
End FunctionPublic Function HIWORD(LongIn As Long) As Integer
HIWORD = (LongIn And &HFFFF0000) \ &H10000
End FunctionPublic Function LOWORD(LongIn As Long) As Integer
LOWORD = LongIn And &HFFFF&
End Function窗体中:
Private Sub Form_Load()
Hook Me.hwnd
End SubPrivate Sub Form_Resize()
If Frame1.Height > Me.Height Then
VScroll1.Visible = True
Else
VScroll1.Visible = False
End If
If Frame1.Width > Me.Width Then
HScroll1.Visible = True
Else
HScroll1.Visible = False
End If
HScroll1.Left = 0
HScroll1.Top = Me.ScaleHeight - HScroll1.Height
VScroll1.Left = Me.ScaleWidth - VScroll1.Width
VScroll1.Top = 0
HScroll1.Width = Me.ScaleWidth
VScroll1.Height = Me.ScaleHeight
If VScroll1.Visible = True Then
If HScroll1.Visible = True Then
HScroll1.Width = Abs(Me.ScaleWidth - VScroll1.Width)
VScroll1.Height = Abs(Me.ScaleHeight - HScroll1.Height)
End If
End If
HScroll1.Max = (Frame1.Width - Me.Width) + 3 * VScroll1.Width
VScroll1.Max = (Frame1.Height - Me.Height) + 3 * HScroll1.Height
HScroll1.ZOrder
VScroll1.ZOrder
End SubPrivate Sub Form_Unload(Cancel As Integer)
UnHook Me.hwnd
End SubPrivate Sub HScroll1_Change()
Frame1.Left = -HScroll1.ValueEnd SubPrivate Sub VScroll1_Change()
Frame1.Top = -VScroll1.Value
End Sub
如何在 WindowsNT 下 ScrollBars 上使用系统颜色注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。
文章编号 : 244236
最后修改 : 2004年7月13日
修订 : 1.0
本页概要更多信息分步示例参考
概要
虽然 Windows 9.x 下要使用系统颜色背景色的水平和垂直滚动条控件是白色下 MicrosoftWindowsNT,。 要 WindowsNT, 使用系统颜色非常需要子类窗体以防止 WM_CTLCOLORSCROLBAR 窗口消息由默认窗口过程 ( WindowProc ) 对表单处理。 警告 : 失败到 unhook 窗口之前其即将出现毁坏导致应用程序错误、 无效页错误和数据丢失。 这是, 原因在于不再被指向新 WindowProc 函数存在, 但窗口已不通知的更改。 始终 unhook sub-classed 窗口卸载 sub-classed 表单或退出应用程序时。 在调试使用此技术中 Microsoft VisualBasic 开发环境 (IDE) 的应用程序时这一点尤其重要。 按 END 按钮或者从 运行 选择 END 菜单没有 unhooking 可能导致无效页面错误并且关闭 MicrosoftVisualBasic。
回到顶端 更多信息
通过把消息发送到窗口由各个应用程序创建 Windows 控件应用程序。 当它是时间来重绘, 当按下鼠标按钮时, 和所有窗口需要知道为了正确操作其他信息这些消息通知目标窗口。 因此, 小应用程序由函数处理这些消息 (称为 WindowProc )。 创建窗口, 系统知道如何发送邮件时用系统注册此函数。 当控件是要绘制 WM_CTLCOLORSCROLLBAR 消息发送到父窗口的滚动条控件。 通过响应此消息, 父窗口可用于设备上下文句柄 (hDC) 栏控件的滚动背景颜色设置。 如果此消息不传送到 WindowProc , 截取和滚动条设置为系统颜色。 以下示例由简单窗体窗体包含两 CommandButtons 和垂直滚动条。 截获 WM_CTLCOLORSCROLLBAR 消息并丢弃它。 备注 : • 滚动条控件闪烁除非至少一个其他控件是 sited 窗体上。 对 VScrollBar TabStop 属性设置为 False 防止其获得焦点。
• 通常最好来启动挂钩 _ Load 过程中和从 Form_Unload 过程结束它。 在此示例, CommandButtons 以便 VScrollBar 中差别是明显更容易使用。 回到顶端 分步示例
1. 启动新 VisualBasic 标准 EXE 工程。 默认情况下创建 Form 1。
2. 向 Form 1 添加两个 CommandButtons 和 VScrollBar。 将对 VScrollBar1 TabStop 属性设置为 False。
3. 在 项目 菜单, 单击要 BAS 模块添加到项目 添加模块 。
4. 将以下代码添加到 Module 1 的 GeneralDeclarations 部分:Option ExplicitDeclare 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 LongDeclare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Const GWL_WNDPROC = -4
public Const WM_CTLCOLORSCROLLBAR = 311Public Sub Hook()
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
AddressOf WindowProc)
End SubPublic Sub Unhook()
Dim temp As Long
temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg <> WM_CTLCOLORSCROLLBAR Then
Debug.Print uMsg, hw
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End If
End Function
5. 以下代码添加到 Form 1 的 GeneralDeclarations 部分:Option ExplicitDim lpPrevWndProc As Long
Dim gHW As LongPrivate Sub Form_Load()
gHW = Me.hwnd
Command1.Caption = "Hook"
Command2.Caption = "Unhook"
End SubPrivate Sub Command1_Click()
Hook
VScroll1.Refresh
End SubPrivate Sub Command2_Click()
Unhook
End Sub
6. 运行项目并单击 钩 按钮到挂钩窗体。 观察, 滚动条更改从白皮书为系统颜色。
7. 单击 Unhook 按钮, 然后终止程序。
即问窗体中的HScroll1和 VScroll1,其肤色的设置,