文章目录[隐藏]
本课开始,我们对大漠本人的大漠多线程模板解读学习,第一课先了解一下窗口子类化。
子类化
子类化的目的是在不修改现有代码的前提下,扩展现有窗口的功能。它的思路很简单,就是将窗口过程地址修改为一个新函数地址,新的窗口过程函数处理自己感兴趣的消息,将其它消息传递给原窗口过程。通过子类化,我们不需要现有窗口的源代码,就可以定制窗口功能。
子类化可以分为实例子类化和全局子类化。实例子类化就是修改窗口实例的窗口过程地址,全局子类化就是修改窗口类的窗口过程地址。实例子类化只影响被修改的窗口。全局子类化会影响在修改之后,按照该窗口类创建的所有窗口。显然,全局子类化不会影响修改前已经创建的窗口。
子类化方法虽然是二十年前的概念,却很好地实践了面向对象技术的开闭原则(OCP:The Open-Closed Principle):对扩展开放,对修改关闭。
超类化
超类化的概念更简单,就是读取现有窗口类的数据,保存窗口过程函数地址。对窗口类数据作必要的修改,设置新窗口过程,再换一个名称后登记一个新窗口类。新窗口类的窗口过程函数还是仅处理自己感兴趣的消息,而将其它消息传递给原窗口过程函数处理。使用GetClassInfo函数可以读取现有窗口类的数据。
子类化API
子类化是用GetWindowLong和SetWindowLong这两个API来对已经创建的窗口的窗口过程地址进行修改,用自己的窗口过程的新地址代替原来的,然后在自己写的新地址里过滤掉自己感兴趣的消息,一般我们是把自己不处理的消息再用原来的窗口函数调用,以实现我们对某一个窗口的特性的小修改要求,一般把子类化用在控件上,但也可以用在任意类型的窗口上.
窗口类是窗口的模板,窗口是窗口类的实例。窗口类和每个窗口实例都有自己的内部数据结构。Windows虽然没有公开这些数据结构,但提供了读写这些数据的API。
例如:用GetClassLong和SetClassLong函数可以读写窗口类的数据;用GetWindowLong和SetWindowLong可以读写指定窗口实例的数据。使用这些接口,可以在运行时读取或修改窗口类或窗口实例的窗口过程地址。这些接口是子类化的实现基础。
SetWindowsLongA)(窗口句柄,-16,369098752)。表示窗口无边框。
简单说来,子类化是靠拦截Windows系统中的某些消息来自己进行处理罢了。
易语言本身是不能处理WIN32消息的,所以需要窗口子类化来处理
大漠为什么启用窗口子类化
1、目的是处理的自定义消息,及时在超级列表框显示线程信息
2、用自定义消息的目的是,让我们控制线程的操作,全部都放到主线程来执行,这样可以避免使用许可证,降低效率
3、对窗口各种组件操作,最好是在创建该窗口的线程上进行操作,如果在其它线程上操作,可能会引起程序出错等情况(该错误是随机出现的)。不要频繁对控件过多的进行操作,比如易语言的超级列表框.
4、线程不能频繁的发消息给窗口,频繁的发消息给窗口,可能会造成窗口响应其他事件的缓慢
5、所有语言对窗口组件频繁的操作都会引起多线程的崩溃,堵塞!
6、大漠框架把 对超级列表框的 读写 放到了独立的 主线程里,并且使用自定义消息。
7、大漠避免了使用线程挂起恢复!
减少资源占用,防止线程崩溃!
GetWindowLongA
目的是,让我们控制线程的操作,全部都放到主线程来执行,这样可以避免使用许可证,降低效率
GetWindowLongA是一个ANSI编码的API函数,另外还有一个是Unicode编码的GetWindowLongW
函数功能:该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值。
取到窗口的过程函数地址(长整型型)= GetWindowLongA (取窗口句柄 (), #GWL_WNDPROC)
SetWindowLongA(必须和窗口线程在同一个线程)
SetWindowLong是一个Windows API函数。该函数用来改变指定窗口的属性.函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。
SetWindowLongA (取窗口句柄 (), #GWL_WNDPROC, 到数值 (&WindowProc))
CallWindowProcA
CallWindowProc是将消息信息传送给指定的窗口过程的函数。
WM_USER = 1024
CallWindowProcA (取到窗口的过程函数地址, hwnd, msg, wparam, lparam)
优酷全部教程播单:http://i.youku.com/i/UNTU3NDYyODg0/playlists
交流群:521068947
本人QQ: 272586593