1 Windows字符集
1.1 常用编码格式
在C++中,对于大小写英文字母,一个字符对应一个字节,为多字节表示文字,采用的是ASCII字符集。对于中文等其他国家的文字,一个字符对应多个字节,采用宽字节来表示文字,使用Unicode字符集,utf-8为3个字节,GBK为2个字节。我们在MFC中常使用Unicode字节。
在开发过程中常常需要将多字节转换为宽字节,在字符串前使用TEXT“xxx”为自适应编码格式的转换,即将字符串里的字符转换为当前的编码方式。在字符串前使用L“xxx”,将其转换为宽字节。
1.2 不同编码格式统计字符长度
统计多字节字符串的长度(ASCII字符):
int num = 0;
char *p = "aaaa";
num = strlen(p);
统计宽字节字符串的长度(Unicode字符):
int num = 0;
wchar_t *p2 = L"aaaaa";
num = wcslen(p2);
1.3 char* 与CString之间的转换
//char* -> CString
char * p3 = "ccc";
CString str = CString(p3);
//CString -> char *
CStringA temp;
temp = str;
char *pp = temp.GetBuffer();
2 利用向导创建MFC
2.1创建步骤
我用的版本是Visual Studio 2015,点击文件->新建->项目。选择Visual C++模板->Windows->MFC,选择MFC应用程序,输入名称和位置后,单击确定。
点击下一步。
应用程序类型选择单个文档,项目类型选择MFC标准,点击下一步。
目前不使用,单击下一步。
单击下一步。
数据库支持没有,单击下一步。
传统停靠工具栏可以不选,因为刚学所以先看一下,单击下一步。
点击下一步。
生成了四个类,CMFCAppView为视类,它的基类是CView类。CMFCAppApp为应用程序类,它的基类是上面所说的CWApp类。CMFCAppDoc类是专门处理文件的一些类。CMainFrame是上面说的框架类,它的基类是CFrameWnd。当我们想要显示一个东西的时候,要把我们显示的图形或者文字放到CMFCAppView是类中,CMainFrame类提供一个显示的框架,视类可以看作相片,框架类则可以看作相框。点击完成。
我们可以看到,此时利用向导创建MFC应用程序就成功了,可以从解决方案资源管理器中看到头文件、源文件之类的。
在MFC中我们更常用的是类视图。如果没有类视图,可以在视图->类视图中点击调出。
现在我们可以点击运行,弹出以下的窗口界面,表示创建成功。
2.2使用代码框架
MFC中通常使用的是类视图,在类视图中,单击CMainFrame,下面的对话框出现的就是该类中的所有成员函数。若双击上面类,主界面会出现对应类的.h文件,若双击类下面的成员函数,主界面会显示对应类的.cpp文件。
在CMainFrame.cpp中可以找到分界宏,如下图所示:
如果我们想实现鼠标单击返回坐标的功能,不需要向之前编码那么麻烦,右键单击CMainFrame类,点击属性。属性中的上面有一排小图标,点击消息按钮,可以发现消息名称。
找到我我们所有实现的消息,WM_LBUTTONDOWN,点击该消息右面的白框,下拉后点击加入该消息。
可以看到在MainFrm.cpp中多出了OnLButtonDown函数,在类视图中也会多出该成员函数的方法名。
OnLButtonDown函数:
CMainFrame类视图:
在分界宏之间也加入了相关的消息:
在头文件中也对函数原型进行了声明:
如果想删除掉这个功能,还是按照上面的方法,在CMainFrame类属性的消息中,单击WM_LBUTTONDOWN消息右边的白框,选择Delete就可以了。
但这样的删除只是逻辑删除,只是把原先该部分的代码注释掉,并不是物理删除。
如果我们想要实现鼠标点击返回坐标的功能,需要在视类(CMFCAppView类)中加入WM_BUTTONDOWN消息然后改写。
void CMFCAppView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CView::OnLButtonDown(nFlags, point);
CString str;
str.Format(TEXT("x = %d, y = %d"), point.x, point.y);
MessageBox(str);
}
运行结果:
若要进行画图操作,如在窗口上显示一串文字,使用视类的OnDraw方法:
// CMFCAppView 绘制
void CMFCAppView::OnDraw(CDC* pDC)
{
CMFCAppDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
pDC->TextOutW(100,100, TEXT("伍兹,永远的神!!!"));
}
运行结果:
注意:如果有了OnDraw方法,就不要使用OnPaint方法,同时存在的话 OnPaint 方法会将 OnDraw方法覆盖掉。通常不必填写OnPaint函数。