• MFC 应用开发中 复习


    //hwnd 和 cwnd
    HWND是windows系统中对所有窗口的一种标识,即窗口句柄,这是一个SDK概念
    CWnd是MFC类库中所有窗口类的基类,微软在MFC中将所有窗口的通用操作都封装到了这个类中,如:ShowWindow等等,同时它封装了窗口句柄即m_hwnd
    由HWND得到CWnd*
    CWnd wnd;
    HWnd hWnd;
    wnd.Attach(hWnd)
    通常一个窗口资源已经和一个Cwnd类的对象关联起来的,由于一般来说,这个类是自己创建的,所以自然知道,怎么得到指向这个类的指针。
    如果没有就CWnd对象,将这个对象与窗口资源的hwnd句柄关联起来,(如上面的Attach)
    如果用static CWnd* CWnd::FromHandle(HWnd hWnd);
    则返回值是一个暂时的CWnd对象,并且我们确保返回值为非空,也就是hWnd有效的。
    static CWnd* CWnd::FromHandlePermanent(HWND hWnd) ;
    返回的是一个永久的对象。只有在返回的CWnd在类表里已经存在是返回值为非空。
    由CWnd获得hWnd就容易的多了,因为它的一个成员m_hWnd就是窗口对应的句柄。
    wnd->m_hWnd;

    HDC 与 CDC 同上
    HDC 为设备句柄, CDC为抽象的类, HDC为CDC的一个成员变量
    //SendMessage PostMessage原理
    1、SendMessage、PostMessage的运行机制
    SendMessage可以理解为,SendMessage函数发送消息,等待消息处理完成后,SendMessage才返回,稍稍深入一些,是等待窗口处理函数返回后,SendMessage就返回了
    PostMessage可以理解为,PostMessage函数发送消息,不等待消息处理完成,立刻返回,稍稍深入一些,PostMessage只管发送消息,消息有没有被送到并不关心,
    只要发送了消息,便立刻返回。
    2、SendMessage、PostMessage的运行内幕
    SendMessage的MSDN解释:SendMessage发送消息到指定的消息窗口,它调用特定窗口的窗口处理函数,并且不立即返回,直到窗口处理函数处理了这个消息。
    PostMessage的MSDN解释:PostMessage函数将一个消息放入与创建这个窗口的消息队列相关的线程中,并立刻返回,不等待线程处理。
    SendMessage确实是发送消息,然后等待处理完成返回,但发送消息的方法为直接调用消息处理函数(即WndProc函数),按照函数调用规则,肯定会等待消息处理函数
    返回后SendMessage才返回。而PostMessage却没有发送消息,PostMessage是将消息放入到消息队列中, 然后立刻返回,至于消息何时被处理,PostMessage完全不知道
    此时只有消息循环知道被PostMessage的消息何时被处理了。
    2、SendMessage、PostMessage的内部实现
    消息循环从消息队列里取消息
    消息循环:

    while (GetMessage(&msg, NULL, 0, 0))
    {

    TranslateMessage(&msg);

    DispatchMessage(&msg);


    TranslateMessage
    函数功能描述:将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。
    DispatchMessage函数

    函数功能:该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是MainProc()函数。
    总结:TranslateMessage函数将键盘消息转化,DispatchMessage函数将消息传给窗体函数去处理.


    关于自定义消息响应函数 的返回值,在VS中返回值必须为LRESULT ,不然的话会报错的。
    自定消息4步:
    1、自定义消息号
    2、自定义消息响应函数 在VS中返回值用LRESULT
    3、将消息号与消息响应函数绑定ON_MESSAGE()
    4、调用::SendMessage 发送消息

  • 相关阅读:
    linux 中的./configuration --prefix=安装路径 的用法(指定源码安装方式的安装路基)
    深入了解Activiti工作流流程定义
    ResultCode 自定义错误状态码
    maven和gradle对比
    js中的prototype原型解析
    json字符串的标准格式
    迷茫于Hibernate/JPA的人提一些建议。
    ModelDriven 和 Preparable 拦截器
    Spring中bean的scope
    spring配置文件详解以及beans:beans标签
  • 原文地址:https://www.cnblogs.com/lobsterIT/p/5611710.html
Copyright © 2020-2023  润新知