基本概念
MFC Microsoft Fundation class 微软基础类库
框架 基于Win32 SDK进行的封装
属性:缓解库关闭
属性->C/C++/代码生成/运行库/MTD
属性->常规->MFC的使用:在静态库中使用MFC,默认是使用的共享DLL,运行时库
SDK版本:开发软件的套件
WSK:开发驱动的套件
MFC基于类的管理
预编译头:
Demo01.h
Demo01.cpp
Demo01Dlg.cpp
-
Demo01Dlg.h
绑定在对话框上的类
类的继承关系:
Cobject:处理序列化以及反序列化
CCmdTarget:处理WM_COMMAND消息
CWnd:窗口类
CDialog:对话框
CDialogEx:对话框
Demo01Dlg:自己创建的对话框
-
OnInitDialog:对话框MFC框架的入口
-
MFC里和窗口句柄有关的函数,均不需要填写窗口句柄函数
-
如果需要,添加作用域强行退出MFC的命名空间
-
模态对话框
-
非模态对话框
MFC中依然支持SDK的做法
类绑定:
- 添加类
- 类名
MFC绑定变量:
值类型
控件类型
复习总结:
-
创建MFC项目的时候,项目名称中不能出现中文。
-
如果想要兼容让其他没有安装visual studio的计算机使用,那么就要使用在静态链接库中使用MFC
-
MFC是基于类的
-
Practice.h:
该文件为我们创建了CPracticeApp类
类的继承关系:
(上面还有很多)
CWinThread:应用程序线程,继承CCmdTarget
CWWinApp:对话框,继承CWinThread
CPraticeApp:是我们自己的应用程序类,继承CWinApp
-
PracticeDlg.h:
这个头文件中是我们自己创建的对话框类
类继承关系:
CObject:基础类库中的主体基类,处理序列化与反序列化
CCmdTarget:消息映射结构体系类,继承Cobject
CWnd:窗口类,继承CCmdTarget
CDialog:对话框类,继承CWnd
CDialogEx:对话框类,继承CDialog
CPraticeDlg:我们自己的对话框类,继承CDialogEx
相关操作:
-
按钮操作:在对话框上双击按钮即可编辑相关操作
-
添加对话框:比如说要在某个按钮上添加对话框,首先需要画出对话框,然后双击添加MFC类,在要显示的时候,先用这个类声明一个变量,然后使用DoModal方法,也可以先new出该对话框的类,然后使用Create方法,创建出对话框,但是这种方法需要ShowWindow方法,
实例:
第一种:
c_cppCDialogOne obj; obj.DoModal();
第二种:
c_cppCDialogTwo *obj = NULL; obj = new CDialogTwo; obj->Create(IDD_DIALOG2, this); obj->ShowWindow(SW_SHOW);
-
可以在按钮上添加变量,比如说在一个按钮上添加了一个文本框变量,将其添加为值的形式,字符串类型,那么我们在处理按钮的时候,可以直接:
其中UpDateData方法的作用是同步
c_cppUpdateData(TRUE); m_EDIT = L"欢迎来到MFC的世界!"; UpdateData(FALSE);
-
在MFC中,有很多消息是自己处理了,我们并不用关心,但是如果我们要自己处理消息
-
处理SendMessage消息:
在对话框中使用类向导,添加OnWndMsg方法,在OnOwnMsg方法中,我们可以像SDK那样处理消息。
c_cppBOOL CPracitceDlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult) { // TODO: 在此添加专用代码和/或调用基类 switch (message) { case WM_KEYDOWN: { switch (wParam) { case VK_F4: { MessageBox(L"F!", L"MSG", NULL); break; } } break; } case WM_LBUTTONDOWN: { MessageBox(L"WM_LBUTTONDOWN", L"MSG", NULL); break; } case 199: { MessageBox(L"SEND199", L"MSG", NULL); break; } case 200: { break; MessageBox(L"SEND200", L"MSG", NULL); } case 201: { MessageBox(L"SEND201", L"MSG", NULL); break; } case 202: { MessageBox(L"SEND202", L"MSG", NULL); break; } } return CDialogEx::OnWndMsg(message, wParam, lParam, pResult); }
-
处理PostMessage消息:
在对话框中使用类向导,添加PreTranslateMessage方法,在PreTranslateMessage方法中,我们可以像SDK那样处理消息。
c_cppBOOL CPracitceDlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 switch (pMsg->wParam) { case 199: { MessageBox(L"POST199", L"MSG", NULL); break; } case 200: { break; MessageBox(L"POST200", L"MSG", NULL); } case 201: { MessageBox(L"POST201", L"MSG", NULL); break; } case 202: { MessageBox(L"POST202", L"MSG", NULL); break; } } return CDialogEx::PreTranslateMessage(pMsg); }
-
-
SendMessage会等待消息响应,会阻塞,所以会按照顺序来,但是PostMessage不会等待消息返回,所以导致顺序倒置:
c_cppvoid CPracitceDlg::OnBnClickedButton1() { //CDialogOne obj; //obj.DoModal(); ///* //HWND hEdit1Dlg = ::GetDlgItem(m_hWnd, IDC_EDIT1); //::SetWindowText(hEdit1Dlg, L"欢迎来到MFC的世界!");*/ //UpdateData(TRUE); //m_EDIT = L"欢迎来到MFC的世界!"; //UpdateData(FALSE); //SendMessage(199, NULL, NULL); //SendMessage(200, NULL, NULL); //SendMessage(201, NULL, NULL); //SendMessage(202, NULL, NULL); PostMessage(199, NULL, NULL); PostMessage(200, NULL, NULL); PostMessage(201, NULL, NULL); PostMessage(202, NULL, NULL); }