练习:在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的处理,在窗口制定位置绘制字符串