MFC第十一天 CDialog类的三大虚函数简介 CS模式下员工管理系统项目插入列表数据的功能开发

news2024/11/18 7:44:59

文章目录

  • CDialog类三大重要虚函数
  • MFC中反射型消息
  • CS模式员工管理系统插入列表数据的功能开发
    • 客户端代码
    • 服务器端代码

CDialog类三大重要虚函数

a)MFC平台希望接管三大重要消息:OnInitDialog() OnOK() OnCancel()
WM_INITDIALOG:
virtual BOOL OnInitDialog();

当对话框被创建后,OnInitDialog()函数会被自动调用。在这个函数中,可以进行对话框的初始化工作,如设置控件的属性、初始化变量等。如果在派生类中重写了OnInitDialog()函数,必须调用基类的同名函数,以保证基类的初始化工作得以完成。

b)点击确定和取消
ON_COMMAND(IDOK, &CDialog::OnOK)
ON_COMMAND(IDCANCEL, &CDialog::OnCancel)
virtual void OnOK();
virtual void OnCancel();

OnOK() /OnCancel() 在用户点击对话框的“确定”/"取消”按钮时被调用。默认情况下,OnOK()和OnCancel()函数会执行对话框的销毁操作,即关闭对话框。如果需要自定义“确定”按钮的行为,可以在派生类中重写OnOK()函数,并在函数中添加自定义的处理逻辑。

c)如果在派生类中重写以上函数,可以禁止回车和ESC关闭对话框。

MFC中反射型消息

控件的消息可以从父窗口方便的获取

a)类向导第二页是主窗口消息,包括WM_MOUSEMOVE等所有基础消息。
b)类向导第一页都是一些控件的ID,选择不同的ID就会列出对应控件的反射型消息。
c)原本很多消息,包括WM_MOUSEMOVE和WM_DROPFILES等消息一旦进入控件区域,都会被控件拐走。
d)消息被控件拐走之后,主窗口没有收到消息,此时要继续截获控件消息就不得不建立控件派生类并子类化(SubClass).
e)MFC为了更方便地从主窗口管理控件内部的消息,把控件内的基础消息合成高级消息反射给主窗口。
Notify这个英文就是通知,因此但凡见到BN_ EN_ LVN_ HDN_等等都是反射型消息。
LVN_ 代表ListCtrl的操作,比如新选中一行,HDN_

在这里插入图片描述

在MFC中,反射型消息是一种机制,它将窗口消息与类的成员函数关联起来,使得消息处理过程更加简化和灵活。
反射型消息机制通过使用宏和宏函数来实现。MFC提供了一系列的宏函数,比如DECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP(),这些宏函数用于声明和定义消息映射表。

首先,在类的声明中使用DECLARE_MESSAGE_MAP()宏,该宏将在类的定义中生成一个静态的消息映射表。
然后,在类的实现文件中使用BEGIN_MESSAGE_MAP()宏来定义消息映射表。在这个宏之后,可以使用类似于ON_MESSAGE()ON_COMMAND()ON_NOTIFY()等宏来将窗口消息与类的成员函数关联起来。这些宏的参数包括消息ID、消息处理函数和类的名称。
例如,下面的代码片段展示了如何使用反射型消息机制将窗口消息WM_COMMAND与类的成员函数关联起来:
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
    ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
    ON_COMMAND(ID_FILE_SAVE, OnFileSave)
    ON_COMMAND(ID_EDIT_CUT, OnEditCut)
END_MESSAGE_MAP()
在上面的代码中,CMyWnd类继承自CWnd类,使用BEGIN_MESSAGE_MAP()来定义消息映射表。ON_COMMAND()宏将窗口消息ID和类的成员函数关联起来,例如ID_FILE_OPEN和OnFileOpen()函数。

窗口接收到WM_COMMAND消息时,MFC会根据消息映射表查找对应的成员函数,并自动调用该函数进行消息处理。
通过使用反射型消息机制,我们可以将窗口消息的处理逻辑集中在类中,使代码更加清晰和易于维护。

CS模式员工管理系统插入列表数据的功能开发

客户端代码

CInputDlg .h

#pragma once
#include "afxdialogex.h"
class CWorkerDlg; //include 害怕双方会双向包含
class CInputDlg : public CDialogEx// CInputDlg 对话框
{
	DECLARE_DYNAMIC(CInputDlg)
	CWorkerDlg* m_pDlg;
	void InsertData();
	bool FindNumb(SInfo& d);
	CSocket& m_sock{ theApp.m_sock };
public:
	CInputDlg(CWorkerDlg* pParent = nullptr);   // 标准构造函数
	virtual ~CInputDlg();
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_INPUT_DLG };// 对话框数据
#endif
protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedOk();
};

CInputDlg.cpp: 实现文件

#include "pch.h"
#include "CLientXq.h"
#include "afxdialogex.h"
#include "CInputDlg.h"
#include "CWorkerDlg.h"

IMPLEMENT_DYNAMIC(CInputDlg, CDialogEx)// CInputDlg 对话框
CInputDlg::CInputDlg(CWorkerDlg* pParent)
	: CDialogEx(IDD_INPUT_DLG, (CWnd*)pParent),m_pDlg(pParent)//this 传过来给m_pDlg调用刷新
{

}
CInputDlg::~CInputDlg()
{
}
void CInputDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CInputDlg, CDialogEx)
	ON_BN_CLICKED(IDOK, &CInputDlg::OnBnClickedOk)
END_MESSAGE_MAP()

bool CInputDlg::FindNumb(SInfo& d)// CInputDlg 消息处理程序
{
	int nCmd = WK_FIND_NUMB;
	m_sock.Send(&nCmd, sizeof(nCmd));
	m_sock.Send(&d.nNumb, sizeof(d.nNumb));

	int nCount = 0;
	if (m_sock.Receive(&nCount, sizeof(nCount)) != sizeof(nCount))
		return false;
	if (nCount < 1)
		return false;
	return m_sock.Receive(&d, sizeof(d)) == sizeof(d);
}
void CInputDlg::InsertData()
{	
	SInfo d;
	CString str;
	GetDlgItemText(IDC_NUMB, str);
	d.nNumb = _tstoi(str);

	if (FindNumb(d))
	{
		MessageBox(_T("工号已存在请重新输入!"), _T("提示"), MB_ICONSTOP);
		SetFocus();
		return;
	}
	if (MessageBox(_T("确定插入这条数据吗?"), _T("提示"), MB_YESNO | MB_ICONQUESTION) == IDNO)
		return;

	GetDlgItemText(IDC_SALARY, str);
	d.fSala = (float)_tstoi(str);
	GetDlgItemText(IDC_NAME, str);
	strcpy_s(d.sName, _countof(d.sName), _bstr_t(str));
	GetDlgItemText(IDC_DATETIME, str);
	CApp::CorrentDate(str);
	strcpy_s(d.sDate, _countof(d.sDate), _bstr_t(str));

	int nCmd = WK_INPUT;
	theApp.m_sock.Send(&nCmd, sizeof(nCmd));
	theApp.m_sock.Send(&d, sizeof(d));

	SetDlgItemText(IDC_NUMB, CString());
	SetDlgItemText(IDC_NAME, CString());
	SetDlgItemText(IDC_SALARY, CString());
	SetFocus();
	m_pDlg->Refresh();
}

void CInputDlg::OnBnClickedOk()
{	
	auto pWnd = GetFocus();
	int nID = pWnd->GetDlgCtrlID();
	if (nID == IDC_DATETIME || nID == IDOK)
		InsertData();
	else
		NextDlgCtrl();
}

服务器端代码

	CManager  CManager::m_man;//实际就是全局变量
	
	MYSQL m_sql;
	CSockLx  m_sock;
	CWorker m_worker{ m_sql };
	
static void PrintError(const char* sSQL)
	{
		printf("SQL语句错误:%s\n %u: %s\n", sSQL, mysql_errno(&m_man.m_sql),
			mysql_error(&m_man.m_sql));
	}

多线程处理消息中当插入数据进来时做出反应
case WK_INPUT:
		return m_worker.Input(pSocka);

bool CWorker::Input(CSockLx* pSocka)
{
	SInfo d;
	if (pSocka->Receive(&d, sizeof(d)) < sizeof(d))
		return false;
	char sSQL[256];
	sprintf(sSQL, "INSERT INTO t_worker VALUES(%d,'%s',%0.2f,'%s')",
		d.nNumb, d.sName, d.fSala, d.sDate);
	int n = mysql_query(&m_sql, sSQL);
	if (n)
	{
		CManager::PrintError(sSQL);//WriteLog
		return false;
	}
	return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/695881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库监控与调优【十三】—— LIMIT语句优化

LIMIT语句优化 LIMIT语句使用规则 limit<offset>, <size> offset&#xff1a;返回结果第一行的偏移量&#xff08;想要跳过多少行&#xff09;size&#xff1a;指定返回多少条 举例说明 -- 查询第1页时&#xff0c;花费92ms SELECT * FROM employees LIMIT 0,…

【C++】single header跨平台高效开源日志库Easylogging++的配置和使用

【C】single header跨平台高效开源日志库Easylogging的配置和使用 一、Easylogging简介 Easylogging是一个只有单个头文件的开源跨平台日志库&#xff0c;拥有简单易集成&#xff0c;速度极快&#xff0c;线程安全&#xff0c;高效并可配置可扩展等等优点&#xff0c;现在也是…

开启JDK 11时代,掌握这些新特性,成为Java开发高手!

大家好&#xff0c;我是小米&#xff0c;欢迎来到小米科技资讯公众号&#xff01;今天我将为大家详细介绍 JDK 11 的一些新特性。JDK 11 是 Java 语言的一个重要版本&#xff0c;它带来了许多令人振奋的改进和功能&#xff0c;尤其是在电商应用领域。让我们一起来了解吧&#x…

动态规划—不同子序列 解析+代码

不同子序列 题目链接&#xff1a;不同的子序列 题目描述&#xff1a; 因为需要前字符匹配的状态&#xff0c;所以我们考虑可以使用动态规划 状态是一维数组还是二维数组&#xff1f; 使用一维数组还是二维数组视情况而定。 题目所求是字符串S有几个子序列和T匹配&#xff0…

pycharm打印不出动图怎么办?

目录 1.分析问题 2.解决方法&#xff1a; 3.将动图保存到本地 1.分析问题 加入你有一个类似如下的画动图的程序&#xff1a; import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animationfig, ax plt.subplots()x np.arange(0, 2*…

陌生领域的紧急需求 4大处理策略

产品经理刚接收离职同事工作&#xff0c;突然遇到陌生领域的紧急需求&#xff0c;时间紧任务重&#xff0c;一时着急无从下手&#xff0c;该怎么办&#xff1f;4大需求处理策略&#xff0c;让我们打破僵局。 1、定位核心问题 遇到陌生领域的紧急需求&#xff0c;首先需要确定核…

vue如何全屏(点击一个按钮界面全屏展示)

1&#xff0c;在界面上设置一个div&#xff0c;让用户点击后全屏或者退出全屏。 <div class"full-screen" click"toFullOrExit"><img :src"fullImg"/></div>2&#xff0c;进入全屏和退出全屏的方法 requestFullScreen () {let…

Tableau 和 Qlikview哪个更好用?

Tableau 和 Qlikview 是市场上用于分析数据的两种重要的 BI 工具&#xff0c;并配备了广泛的可视化效果。本文将全面概述每个工具&#xff0c;以及基于业务、技术和可视化三个主要类别的基本差异。每个公司都希望用最好的BI工具来处理大量数据。在这篇文章中&#xff0c;我们将…

Rust语言从入门到入坑——(11)面向对象

文章目录 0、引入1、封装2、继承3、多态4、引用 0、引入 Rust 不是面向对象的编程语言&#xff0c;但是可以实现面向对象方法&#xff1a;封装与继承&#xff0c;以及不完全的多态 1、封装 "类"往往是面向对象的编程语言中常用到的概念。"类"封装的是数据…

关于IE11的样式兼容问题记录

1、布局如下 <div class"map-label" :class"{active:isActive}" :style"{marginTop:${marTopVal}px}"><transition name"slide-fade"><div class"transition-out" v-if"show"><div class&q…

使用VSCode开发Unity中排除(隐藏)一些文件

使用VSCode开发Unity中排除&#xff08;隐藏&#xff09;一些文件 再使用VDCode开发的时候会将项目中的全部文件都显示出来&#xff0c;不像VS一样只显示一些可能用的到的文件。再VSCode中需要设置一些文件的过滤来只显示想要显示的文件。 打开VScode&#xff0c;打开设置搜索…

如何使用ChatGPT处理excel

用ChatGPT处理excel&#xff0c;我们需要用到的主要工具是ChatGPT和vba代码。 VBA代码是一种用于Excel&#xff0c;Word&#xff0c;PPT的Microsoft Office软件的编程语言。 可以让用户通过编写一些简单的指令和操作&#xff0c;实现自动化、自定义和数据处理等功能。 就像你编…

从0开始,部署基于yangjianxin开发的流萤(Firefly)中文对话式大语言模型的http服务端

项目介绍: Firefly&#xff08;流萤&#xff09; 是yangjianxin开发的开源的中文大语言模型项目&#xff0c;本文主要实现将此模型部署到http服务器上&#xff0c;语言实现:python&#xff0c;本项目为双创项目后端部分代码(本人根据firefly训练代码修改微调的模型暂不方便开源…

分类预测 | MATLAB实现GA-GRU遗传算法优化门控循环单元的数据多输入分类预测

分类预测 | MATLAB实现GA-GRU遗传算法优化门控循环单元的数据多输入分类预测 目录 分类预测 | MATLAB实现GA-GRU遗传算法优化门控循环单元的数据多输入分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现GA-GRU遗传算法优化门控循环单元的数据多输入分类预…

elementui el-table-column表头换行,自定义表头以及排序图标的位置放置

目录 1、普通表头换行⭐️想实现以下效果 2、表头换行时调整文字和排序图标的位置⭐️想实现以下效果遇到问题 效果如下遇到问题 效果如下⭐️最终成功实现以下效果 &#x1f44d;写在最后 1、普通表头换行 https://www.jb51.net/article/228935.htm // 在需要换行的地方加入换…

一个类似AOV或者AOE的数据结构的类似排序的算法

背景: 一个东西的执行有多个入参和出参, 一个东西的出参又可以是别的东西的入参, 因此执行的依赖关系. 草图里a b c d e f为三个东西, 上面的数字是入参,下面的数字是出参 当前已知这6个东西, 和他们的入参出参 求他们的运行顺序. 要求同样执行顺序的东西可以并行执行. 代码如…

【图像处理OpenCV(C++版)】——5.4 图像平滑之中值平滑(滤波)

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

IntelliJ IDEA - 一篇解决如何多模块项目提交到同一个 Git 仓库

问题描述 事情是这样的&#xff0c;最近新建了一个项目&#xff08;多模块&#xff09;&#xff0c;这个不必多说大家就知道长什么样子&#xff08;文件结构&#xff09;&#xff0c;问题是在我写完后想提交项目到 Git 仓库时&#xff0c;发现每个模块都要设置 Remote Git 地址…

Get “https://xx.xx.x.xx/v2/“: x509: certificate signed by unknown authority

问题描述 使用Windows docker客户端login docker私库&#xff0c;无法登录提示&#xff1a; Get "https://xx.xx.x.xx/v2/": x509: certificate signed by unknown authority原因分析&#xff1a; 由于harbor做了ssl&#xff0c;通常客户端连接需要配置证书 解决方…

Hbuilder打包android安装包流程

Hbuilder打包android安装包流程 第一步打开项目文件的manifest.json,在右侧填写具体项目应用信息&#xff0c;每次打包升级前版本号一定要设置的比上版本的高。 点击App图标配置&#xff0c;选择图标资源进行全量生成。 点击菜单”发行”&#xff0c;选择云打包&#xff0c…