[原创]利用子类技术得到滚轮状态的例子
<p>很多朋友在编程时,需要使用滚轮来处理一些操作,这样可以让使用者倍感方便.但有一些控件自身并不支持滚轮,怎么办呢?<br/><br/>其实,只要这些控件支持键盘的向上与向下键滚动,就可以利用消息来实现滚轮操作.<br/><br/>思路:<br/><br/>拦截滚轮消息,并根据消息产生相应的向上或向下键消息,并发送到指定控件<br/><br/>以下是我做的一个例子:<br/><br/>窗体FrmWndProc内有一个文本框Text1,一个按钮Command1,一个定时器Timer1,以及一个标签Label1.窗体内代码如下:<br/><br/>'*************************************************************************<br/>'**说 明:东方数控网 http://www.auto-china.net/ 版权所有2005 - 2006(C)<br/>'**创 建 人:马大哈<br/>'**日 期:2005年04月13日<br/>'**描 述:一个使用子类技术得到鼠标滚轮状态的简单例子<br/>'*************************************************************************<br/>Option Explicit<br/>Dim St As Long<br/>Private Sub Command1_Click()<br/> '这里是对Text1进行子类化处理<br/>If St = -1 Then<br/> PrevWndProc = SetWindowLong(Text1.Hwnd, GWL_WNDPROC, AddressOf SubWndProc)<br/> Command1.Caption = "停止"<br/> St = 1<br/> Me.Caption = "子类处理状态!"<br/> <br/>Else<br/> SetWindowLong Text1.Hwnd, GWL_WNDPROC, PrevWndProc<br/> Command1.Caption = "开始"<br/> St = -1<br/> Me.Caption = "正常状态"<br/> <br/>End If<br/>End Sub<br/>Private Sub Form_Load()<br/>St = -1<br/>Me.Caption = "准备完毕"<br/>End Sub<br/>Private Sub Form_Unload(Cancel As Integer)<br/>If St 0 Then<br/> MouseW = 1<br/> ElseIf wParam &lt; 0 Then<br/> MouseW = -1<br/> End If<br/> <br/>End Select<br/>SubWndProc = CallWindowProc(PrevWndProc, Hwnd, MSG, wParam, lParam) '其它消息不管<br/>End Function<br/><br/>完整代码在此下载:</p><p></p>[此贴子已经被作者于2007-6-10 21:42:30编辑过] <P>哈 学了!</P><P>强烈支持多发!</P> 子类的入门并不难,难的在于理解消息机制. 做点小东西出来吧,呵呵 <P>以下是SubClass过程的内容:</P><P>Public Function SubWndProc(ByVal Hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long</P><P>Select Case MSG '在这里进行过滤.如果知道其他的消息,也可以在这里过滤.</P><P> Case WM_MOUSEWHEEL
If wParam > 0 Then
MouseW = 1
ElseIf wParam < 0 Then
MouseW = -1
End If
End Select</P><P>SubWndProc = CallWindowProc(PrevWndProc, Hwnd, MSG, wParam, lParam) '其它消息不管</P><P>当挂接了这个过程到目标上时(本例是文本框),所有到达文本框的消息都会先被系统发送到这个函数里来.</P><P>而消息成千上万,所以要在处理完自己感兴趣的消息后,用CallWindowProc函数把其他的消息发送给目标原来的WndProc去处理.</P><P>CallWindowProc的用法:</P><P>CallWindowProc(PrevWndProc, Hwnd, MSG, wParam, lParam)</P><P>PrevWndProc = 指向目标原来的WndProc过程的指针</P><P>Hwnd, MSG, wParam, lParam = 系统产生的消息</P><P>至于St变量,只是用于确定一下当前子类化的状态.</P> <P>一般般啦.</P><P>学习到一定程度,谁都可以写出来的.</P> <P>没问题的</P><P>你只要在那个子类过程里向DataList的句柄发送一个键盘向上键或向下键的消息就行了</P> <P>那个按钮是用于启动HOOK的,其实并不相关</P><P>你要去了解一下这些消息才行</P><P>主要是WINDOWS的消息机制要了解.</P> 那样的话,如果不做好处理,系统会乱了套的. 是指"用鼠标滚轮映射键盘按键"吧. 这样的插件本来就有呀 网上有代码的:
http://www.daima.com.cn/Down/31/daima20054208364842/
页:
[1]