马大哈 发表于 2005-4-22 12:27:19

[原创]利用子类技术得到滚轮状态的例子

<p>很多朋友在编程时,需要使用滚轮来处理一些操作,这样可以让使用者倍感方便.但有一些控件自身并不支持滚轮,怎么办呢?<br/><br/>其实,只要这些控件支持键盘的向上与向下键滚动,就可以利用消息来实现滚轮操作.<br/><br/>思路:<br/><br/>拦截滚轮消息,并根据消息产生相应的向上或向下键消息,并发送到指定控件<br/><br/>以下是我做的一个例子:<br/><br/>窗体FrmWndProc内有一个文本框Text1,一个按钮Command1,一个定时器Timer1,以及一个标签Label1.窗体内代码如下:<br/><br/>'*************************************************************************<br/>'**说&nbsp;&nbsp;&nbsp; 明:东方数控网 http://www.auto-china.net/ 版权所有2005 - 2006(C)<br/>'**创 建 人:马大哈<br/>'**日&nbsp;&nbsp;&nbsp; 期:2005年04月13日<br/>'**描&nbsp;&nbsp;&nbsp; 述:一个使用子类技术得到鼠标滚轮状态的简单例子<br/>'*************************************************************************<br/>Option Explicit<br/>Dim St As Long<br/>Private Sub Command1_Click()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '这里是对Text1进行子类化处理<br/>If St = -1 Then<br/>&nbsp;&nbsp;&nbsp; PrevWndProc = SetWindowLong(Text1.Hwnd, GWL_WNDPROC, AddressOf SubWndProc)<br/>&nbsp;&nbsp;&nbsp; Command1.Caption = "停止"<br/>&nbsp;&nbsp;&nbsp; St = 1<br/>&nbsp;&nbsp;&nbsp; Me.Caption = "子类处理状态!"<br/>&nbsp;&nbsp;&nbsp; <br/>Else<br/>&nbsp;&nbsp;&nbsp; SetWindowLong Text1.Hwnd, GWL_WNDPROC, PrevWndProc<br/>&nbsp;&nbsp;&nbsp; Command1.Caption = "开始"<br/>&nbsp;&nbsp;&nbsp; St = -1<br/>&nbsp;&nbsp;&nbsp; Me.Caption = "正常状态"<br/>&nbsp;&nbsp;&nbsp; <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&nbsp; 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MouseW = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ElseIf wParam &amp;lt; 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MouseW = -1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>End Select<br/>SubWndProc = CallWindowProc(PrevWndProc, Hwnd, MSG, wParam, lParam)&nbsp;&nbsp;&nbsp;&nbsp; '其它消息不管<br/>End Function<br/><br/>完整代码在此下载:</p><p></p>
[此贴子已经被作者于2007-6-10 21:42:30编辑过]

小吧 发表于 2005-4-22 13:15:22

<P>哈 学了!</P><P>强烈支持多发!</P>

马大哈 发表于 2005-5-10 23:52:49

子类的入门并不难,难的在于理解消息机制.

马大哈 发表于 2005-5-19 18:32:22

做点小东西出来吧,呵呵

马大哈 发表于 2005-6-24 23:11:24

<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 &gt; 0 Then
            MouseW = 1
      ElseIf wParam &lt; 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>

马大哈 发表于 2005-7-26 11:07:49

<P>一般般啦.</P><P>学习到一定程度,谁都可以写出来的.</P>

马大哈 发表于 2005-8-22 10:53:25

<P>没问题的</P><P>你只要在那个子类过程里向DataList的句柄发送一个键盘向上键或向下键的消息就行了</P>

马大哈 发表于 2005-8-22 11:20:27

<P>那个按钮是用于启动HOOK的,其实并不相关</P><P>你要去了解一下这些消息才行</P><P>主要是WINDOWS的消息机制要了解.</P>

马大哈 发表于 2005-12-5 13:33:17

那样的话,如果不做好处理,系统会乱了套的.

马大哈 发表于 2005-12-18 05:52:46

是指"用鼠标滚轮映射键盘按键"吧.

马大哈 发表于 2006-2-22 13:38:19

这样的插件本来就有呀

马大哈 发表于 2006-2-22 19:59:43

网上有代码的:

http://www.daima.com.cn/Down/31/daima20054208364842/
页: [1]
查看完整版本: [原创]利用子类技术得到滚轮状态的例子