没有合适的资源?快使用搜索试试~ 我知道了~
走出MFC子类化的迷宫子类化,SUBCLASSWINDOW ,MFC消息机制
需积分: 50 25 下载量 143 浏览量
2010-05-20
15:16:46
上传
评论 2
收藏 38KB DOC 举报
温馨提示
试读
6页
走出MFC子类化的迷宫子类化,SUBCLASSWINDOW ,MFC消息机制
资源推荐
资源详情
资源评论
许多 Windows 程序员都是跳过 SDK 直接进行 RAD 开发工具[或 VC,我想 VC 应不属于
RAD]的学习,有些人可能对子类化机制比较陌生。---
我们先看看什么是 Windows 的子类化。Windows 给我们或是说给它自己定义了许多丰富
的通用控件,如:Edit、ComboBox 、ListBox……等,这些控件功能丰富,能为我们开发
工作带来极大方面,试想:我们单单是自己实现一个 EDIT 控件是多么的艰难!但是,在
实际开发中还是有些情况这些标准控件也无能为力,比如:在我们的应用中要求一个 EDIT
得到老师对学生的评价 A、B、C[不要对我说你想用 ComboBox 实现 J],这时,要求在 Edit
中禁止对其它字母、数字的输入操作,怎么办?EDIT 控件本身没有提供这种机制,我们就
可以采用子类化很好的解决这类问题。---
我们知道,每一个 Windows 窗口[这里是 EDIT]都有一个窗口处理函数负责对消息处理,
子类化的办法就是用我们自己的消息处理函数来替代窗口原有的、标准的处理函数。当然
我们自己的窗口处理函数只是关心那些特定的消息[在这里当然是 WM_CHAR 了],而其它
消息,再发给原来的窗口函数处理。在 SDK 中的实现方法是调用函数 SetWindowLong
:---
WNDPROC * oldWndProc = (WNDPROC)SetWindowLong(hWnd,
GWL_WNDPROC,(DWORD)AfxGetAfxWndProc());
其中 AfxGetAfxWndProc()是我们自己的窗口处理函数,在其中处理过我们感兴趣的消息
后就可能通过返回的原窗口处理函数指针 oldWndProc 来把其它消息按标准方法处理掉,具
体做法请查阅相关资料。---
但到了 MFC“时代”,一切都被包装起来了,原来的窗口类注册、窗口函数都不见了[或是
说隐身了],我想对于那些“刨根问底”的程序员有兴趣了解在 MFC 中的子类化机制,本人就
自己做的一点“探索”作出总结,希望能给大家点启示。---
我们先用 MFC 实现我上面提到的要求:一个只能输入 A,B,C 的 EDIT 控件。---
启动时界面如下:---
输入时就只能输入 A、B、C,并且只允许输入一个字母。---
实现方法:---
先派生一个自己的类 CsuperEdit,Ctrl + W 后,在其中处理 WM_CHAR,然后再编辑
这个消息处理函数:---
void CSuperEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
TCHAR ch[20];
GetWindowText(ch,20);
if (strlen(ch) == 1 && (nChar <= 'C' && nChar >= 'A'))
return;
if (nChar != 'A'
&& nChar != 'B'
&& nChar != 'C'
)
return;
资源评论
lwj_68065699
- 粉丝: 1
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功