mfc 学习的第七天
1、新建项目
1.1根据向导创建项目
首先,新建MFC项目(SaleSystem),基于单文档,MFC标准项目,同时去掉工具栏(去掉勾选 使用传统的停靠工具栏)。
1.2添加预处理指令
由于微软在VS2013中不建议在使用C/C++的传统库函数scanf,strcpy,sprintf等,所以直接使用这些库函数会提示C4996错误。
VS建议采用带_s的函数,如scanf_s,strcpy_s,但这些并不是标准C/C++函数。想要继续使用此函数,需要添加_CRT_SECURE_NO_WARNINGS这个预定义。
在项目→属性→C/C++→预处理器→预处理器定义中添加_CRT_SECURE_NO_WARNINGS
1.3设置窗口属性
1.3.1设置图标
打开资源视图,添加本地ICO图标,在res文件夹中添加我们提前准备的图标资源。
在资源的属性中修改ID(ID_ICON_WIN)
在CMainFrame的OnCreate()中添加如下代码:
//设置图标,IDI_ICON_WIN为图标资源ID
SetClassLong(m_hWnd, GCL_HICON, (LONG)AfxGetApp()->LoadIconW(IDI_ICON_WIN));
1.3.2设置窗口大小和居中显示
还是在CMainFrame的OnCreate()中接着写代码:
//设置窗口的位置和大小:CWnd::MoveWindow
//0,0 起点坐标x和y
//800,500 窗口宽度和高度
MoveWindow(0, 0, 800, 500);
//设置居中显示
CenterWindow();
1.3.3设置窗口标题
在CSaleSystemDoc文档类中的OnNewDocument()函数中添加如下代码:
//设置窗口标题前缀,CDocument::SetTitle
SetTitle(TEXT("销售管理系统"));
在CMainFrame的OnCreate()中添加如下代码:
//设置窗口标题后缀
SetTitle(TEXT("销售管理系统"));
2、文件处理
2.1文件内容格式
登录用户信息:
login.ini
商品信息:
stock.txt
m
2.2设计文件处理类CInfoFile
2.2.1添加文件处理类CInfoFile
右击项目→添加→添加现有项→选择中InfoFile.h .cpp→确定
2.2.2头文件InfoFile.h的设计
定义两个配置文件路径宏:
#define _F_LOGIN “./login.ini”
#define _F_STOCK “./stock.txt”
添加文件信息结构体,具体如下:
struct msg
{
int id; //商品id
string name; //商品名
int price; //商品价格
int num; //商品个数
};
商品很多,而且要经常添加删除,可以考虑用链表来存储,所以,在成员变量中添加list类型的成员变量:
list<msg> ls; //存储商品容器
int num; //用来记录商品个数
项目中需要读写的文件有两种,用户信息配置文件和商品信息文件。具体API接口如下:
//读取登陆信息
void ReadLogin(CString &name, CString &pwd);
//修改密码
void WritePwd(char* name, char* pwd);
// 读取商品数据
void ReadDocline();
//商品写入文件
void WirteDocline();
//添加新商品
void Addline(CString name, int num, int price);
|3、登录对话框
3.1 ui设计
3.1.1添加对话框资源(ID修改为DIALOG_LOGIN),添加所需控件:
3.1.2选中对话框→右击→添加类→类名:CLoginDlg
3.1.3根据需求,控件关联所需变量
用户名编辑区关联CString m_user,密码编辑区关联CString m_pwd
3.2功能实现
3.2.1在对话框类中,重写OnInitDialog函数,进行初始化,设置一些默认登录信息。
BOOL CloginDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
//默认的登录信息
CInfoFile file;
CString name, pwd;
file.ReadLogin(name, pwd);
m_user = name;
m_pwd = pwd;
//同步到控件中
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
3.2.2登录窗口的创建
在应用程序类CSaleSystemApp的InitInstance()里面的APP创建之前创建登录对话框:
BOOL CSaleSystemApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。 否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
//创建登录窗口,并以模态方式创建
CloginDlg dlg;
dlg.DoModal();
CWinApp::InitInstance();
3.2.3登录按钮功能实现
//登录按钮处理函数
void CloginDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//登录按钮点击事件
UpdateData(TRUE);//更新控件数据到对应变量
if (m_user.IsEmpty()||m_pwd.IsEmpty())
{
MessageBox(TEXT("输入内容不能为空"));
return;
}
//获取正确的值
CInfoFile file;
CString name, pwd;
file.ReadLogin(name,pwd);
if (name == m_user) //用户名一致
{
if (pwd == m_pwd) //密码一致
{
//关闭当前对话框
CDialog::OnCancel();
}
else
{
MessageBox(TEXT("密码有误"));
}
}
else
{
MessageBox(TEXT("用户名有误"));
}
}
3.2.4取消按钮功能实现
//取消按钮功能实现
void CloginDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//关闭当前对话框
//CDialogEx::OnClose();
exit(0);
}
3.2.5右上角关闭按钮功能实现
选中对话框模板→右击→属性→消息→WM_CLOSE
void CloginDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//关闭当前对话框
//CDialogEx::OnClose();
exit(0); //结束整个程序
}
3.2.6编辑区回车键关闭对话框问题解决
CloginDlg类→属性→重写→OnOK
void CloginDlg::OnOK()
{
// TODO: 在此添加专用代码和/或调用基类
//CDialogEx::OnOK();
}
4、静态拆分窗口
4.1自定义MFC视图类
自定义两个类:CSelectView和CDisplayView(它的基类必须是视图类)。
CSelectView继承于CTreeView,CDisplayView继承于CFromView。
项目右击→添加→类→MFC类→添加→取类名,设置基类→完成
4.2通过CSplitterWnd类拆分窗口
4.2.1CMainFrame类中,声明CSplitterWnd类型的对象:
private:
CSplitterWnd m_spliter; //切分窗口类对象
4.2.2重写框架类CMainFrame的OnCreateClient函数。
把OnCreateClient()函数的返回值改为return TRUE;
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
//return CFrameWnd::OnCreateClient(lpcs, pContext);
return TRUE;
}
静态拆分实现代码如下:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调