3000分学习windows系列(6)

bosedom 2003-12-29 10:02:49
学习win设一学期有余,无奈学业繁重,资质鲁钝,对许多问题只是一知半解!现考试临近,特将心中不解贴出,希望各位高手不吝出手,予我等菜鸟一臂之力,小弟拜谢了!
第六问: 子类化的作用是什么?什么是属主画?ps 如是粘贴他人或书本上的回答,请注明出处。问题搞清楚,立即结贴,多谢了!
...全文
41 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
CJton 2003-12-31
  • 打赏
  • 举报
回复
向你们学习
lansefeng 2003-12-31
  • 打赏
  • 举报
回复
学习
lastman001 2003-12-31
  • 打赏
  • 举报
回复
UP
ionlic 2003-12-31
  • 打赏
  • 举报
回复
up
kwiner 2003-12-31
  • 打赏
  • 举报
回复
up
hahu 2003-12-30
  • 打赏
  • 举报
回复
窗体上的一个控件,比如输入框
你重载了一个CEdit类CMyEdit,怎么样和你窗体上的输入框相联起来呢
定义成员变量
CMyEdit m_edit;
在preSubclassWindow函数中
m_dit.SubClassDlgItem(IDC_MYEDIT);
这样就行了
zhucde 2003-12-30
  • 打赏
  • 举报
回复
贴地址:

http://mstclub.seu.edu.cn/ShowPost.aspx?PostID=35


一楼的回复的出处

走出MFC子类化的迷宫
发贴人:jpaddle2002 16 十二月 02:58 下午
许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习,有些人可能对子类化机制比较陌生。我们先看看什么是Windows的子类化。Windows给我们或是说给它自己定义了许多丰富的通用控件,如:Edit、ComboBox 、ListBox……等,这些控件功能丰富,能为我们开发工作带来极大方面,试想:我们单单是自己实现一个EDIT控件是多么的艰难!但是,在实际开发中还是有些情况这些标准控件也无能为力,比如:在我们的应用中要求一个EDIT得到老师对学生的评价A、B、C[不要对我说你想用ComboBox实现J],这时,要求在Edit中禁止对其它字母、数字的输入操作,怎么办?EDIT控件本身没有提供这种机制,我们就可以采用子类化很好的解决这类问题。我们知道,每一个 .........
xiaoxiaoliao 2003-12-30
  • 打赏
  • 举报
回复
回答什么是属主画?

Owner Draw就是控件的客户区由其所在的父窗口绘制,而不是直接取决于控件的窗口函数对消息WM_PAINT的处理.
属主画是通过子控件向父窗口发送WM_DRAWITEM等特殊消息实现的.
eastred 2003-12-29
  • 打赏
  • 举报
回复
Windows在注册一个窗口时,填入WNDCLASS 结构的各个成员,该结构的lpfnWndProc成员即指向该类窗口事例的窗口过程地址,用来处理与该窗口事例相关的所有消息。子类化即是通过替换该类的某个窗口事例的窗口过程,在这个过程中,对自己感兴趣的某些消息进行处理,而对其他消息则传入原始窗口过程,以达到修改某一窗口的行为和特性的目的。如对Windows提供的标准控制类EDIT 建立一个基于该类的窗口,则用Windows API函数SetWindowLong替换其窗口过程,禁止某些字符输入,以达到输入数据的合法性。

子类化的限制:因子类化是对已存在的某一窗口产生作用,所以其作用范围只有这一窗,又由于可能不清楚该类怎样使用额外的类和窗口字节,所以不能保证正确使用这些空间存储信息,最后,因窗口已存在,所以新的窗口过程永远不会接收到第一个WM_CREATE消息或其他以前的消息。子类化只适用于改变极少数窗口行为和属性时使用。

转贴
huanyun 2003-12-29
  • 打赏
  • 举报
回复
许多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中的子类化机制,本人就自己做的一点“探索”作出总结,希望能给大家点启示。

转贴

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧