• MFC中的几个虚函数



    1、PreTranslateMessage()和WindowProc()

        PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,通过函数名也可以猜出来。绝大多数窗口的消息都要通过这里,比较常用,当你需要在MFC之前处理某些消息时,常常要在这里添加代码。通过重载这个函数,我们可以控制窗口的消息控制流程。不经过PreTranslateMessage()的消息是采用SendMessage()或其他类似的向窗口直接发送而不经过消息队列的消息,故切记SendMessage()发送的消息是不能用PreTranslate来截取的,应该重载WindowProc窗口过程来响应消息!

    因为PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,所以PreTranslateMessage()肯定是在窗口过程WindowProc()之前调用,而且对话框的WindowProc()里不能响应WM_KEYDOWN和WM_CHAR消息(因为他们被WINDOWS内部的对话框过程处理了,即在基类中完成了处理,或者被发送给子控件进行处理),所以我们都是重载PreTranslateMessage()而不是WindowProc()。

    2、PreSubclassWindow()

        PreSubclassWindow通过名字就知道是SubclassWindow之前调用的,那什么是SubclassWindow呢,SubclassWindow被称为子类化窗口。子类化窗口(控件)就是将窗口(控件)原有的、标准的消息处理函数替换成对应的MFC消息处理函数。
    通过ddx/ddv机制绑定的控件不用调用Create(),其创建的时候也不会触发OnCreate(),因为它走的是子类化机制,而动态创建的控件是Create()完成的而不走子类化机制。所以,如果你定义了一个控件(如CButton派生类CMyButton),然后使用对话框数据交换(ddx/ddv)将一个按钮与自己的派生类对象关联,这时候你如果想要在Button建立之前做一些操作就应该写在"PreSubclassWindow()"中。而如果你用的不是对话框数据关联ddx/ddv,而是自己通过Create()动态创建的Button窗口,这时候,一些建立前的操作就应该写在PreInitDialog()或PreCreateWindow()中,而一些建立后的操作可以放在OnCreate()中。

        控件的Create()函数可以设置控件的风格,而通过在资源视图创建(ddx/ddv机制绑定)的控件不用调用Create(),这时候可以在资源视图下右击按钮->属性来设置控件风格。

    3、OnInitDialog()
        OnInitDialog()函数是对WM_INITDIALOG消息作出的反应,这条消息是在对话框即将显示之前,在Create,CreateIndirect或DoModal调用期间发出的。

    4、OnOK()、OnCancel()、DestroyWindow()
        如果要处理用户点击MFC对话框自动生成的“确认”按钮事件则重载OnOK();
        如果要处理用户点击MFC对话框自动生成的“取消”按钮事件或右上角“关闭”选项则重载OnCancel();
        OnOK()和OnCancel()最终都会调用DestroyWindow();
        如果想关闭对话框则直接调用OnOK()函数,OnOK()是CDialog类的protected虚函数。

  • 相关阅读:
    golang_并发安全: slice和map并发不安全及解决方法
    什么情况下需要用到互斥锁sync.Mutex?
    使用Charles进行HTTPS抓包
    centos6 yum 源失效 404,终于解决了
    GOMAXPROCS你设置对了吗?
    容器资源可见性问题与 GOMAXPROCS 配置
    gflags 使用方式
    分布式训练问题
    NCCL常用环境变量
    git 常用命令
  • 原文地址:https://www.cnblogs.com/milanleon/p/5784357.html
Copyright © 2020-2023  润新知