MFC day02

练习:在CMyFrameWnd类中重写PreCreateWindow()函数,改变窗口显示的位置和大小

一、窗口创建
1. 创建过程
 1.1 加载菜单
 1.2 利用pFrame调用CreateEx 注册窗口类并创建窗口
  1.2.1 调用PreCreateWindow()函数 设计并注册窗口类
  1.2.2 调用AfxHookWindowCreate()函数
    1) 调用::SetWindowsHookEx()函数安装类型为WH_CBT的钩子
    2) 把new的框架窗口类对象pFrame保存在全局变量当前程序线程信息的成员中
  1.2.3 调用::CreateWindowEx函数创建窗口。该函数一旦执行成功,立即调用钩子处理函数。
  1.2.4 满足钩子条件,调用钩子处理函数
    1) 建立窗口句柄hWnd和框架窗口类对象pFrame之间的关系
         pFrame->m_hWnd = hWnd;         // pFrame 找 hWnd
         m_permanentMap[hWnd] = pFrame; // hWnd 找 pFrame
    2) 设置窗口处理函数为MFC提供的AfxWndProc函数
  1.2.5 跳转回1.2.3创建窗口 后的代码,继续执行

 2.钩子函数:有优先钩取消息的权利
 // 安装钩子的函数
 HHOOK SetWindowsHookEx(
  __in  int idHook,       // 钩子类型
  __in  HOOKPROC lpfn,    // 钩子处理函数的函数指针
  __in  HINSTANCE hMod,   // dll句柄 局部钩子的话必须为NULL
  __in  DWORD dwThreadId  // 线程ID  全局钩子 为0
 );
 WH_CBT
 // 钩子处理函数
 LRESULT CALLBACK CBTProc(
  __in  int nCode,      // 钩子码 HCBT_CREATEWND 
  __in  WPARAM wParam,  // 刚刚创建的窗口的句柄
  __in  LPARAM lParam   // ..
 );

 3.重写CWnd::WindowProc函数,完成窗口消息的处理
  消息处理:
  1) 消息产生,进入函数AfxWindowProc(窗口处理函数)
  2) 根据已知的窗口句柄 获取和其绑定的框架窗口类对象地址
  3) 使用框架窗口类对象(pFrame) 调用框架类的成员虚函数WindowProc,完成消息处理   

 4.框架窗口类CFrameWnd的总结
  4.1 虚函数
    1) PreCreateWindow() -- 创建窗口前,修改窗口的参数。在MFC框架中,作用是设计和注册窗口类
    2) WindowProc() -- 窗口处理函数
  4.2 成员变量
   m_hWnd   -- 保存对应的窗口句柄


练习:添加对消息WM_PAINT的处理,在窗口制定位置绘制字符串


 

猜你喜欢

转载自blog.csdn.net/kikizxc999/article/details/86671837