双击登录按钮,进入Button的编写
验证输入内容是否为空
//登录按钮点击事件
UpdateData(TRUE)
if (m_user.IsEmpty() || m_pwd.IsEmpty())
{
MessageBox(TEXT("输入内容不能为空"));-
}
验证输入内容是否符合要求(密码和用户名是否一致)
//获取正确的值
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("用户名有误"));
}
运行代码后弹出对话框
为了便于登录,在对话框中直接显示用户名和密码,将初始化后的密码和用户名写进OnInitDialog:单击CLoginDlg,点击属性一栏,找到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
}
设计取消按钮,双击取消
exit(0);
第一个bug:点击回车后直接进入界面
CLoginDlg->点击属性->重写->找到OnOK->注释掉 //CDialogEx::OnOK();
第二个bug:点击×后进入界面
CLoginDlg->点击属性->消息->OnClose()->添加
第三个bug:点击esc后进入界面
CLoginDlg->点击属性->重写->找到OnCancel-> 注释//CDialogEx::OnCancel();
(3)静态拆分窗口
①创建两个类CSelectView
单击项目->类向导->添加类->下拉找到MFC类
注意:这里是CTreeView
注意:这里是CFormView
vs2022中如果报错可以添加#include"afxcview.h"的头文件
②通过CSplitterWnd类拆分窗口
在CMainFrame中添加
private:
CSplitterWnd m_spliter;//切分窗口类对象
CMainFrame->属性->重写->OnCreateClient->注释掉默认值重写这一段
//return CFrameWnd::OnCreateClient(lpcs, pContext);
//拆分为一行两列
m_spliter.CreateStatic(this, 1, 2);
//左侧和右侧的具体显示内容
m_spliter.CreateView(0, 0, RUNTIME_CLASS(CSelectView), CSize(200, 500), pContext);
m_spliter.CreateView(0, 1, RUNTIME_CLASS(CDisplayView), CSize(200, 500), pContext);
return TRUE;//自己拆分
(5)树视图功能实现
双击CSelectView进入头文件后,添加
private:
CTreeCtrl* m_treeCtrl;//树控件
CImageList m_imageList;//图标列表
进入属性栏->重写->OnInitialUpdate->添加,进行初始化操作
void CSelectView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
//初始化树视图
//获取树控件
m_treeCtrl =& GetTreeCtrl();
//1,准备图片结合
HICON icon = AfxGetApp()->LoadIconW(IDI_ICON_re);//添加图片
m_imageList.Create(30, 30, ILC_COLOR32, 1, 1);//设置图片格式
m_imageList.Add(icon);
m_treeCtrl->SetImageList(&m_imageList, TVSIL_NORMAL);
//2,添加节点
m_treeCtrl->InsertItem(TEXT("个人信息"), 0, 0, NULL);
m_treeCtrl->InsertItem(TEXT("公司管理"), 0, 0, NULL);
m_treeCtrl->InsertItem(TEXT("人员添加"), 0, 0, NULL);
m_treeCtrl->InsertItem(TEXT("人员离职"), 0, 0, NULL);
// TODO: 在此添加专用代码和/或调用基类
}
点击个人信息等会触发另一个事件,进入属性栏->重写->OnTvnSelchanged->添加
void CSelectView::OnTvnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
//先获取当前的选中项
HTREEITEM item = m_treeCtrl->GetSelectedItem();
//通过选中的项获取这个项目中的内容
CString str = m_treeCtrl->GetItemText(item);
MessageBox(str);
}
成功后界面如下
(4)个人信息的搭建
①在资源视图的Dialog中插入一个新的Dialog
删除自带的控件后修改id名,在属性里将边框设置为None,将样式设置为child
编辑如下的对话框,适当调整位置
将身份和用户名后的编辑框设置为只读
将新密码和确定密码后的编辑框设置为密码
②添加一个类,注意基类为CFormView
③关联变量
(5)界面挂载
①在CMainFrame中自定义宏
//自定义消息
#define NM_A (WM_USER+100)
#define NM_B (WM_USER+101)
#define NM_C (WM_USER+102)
#define NM_D (WM_USER+103)
②在.cpp中找到分界宏加入自定义的信息
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
//产生NM_X消息,自动调用OnMyChange函数
ON_MESSAGE(NM_A,OnMyChange)
ON_MESSAGE(NM_B, OnMyChange)
ON_MESSAGE(NM_C, OnMyChange)
ON_MESSAGE(NM_D, OnMyChange)
ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)
ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)
ON_WM_SETTINGCHANGE()
END_MESSAGE_MAP()
③在MainFrame的.h文件中创建OnMychange函数
afx_msg LRESULT OnMyChange(WPARAM wParam, LPARAM lParam);
选中afx_msg LRESULT OnMyChange(WPARAM wParam, LPARAM lParam);这一行,按Alt和回车创建定义
添加return 0;
⑥在CSelectView中调用该函数
//通过选中的项获取这个项目中的内容
CString str = m_treeCtrl->GetItemText(item);
//MessageBox(str);
if (str == TEXT("个人信息"))
{
//需要包含框架类头文件#include"MainFrm.h"
//CWnd::PostMessage将一个信息放入窗口的信息队列
//AfxGetMainWnd(),框架窗口对象的指针
//AfxGetMainWnd()->GetSafeHwnd(),获取返回窗口的句柄,CWnd::GetSafeHwnd
//NM_A:发送自定义消息
//(WPARAM)NM_A:指定了附加消息的信息
//(LPARAM)0:指定了附加消息的信息,此参数这里没有意义
::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_A, (WPARAM)NM_A, (LPARAM)0);
}
接受消息的是CMainFrame中的 OnMyChange(WPARAM wParam, LPARAM lParam)
LRESULT CMainFrame::OnMyChange(WPARAM wParam, LPARAM lParam)
{
if (wParam == NM_A)
{
MessageBox(TEXT("个人信息界面挂载!"));
}
return 0;
}
将上面的这一段修改为如下内容
LRESULT CMainFrame::OnMyChange(WPARAM wParam, LPARAM lParam)
{
CCreateContext Context;
if (wParam == NM_A)
{
//MessageBox(TEXT("个人信息界面挂载!"));
//挂载界面
Context.m_pNewViewClass = RUNTIME_CLASS(CUserDlg);
Context.m_pCurrentFrame = this;
Context.m_pLastView = (CFormView*)m_spliter.GetPane(0, 1);
m_spliter.DeleteView(0, 1);
m_spliter.CreateView(0, 1, RUNTIME_CLASS(CUserDlg), CSize(600, 500), &Context);
CUserDlg* pNewView = (CUserDlg*)m_spliter.GetPane(0, 1);
m_spliter.RecalcLayout();
pNewView->OnInitialUpdate();
m_spliter.SetActivePane(0, 1);
}
else if (wParam == NM_B)
{
//MessageBox(TEXT("公司管理界面挂载!"));
}
return 0;
}
成功后会弹出对话框