用窗口子类化技术改进Windows编辑框控件的功能
来源:互联网 发布:游戏鼠标推荐知乎2017 编辑:程序博客网 时间:2024/06/09 14:25
用窗口子类化技术改进Windows编辑框控件的功能
1.问题的提出
尽管Windows系统提供了丰富的通用控件(如按钮,编辑框,滑动条等),但
仍不可能满足我们实际应用中千差万别的需求,笔者在某项目的开发工作中就遇见
了这样的问题。项目需要一个供用户输入表格数据的接口界面,要求只接收用户输
入的数据信息,并可以利用键盘上的光标键移动输入位置以避免用户在键盘和鼠标
之间的频繁切换。简单地使用Windows的编辑框控件不仅不能对输入字符进行有效
过滤(如果给编辑框控件加上ES_NUMBER风格则只能接收0~9之间的数字而不能接
收小数点正负号等需要的字符),而且无法移动控件。如果重起炉灶自己编程来实
现,其工作量是相当可观的。为此,笔者经多次尝试,终于通过采用窗口子类化方
法,很好地解决了上述问题。
2.窗口子类化方法
应用程序为了登记一个窗口类,首先要填写好一个WNDCLASS结构,其中的结构
参数lpfnWndProc就是该类窗口函数的地址,接着调用RegisterClass()函数向Windows
系统申请登记这个窗口类。这时Windows会为其分配一块内存来存放该类的全部信息,
这个内存块称为窗口类内存块。
当应用程序要创建一个属于某一已登记窗口类的窗口时,Windows便为这个窗口分
配一块内存,即窗口内存块,用来存放与该窗口有关的专用信息。这些信息一部分来
自传递给窗口创建函数CreateWindow()或CreateWindowEx()的参数信息,另一部分则
来自所属窗口类的窗口类内存块,其中参数lpfnWndProc便被Windows从窗口类内存块
复制到为新创建窗口分配的窗口内存块中。当有消息被发送到这个窗口时,Windows检
查该窗口内存块中的窗口函数地址(lpfnWndProc),并调用该地址上的函数来处理
这些消息。
所谓窗口子类化,实际上就是改变窗口内存块中的有关参数。由于这种修改只涉
及到一个窗口的窗口内存块,因此它不会影响到属于同一窗口类的其它窗口的功能和
表现。窗口子类化中最常见的是修改窗口内存块中的窗口函数地址(lpfnWndProc),
使其指向一个新的窗口函数,从而改变原窗口函数的处理方法,改进其功能。其基本
步骤如下:
(1)编写子类化窗口函数。该函数必须为标准的窗口函数格式即:
LRESULT CALLBACK SubClassWndProc ( HWND , UINT , WPARAM , LPARAM ) ;
在这个函数中对感兴趣的消息进行处理,而把未处理或者需要原窗口函数进一步处
理的消息传送给原窗口函数;
(2)利用待子类化窗口的句柄hWnd,调用GetWindowLong ( hWnd , GWL_WNDPROC )
函数获得原窗口函数的地址并保存起来;
(3)调用SetWIndowLong ( hWnd , GWL_WNDPROC , SubClassWndProc ) 把窗口函
数设置成子类化窗口函数,完成窗口子类化。
<<上一篇: 在Visual C++6.0中轻松实现上下控件
>>下一篇: 在编辑控件中拖动文本字符串
http://www.evget.com/articles/evget_1100.html
- 用窗口子类化技术改进Windows编辑框控件的功能
- 用控件子类化实现拖放显示文件名编辑框时遇到的问题【基于对话框】
- Windows窗口子类化
- WIN32窗口子类化----自定义Edit控件的右键菜单
- 窗口子类化和超类化技术的应用
- 介绍Windows的窗口、消息、子类化和超类化
- 介绍Windows的窗口、消息、子类化和超类化
- 介绍Windows的窗口、消息、子类化和超类化
- 介绍Windows的窗口、消息、子类化和超类化
- Windows的窗口、消息、子类化和超类化
- 介绍Windows的窗口、消息、子类化和超类化
- 介绍Windows的窗口、消息、子类化和超类化
- Windows的窗口、消息、子类化和超类化
- Windows下子类化目标窗口的方法
- 介绍Windows的窗口、消息、子类化和超类化
- VC控件-子类化控件技术
- 子类化和超类化区别(介绍Windows的窗口、消息、子类化和超类化
- 子类化和超类化区别(介绍Windows的窗口、消息、子类化和超类化
- 关于变量存储类型的整理
- 界面库技术概述
- 解说Win32的窗口子类化
- 郁闷中
- 第一次用这个博客
- 用窗口子类化技术改进Windows编辑框控件的功能
- 前苏共惊人的腐**败内幕-苏联巨变大揭迷
- [转载] WPF实例学习 (A-01)
- Help me:意外情况的考虑
- 该怎样去爱一个人(很值得静心品位的一篇文章)
- 放弃"应该"才会感恩
- Java事件处理一例(awt)
- Interactive Design (Sparkle) VS Flash
- 挺恶心的笑话,别在吃饭的时候看