这个demo用到的控件:
按钮、编辑框、下拉框、子窗口、单选控件,微调控件、时间控件、列表控件
同时练习数值型和控件型关联变量
注意:
-
在使用微调控件时,需要按CTRL + D修改CTRL顺序,让微调框和前面的编辑框绑定Ctrl顺序相连。
-
在使用单选框时需要设置组长
1. 核心代码逻辑
登录窗口
// CLoginDialog.cpp: 实现文件
//
#include "pch.h"
#include "Management.h"
#include "afxdialogex.h"
#include "CLoginDialog.h"
// CLoginDialog 对话框
IMPLEMENT_DYNAMIC(CLoginDialog, CDialogEx)
CLoginDialog::CLoginDialog(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_LOG_DLG, pParent)
, m_user(_T(""))
, m_key(_T(""))
{
}
CLoginDialog::~CLoginDialog()
{
}
void CLoginDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_USER, m_user);
DDX_Text(pDX, IDC_EDIT_KEY, m_key);
}
BEGIN_MESSAGE_MAP(CLoginDialog, CDialogEx)
ON_BN_CLICKED(ID_BTN_LOG, &CLoginDialog::OnBnClickedBtnLog)
END_MESSAGE_MAP()
// CLoginDialog 消息处理程序
void CLoginDialog::OnBnClickedBtnLog()
{
UpdateData();
if (m_key.IsEmpty() || m_user.IsEmpty()) {
MessageBox(L"用户名或密码为空",L"提示",MB_ICONWARNING);
return;
}
//核对账号密码
if (m_user == L"admin"&&m_key==L"root") {
//登录成功
MessageBox(L"欢迎回来,admin用户");
EndDialog(IDOK);
}
else {
MessageBox(L"用户名或密码错误", L"提示", MB_ICONERROR);
return;
}
}
主窗口
// ManagementDlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "Management.h"
#include "ManagementDlg.h"
#include "afxdialogex.h"
#include"CAddDialog.h"
#include<vector>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CManagementDlg 对话框
CManagementDlg::CManagementDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MANAGEMENT_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CManagementDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CManagementDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_SIZE()
ON_BN_CLICKED(IDC_BNT_ADD, &CManagementDlg::OnBnClickedBntAdd)
ON_BN_CLICKED(IDC_BNT_DEL, &CManagementDlg::OnBnClickedBntDel)
END_MESSAGE_MAP()
// CManagementDlg 消息处理程序
BOOL CManagementDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
//获取主窗口客户区的宽高
CRect rect;
GetClientRect(rect);
m_dialog.Create(IDD_FRAME_DIALOG, this);
m_dialog.ShowWindow(SW_SHOW);
m_dialog.MoveWindow(120, 25, rect.Width() - 175, rect.Height() - 50);
ShowWindow(SW_MAXIMIZE);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CManagementDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CManagementDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
//最大化窗口重绘
void CManagementDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
if (m_dialog.GetSafeHwnd()) {
//句柄存在,移动窗口,重绘
//获取主窗口客户区的宽高
CRect rect;
GetClientRect(rect);
m_dialog.MoveWindow(120, 25, rect.Width() - 175, rect.Height() - 50);
}
}
void CManagementDlg::OnBnClickedBntAdd()
{
CAddDialog addlg;
if (IDCANCEL == addlg.DoModal()) {
return;
}
//获取添加的信息
std::vector<CString>msg;
addlg.GetMsg(msg);
//插入到list控件中
InsertList(msg);
}
void CManagementDlg::OnBnClickedBntDel()
{
//获取光标选择的位置
CListCtrl& hand = m_dialog.m_list;
POSITION pos = hand.GetFirstSelectedItemPosition();
//获取选择索引
int nSel = hand.GetNextSelectedItem(pos);
if (nSel < 0) {
MessageBox(L"没有找到选择上的内容,请选择后删除内容");
}
else {
hand.DeleteItem(nSel);
}
}
增加成员窗口
#pragma once
#include "afxdialogex.h"
#include<vector>
// CAddDialog 对话框
class CAddDialog : public CDialogEx
{
DECLARE_DYNAMIC(CAddDialog)
public:
CAddDialog(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CAddDialog();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ADD_DLG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
std::vector<CString>work_Type = { L"研发部",L"人事部",L"财务部",L"销售部" };
void InitDeparment() {
for (int i = 0; i < work_Type.size(); i++) {
m_deparment.AddString(work_Type[i]);
}
m_deparment.SetCurSel(0);
}
public:
CString deparment_name = L" ";
CString job_name = L" ";
int m_number;
CString m_worknum;
int m_sex;
int m_age;
CComboBox m_deparment;
CComboBox m_job;
float m_money;
COleDateTime m_joinTile;
COleDateTime m_leaveTime;
CString m_phone;
CString m_address;
afx_msg void OnBnClickedBtnAdd();
//返回添加的信息
void GetMsg(std::vector<CString>& msg) {
msg.clear();
CString turn;
turn.Format(L"%05d", m_number);
msg.push_back(turn);
msg.push_back(m_worknum);
msg.push_back(m_sex ? L"女" : L"男");
turn.Format(L"%d", m_age);
msg.push_back(turn);
//获取部门信息
msg.push_back(deparment_name);
//获取工作岗位信息
msg.push_back(job_name);
//住址
msg.push_back(m_address);
//入职时间
msg.push_back(m_joinTile.Format(L"%Y-%m-%d"));
//离职时间
if (m_leaveTime != m_joinTile) {
msg.push_back(m_leaveTime.Format(L"%Y-%m-%d"));
}
else {
msg.push_back(L"没有离职");
}
//薪资
turn.Empty();
turn.Format(L"%0.2f", m_money);
msg.push_back(turn);
//电话
msg.push_back(m_phone);
}
virtual BOOL OnInitDialog();
};
// CAddDialog.cpp: 实现文件
//
#include "pch.h"
#include "Management.h"
#include "afxdialogex.h"
#include "CAddDialog.h"
// CAddDialog 对话框
IMPLEMENT_DYNAMIC(CAddDialog, CDialogEx)
CAddDialog::CAddDialog(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_ADD_DLG, pParent)
, m_number(0)
, m_worknum(_T(" "))
, m_sex(0)
, m_age(0)
, m_money(0.0)
, m_joinTile(COleDateTime::GetCurrentTime())
, m_leaveTime(COleDateTime::GetCurrentTime())
, m_phone(_T(" "))
, m_address(_T(" "))
{
}
CAddDialog::~CAddDialog()
{
}
void CAddDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_NUM, m_number);
DDX_Text(pDX, IDC_NAME, m_worknum);
DDX_Radio(pDX, IDC_MAN, m_sex);
DDX_Text(pDX, IDC_AHE, m_age);
DDX_Control(pDX, IDC_WORK_TYPE, m_deparment);
DDX_Control(pDX, IDC_WORK, m_job);
DDX_Text(pDX, IDC_MONEY, m_money);
DDX_DateTimeCtrl(pDX, IDC_DATETIME_BEGIN, m_joinTile);
DDX_DateTimeCtrl(pDX, IDC_DATETIMEZ_END, m_leaveTime);
DDX_Text(pDX, IDC_TELEPHONE, m_phone);
DDX_Text(pDX, IDC_HOME, m_address);
}
BEGIN_MESSAGE_MAP(CAddDialog, CDialogEx)
ON_BN_CLICKED(ID_BTN_ADD, &CAddDialog::OnBnClickedBtnAdd)
END_MESSAGE_MAP()
// CAddDialog 消息处理程序
void CAddDialog::OnBnClickedBtnAdd()
{
UpdateData(TRUE);
//判断工号和姓名存在
if (m_worknum.IsEmpty() || m_number == 0) {
MessageBox(L"请填写完全工号和姓名");
}
else {
//添加完毕
m_deparment.GetWindowText(deparment_name);
m_job.GetWindowText(job_name);
EndDialog(IDOK);
}
}
BOOL CAddDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
//初始化下拉列表
InitDeparment();
m_job.AddString(L"C++工程师");
m_job.AddString(L"Java工程师");
m_job.AddString(L"Python工程师");
m_job.AddString(L"WEB工程师");
m_job.AddString(L"会计");
m_job.AddString(L"销售");
m_job.SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}