最近在学自绘,我会把我的心得持续写在这个博客上。如有不对之处,请回复,本人会第一时间改正。谢谢!
嘿嘿,知道了吧!怎么拦截?试试API吧!用
SetWindowLong这个函数。易语言的格式是:
文本代码:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
子类化:
什么是子类化?别把子类化看的太那个什么了,这个原理跟打仗把通信兵截下换上自己的通信兵一样一样的!
大家想想,是不是在编程时有些控件的某一功能没有?这些功能易语言支持库的开发人员不可能每件事都想到,所以自己动手,丰衣足食,自己做这些功能。之前大家可能都是通过代码来完成,比如让编辑框无法输入特定字符,就在“内容被改变”事件里写判断语句。可是这样费时费力,没法大规模应用,所以,子类化这个“救世主”来啦!
Windows操作系统对于控件功能,都是已“消息”来完成。我们要自绘,就要把这些消息拦截,更改为自己的消息。大家来看看流程图吧。
![[原创]零起点学会自绘(持续更新) - 贺仔 - 贺仔的博客 一步一步学自绘_肥田版 - 肥田 - 随意~~](http://img169.ph.126.net/_t1lEJ90yVYfGOdUkpGtrQ==/2163135196022934759.jpg)
我自己画了一个打仗原理的流程图:
![[原创]零起点学会自绘(持续更新) - 贺仔 - 贺仔的博客 [原创]零起点学会自绘(持续更新) - 贺仔 - 贺仔的博客](http://img8.ph.126.net/ZzMhRqt9kISur_h0oWzgkw==/2498653368278154028.jpg)
易语言声明格式:
DLL命令名 | 返回值数据类型 | 公开 | 备注 | |
SetWindowLong | 整数型 |
| 在窗口结构中为指定的窗口设置信息指定数据的前一个值 | |
DLL库文件名 | ||||
user32 | ||||
在DLL库中对应命令名 | ||||
SetWindowLongA | ||||
成员名 | 类型 | 传址 | 数组 | 备注 |
hWnd | 整数型 |
|
| 欲为其取得信息的窗口的句柄 |
nIndex | 整数型 |
|
| 函数的功能索引,参考GWL_相关常量 |
dwNewLong | 整数型 |
|
| 由nIndex指定的窗口信息的新值; |
.DLL命令 API_SetWindowLong, 整数型, "user32", "SetWindowLongA", 在窗口结构中为指定的窗口设置信息 指定数据的前一个值
.参数 hwnd, 整数型, , 欲为其取得信息的窗口的句柄
.参数 nIndex, 整数型, , 请参考GetWindowLong函数的nIndex参数的说明
.参数 dwNewLong, 整数型, , 由nIndex指定的窗口信息的新值;
这个么,易语言有个好的API查询工具:
易用API伴侣。我不太推荐用易语言的向导API助手。因为他的API不太全,也没有常量。
严重跑题啊= =我说下这个API的说明:
dwNewLong参数指定新的属性值。如果nIndex为GWL_WNDPROC,dwNewLong表示新窗口过程地址,SetWindowsLong调用后返回控件窗口原来的窗口过程地址,由于窗口子类化的出发点就是为了尽量使用控件原有的功能,程序大部分不处理的消息还要靠原来的窗口过程来处理,所以这个地址必须被保存下来,以便下面可以转发消息。