复习
C++
三大特性:封装、继承、多态
类构造函数:
- 调用顺序:先父类再子类,可在初始化列表中调用父类构造
- 析构顺序:先子类再父类
- 转换构造:有且仅有一个非本类类型的参数
- 默认构造:无参
- 拷贝构造:有且仅有一个本类类型引用的参数
在
main
函数前执行其他代码,比如打印Hello World
1
2
3
4
5
6int fun(){
printf("Hello World\n");
return 1;
}
int g_nNum = fun();//函数将返回值1赋给全局变量g_nNum
int main(){}1
2
3
4
5
6
7
8class MyClass{
public:
MyClass(){
printf("Hello World\n");
}
};
MyClass g_obj;//调用构造函数
int main(){}
SDK
- 窗口创建流程
- 设计窗口类:绑定类名;绑定窗口回调函数
- 注册窗口类
- 创建窗口:提供一个已注册的窗口类名
- 更新显示窗口
- 消息泵:
GetMessage
获取消息,DispatchMessage
将消息分发给窗口,TranslateMessage
转换消息
- 消息处理过程
WM_XXX
:窗口消息,处理窗口创建,窗口关闭等消息(WM_KEYDOWN
,WM_LBUTTONDOWN
)WM_COMMAND
:基本控件消息WM_NOTIFY
:通用控件的通知消息,处理列表、树、鼠标等消息
- 控件使用
- 创建控件:通过
CreateWindowEx
来创建,通过不同的窗口类名来创建不同的空间 - 操作控件:通过
SendMessage
来操作 - 响应控件消息:一般在
WM_COMMAND
消息中,wParam
的低16位保存触发消息的控件 ID
- 创建控件:通过
- 窗口创建流程
MFC
MFC 的入口在
CWinApp
的InitInstance
函数里,编写 MFC 程序,需要实现一个CWinApp
的派生类,然后实现InitInstance
这个虚函数,在此函数中创建一个窗口,将窗口对象的指针赋给m_pMainWnd
这个指针MFC 有3种编程模型:单文档、多文档、对话框
创建对话框:
要有一个对话框资源
要有一个
CDialog
类对象objDlg
调用
objDlg
的DoModal
函数创建模态对话框,不能和程序的其他窗口交互1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CMyApp:public CWinApp {
public:
virtual BOOL InitInstance();
};
BOOL CMyApp::InitInstance()
{
// TODO: 在此添加专用代码和/或调用基类
CDialog obj(IDD_DIALOG1);
obj.DoModal();
return CWinApp::InitInstance();
}
CMyApp OBJ;调用
objDlg
的Create
函数创建非模态对话框,可以和程序的其他窗口交互1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19class CMyApp:public CWinApp {
public:
virtual BOOL InitInstance();
CDialogEx *m_pobj;
};
BOOL CMyApp::InitInstance()
{
// TODO: 在此添加专用代码和/或调用基类
//CDialog obj;//这是局部对象,创建了对话框,但没显示出来,
//当离开此函数后,对象就被销毁
m_pobj = new CDialogEx();
m_pobj->Create(IDD_DIALOG1);
m_pobj->ShowWindow(SW_SHOW);
//需要将主窗口对象的地址赋给m_pMainWnd
m_pMainWnd = m_pobj;
return CWinApp::InitInstance();
}
CMyApp OBJ;
MFC 是通过消息映射机制去处理消息的
消息是程序员自己写代码处理的,实现窗口处理消息,实际上就是在给
CDialogEx
添加功能,应该使用继承。假设已有一个继承自CDialogEx
的类,去实现消息映射在类的声明中加
DECLARE_MESSAGE_MAP()
在类外加
1
2
3BEGIN_MESSAGE_MAP(本类类名, 父类名)
........ //添加对应消息的处理宏
END_MESSAGE_MAP()
绑定变量:使 MFC 在控件使用方面更具便捷性
控件的主要功能是和用户进行交互,那么控件的便捷性主要体现在获取用户数据的便捷及将用户的数据显示的便捷,通过控件和变量进行绑定,可以方便地交互数据。控件都是窗口,进行便捷的窗口操作也是一个重要的需求
绑定变量说的是控件和变量的绑定,有2种方式:
绑定基本数据类型的变量,如
int
,CString
等通过UpdateData
进行数据交互,UpdateData(TRUE)
会将控件数据更新到变量中,UpdateData(FALSE)
会将变量数据显示在控件上文本框:
CString
单选框:int
,在每组的第一个单选框去绑定 复选框:int
下拉框:CString
绑定相应的控件类对象,就可以进行窗口方面的操作,以及控件独有的一些函数
- 绑定 MFC 默认的类对象,使用 MFC 控件类的函数
- 绑定 MFC 控件类的派生类(自己实现)的对象,增强控件类的功能
控件和变量的绑定是在
DoDataExchange
函数中实现的若通过界面操作绑定变量,添加的代码和之前双击或通过类向导添加的是一样的
MFC 程序:
- 继承
CWinApp
得到一个自定义的子类 - 使用
CWinApp
的子类定义一个全局对象 - 在
CWinApp
的子类中重写虚函数:BOOL InitInstance()
- 虚函数就是 MFC 的程序入口
MFC 窗口:使用 CDialogEx
来操作对话框
1 |
|
响应消息和类向导
- 窗口消息
- 对话框初始化消息
WM_SIZE
,WM_LBUTTONDOWN
- 需要类向导
- 控件消息
- 按钮点击:直接在对话框视图上双击
- 其他控件的消息响应需要类向导
对话框
对话框的初始化函数是一个虚函数:OnInitDialog
1 | BOOL CMFCApplication1Dlg::OnInitDialog() |