MFC控件初始化消息处理顺序解决方法
MFC控件初始化消息处理顺序
本人MFC编程一小白,对控件消息处理这一块始终弄不明白。以下是一些我的个人理解和疑问,请大神释疑和解答。书上说任何窗口和控件都是基于消息来处理的,每一个窗口或者控件都有各自的消息,但其实这些消息在Windows内部都定义成一大堆连续的整数,因此对窗口过程而言,switch语句里处理的这些消息其实是有一定顺序的,尤其是对初始化和销毁这样的过程,就如C++里switch执行语句所蕴含的那样,case 1:条件满足先执行它,否则执行case 2:或者其他语句。这里的数字蕴含着程序的处理顺序。不过我在codeproject看到的另外一篇文章似乎C++编译器对switch语句不一定是这么处理的,里面有一些优化,详情见链接:http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem;
疑问1: 拿Edit控件举例,从调用CEdit对象Create()成员函数起,到Edit控件显示在对话框这个过程,触发了哪些消息?这些消息的处理顺序是怎样的?这些消息的处理顺序能否颠倒?
疑问2: 如果在初始化时,想改变Edit控件的背景色和文字颜色,需要改写哪些消息?如果在运行的时候,想改变Edit控件的颜色,又该改写哪些消息?
疑问3: 以上改变控件默认的行为,最终还是要落实到Windows给我们提供的API函数调用,是否可以通过直接调用函数而不处理控件消息来达到改变控件默认行为的目的?请举例
问题有点多,请大神们海涵~ O(∩_∩)O谢谢!
------解决方案--------------------
windows 系统就是消息的
如果不想使用消息机制还是换系统好点
改变edit类 最好是重写 在wm_ctlcolor消息下改变 如果在运行的时候 看你要响应何种消息!
那个消息顺序 在exe和其他工程下是不一样的!
------解决方案--------------------
你在 每个 case 中输出一个序号,就知道 消息顺序 了。
------解决方案--------------------
设断点,调试的时候ALT+7就可以看到处理的顺序了
------解决方案--------------------
控件也是窗口,不过是子窗口。其创建顺序大致如下:
PreCreateWindow() //重载函数 允许在窗口被创建之前改变创建参数
PreSubClassWinddow()//重载函数 允许用户可以首先对窗口子类化
OnGetMinMaxInfo()//消息处理函数 允许设置对窗口大小的限制
OnNcCreate()//消息处理函数通知窗口的非客户区将要创建
OnNcCalcSize()//消息处理函数允许改变窗口客户区的大小
OnCreate()//消息处理函数通知窗口已经被创建
OnSize()//消息处理函数通知窗口大小正在改变
OnMove()//消息处理函数通知窗口正在移动
OnChildNotify()
本人MFC编程一小白,对控件消息处理这一块始终弄不明白。以下是一些我的个人理解和疑问,请大神释疑和解答。书上说任何窗口和控件都是基于消息来处理的,每一个窗口或者控件都有各自的消息,但其实这些消息在Windows内部都定义成一大堆连续的整数,因此对窗口过程而言,switch语句里处理的这些消息其实是有一定顺序的,尤其是对初始化和销毁这样的过程,就如C++里switch执行语句所蕴含的那样,case 1:条件满足先执行它,否则执行case 2:或者其他语句。这里的数字蕴含着程序的处理顺序。不过我在codeproject看到的另外一篇文章似乎C++编译器对switch语句不一定是这么处理的,里面有一些优化,详情见链接:http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem;
疑问1: 拿Edit控件举例,从调用CEdit对象Create()成员函数起,到Edit控件显示在对话框这个过程,触发了哪些消息?这些消息的处理顺序是怎样的?这些消息的处理顺序能否颠倒?
疑问2: 如果在初始化时,想改变Edit控件的背景色和文字颜色,需要改写哪些消息?如果在运行的时候,想改变Edit控件的颜色,又该改写哪些消息?
疑问3: 以上改变控件默认的行为,最终还是要落实到Windows给我们提供的API函数调用,是否可以通过直接调用函数而不处理控件消息来达到改变控件默认行为的目的?请举例
问题有点多,请大神们海涵~ O(∩_∩)O谢谢!
mfc
windows
c++
编译器
编程
------解决方案--------------------
windows 系统就是消息的
如果不想使用消息机制还是换系统好点
改变edit类 最好是重写 在wm_ctlcolor消息下改变 如果在运行的时候 看你要响应何种消息!
那个消息顺序 在exe和其他工程下是不一样的!
------解决方案--------------------
你在 每个 case 中输出一个序号,就知道 消息顺序 了。
------解决方案--------------------
设断点,调试的时候ALT+7就可以看到处理的顺序了
------解决方案--------------------
控件也是窗口,不过是子窗口。其创建顺序大致如下:
PreCreateWindow() //重载函数 允许在窗口被创建之前改变创建参数
PreSubClassWinddow()//重载函数 允许用户可以首先对窗口子类化
OnGetMinMaxInfo()//消息处理函数 允许设置对窗口大小的限制
OnNcCreate()//消息处理函数通知窗口的非客户区将要创建
OnNcCalcSize()//消息处理函数允许改变窗口客户区的大小
OnCreate()//消息处理函数通知窗口已经被创建
OnSize()//消息处理函数通知窗口大小正在改变
OnMove()//消息处理函数通知窗口正在移动
OnChildNotify()