本帖最后由 【微凉清风】 于 2011-1-20 18:23 编辑
易语言的子类化文章太少了,本人文笔也不好哈,看看VB得吧,别说英文看不懂,看不懂你的易语言水平永远不会提高!一,初识子类
当你还不碰过子类的时候,你看到这个标题,定会问:"啥叫子类?".因为你知道我定会为你解答.(阴险哪~~~),因为鄙人文才不好,不知如何以最详细最能理解的方式为你解答,所以到网上偷了一段,还请各位笑纳:
子类处理,是一种功能强大的技术,它的作用是对发送到窗口的消息进行处理,我们完全可以用自己定制的一个窗口函数替代它,并保留指向默认窗口函数的指针,当一个消息到达窗口时,自制的窗口函数会拦截它并进行识别处理,对不能识别或不需进行特别处理的消息,就通过指向默认窗口函数的指针传递给默认的窗口函数进行处理,这样便扩充了默认窗口函数的功能。这种用定制的窗口函数代替默认的窗口函数,拦截并处理到达窗口的消息的技术,我们就称之为“子类处理”,定制的函数我们称之为“回调函数”。
上面解释可能较复杂,但是我们现在也没必要完全搞懂它,因为有了实例这一切就自然明白了.
首先,在使用子类的时候,我们需要用到三个API函数,它们分别是 GetWindowLong, SetWindowLong, CallWindowProc(没吓到你吧?),这三个函数不难,可以说是很简单,有了它们,我们实现子类化成为可能,先来看看 GetWindowLong API函数的原型:
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
前面的我都不说了,只看参数:
ByVal hwnd As Long ,不用我说了吧?传句柄的(问:谁的句柄? 答:当然是你要子类的那个窗口的句柄啦)
ByVal nIndex As Long ,咳咳,这个嘛,需要传递一个常量,至于传递什么样的常量,咱们用前段时间学习的API分析大法分析下不就OK了么?(嘿~~聪明)
第二个参数具体传递什么样的参数,根据这个API的名称进行分析(问:为什么啊? 答:倒,API的常量一般都和API名字有很大关联的,难道还分析你的名字不成么?),首先是 Get = G, Window = W, Long = L,合成以后就是 GWL_ ,OK ,打开API 浏览器,转到常量,输入 GWL_ 四个字符看看?有没?没有我马上玩游戏去~~~~~~~~~~
Public Const GWL_EXSTYLE = (-20)
Public Const GWL_HINSTANCE = (-6)
Public Const GWL_HWNDPARENT = (-8)
Public Const GWL_ID = (-12)
Public Const GWL_STYLE = (-16)
Public Const GWL_USERDATA = (-21)
Public Const GWL_WNDPROC = (-4)
很多哈,但是实现子类的时候我们只需要一个,那就是 GWL_WNDPROC,至于其它的常量我建议大家看看MSDN,如果你看不懂的话可以参考下我以前发的关于一篇大量使用 GetWindowLong 和 SetWindowLong 两个API函数的文章,地址是: http://www.vbgood.com/viewthread.php?tid=46956&highlight= (建议学完该段API介绍再看)
然后,我们再看看 SetWindowLong 原型:
Public Declare Function SetWindowLong Lib "user32" Alias &