MFC以C++形式封装了Windows API
//实践
编写MFC需要的头文件#include <afxwin.h>
程序执行流程:
1.实例化应用程序对象(有且只有一个)
2.执行程序入口函数 InitInstance
3.给框架类MyFrame对象动态分配空间(自动调用他的构造函数),在其构造函数内部,通过CWnd::Create 创建窗口
4.框架类对象显示窗口 CWnd::ShowWindow
5.框架类对象更新窗口 CWnd::UpdateWindow
6.保存框架类对象指针 CWinThread::m_pMainWnd
文件名:mfc.h
#include <afxwin.h>//mfc头文件 //应用程序类CWinApp,派生类 Class MyApp: public CWinApp{ public: virtual BOOL InitInstance(); //基类的虚函数,派生类只是重写,MFC程序的入口地址 }; //框架类CFrameWnd ,派生类MyFrame Class MyFrame: public CFrameWnd{ public: MyFrame();//构造函数 DECLARE_MESSAGE_MAP()//消息映射宏,声明必须用在类声明中,即 .h 文件中 afx_msg void OnLButtonDown(UINT,CPoint)//鼠标声明,value afx_msg void OnChar(UINT,UINT,UINT)//键盘声明 afx_msg void OnPaint()//绘画 };
文件名:mfc.cpp
#include "mfc.h"//对应类声明的头文件 MyApp app;//有且仅有一个全局的应用程序类对象 BOOL MyApp::InitInstance(){//程序入口地址 MyFrame *frame=new MyFrame;//1.创建框架类对象 frame->ShowWindow(SW_SHOWNORMAL);//2.显示窗口 frame->UpdateWindow();//3.更新窗口 m_pMainWnd=frame;//4.保存指向应用程序主窗口的指针,实现自动管理 return TRUE;//初始化正常则返回true } //分界宏 BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd) ON_WM_LBUTTONDOWN()//鼠标左键按下 key ON_WM_CHAR()//键盘按下 END_MESSAGE_MAP() MyFrame::MyFrame(){ Create(NULL,TEXT("mfc"));//创建窗口 } void MyFrame::OnLButtonDwon(UNIT,CPoint point){//鼠标按下 /* TCHAR buf[1024];//TCHAR 是MFC中的字符数组 wsprintf(buf,TEXT("x=%d,y=%d"),point.x,point.y);//转译 MessageBox(buf);//区别于底层的MessageBox,MFC中实则是MessageBox method 在MSDN中可查 */ //mfc中的字符串 CString CString str; str.Format(TEXT("x=%d,,,y=%d"),point.x,point.y);//格式化 MessageBox(str); } void MyFrame::OnChar(UNIT key,UNIT,UNIT){//键盘按下 CString str; str.Format(TEXT("按下了 %c 键"),key); MessageBox(str); } void MyFrame::OnPaint(){//绘画 CPaintDC dc(this);//this指定绘图设备 //帮助文档,在CDC里找其他能画的图形 dc.TextOutW(100,100,TEXT("为了部落")); dc.Ellipse(10,10,100,100);//画椭圆,两点锁定矩形内切圆 }
帮助文档:《VC++之MFC类库中文手册》。最上面是层次结构;最下面是消息映射宏。
查找Create要搜索 :CFrameWnd::Create
ps:右键项目->属性->常规->MFC的使用->在共享DLL中使用MFC
//理论
- 消息映射机制
即将消息和成员函数互相关联的表,MFC中没有事件和信号桥的概念,只有每个消息映射一个函数
ps:消息映射宏查找,在中文手册最下面。
声明宏:
DECLARE_MESSAGE_MAP()
分界宏:
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
END_MESSAGE_MAP()
程序执行流程:
- 声明宏 写到 .h 中
- 分界宏 写到 .cpp 中
- 找消息宏 写到 分界宏 中
- 把函数原型声明 写到 .h 中
- 函数实现 写到 .cpp 中
- windows 字符集
MessageBox(TEXT(“aaa”));
TEXT 自适应编码转换(即,定义里可定制多字节和宽字节):
右键项目->属性->常规->字符集->使用多字节字符集/使用Unicode字符集
Ps:TCHAR 也有自适应编码转换
“aaa” 多字节:一个字符对应一个字节
L“aaa” 宽字节:一个字符对应多个字节 Unicode:UTF-8 3个;GBK 2个;
多字节转为宽字节:MessageBox(L “aaa”);
//统计字符串长度
int num=0; char *p="aaa"; num=strlen(p); wchar_t *p2="bbbb"; num=wcslen(p2);
//char* 与 CString 之间的转换
C++ string 与 MFC CString 不可直接转换,要通过 char * .c_str();
//char*->CString char *p3="ccc"; CString str=CString(p3); //CString->char* CStringA tmp=str; char *pp=tmp.GetBuffer();