24 MFC文档串行化和单文档应用程序

文章目录

  • 文档串行化
    • 全部代码
  • 单文档应用程序搭建原理
    • 搭建框架
    • Win32 过度到MFC 三部曲
    • 设置ID资源
    • 全部代码
  • 单文档应用程序
    • 设置标题
    • 绘图
  • 简单的管理系统
    • 部分代码

文档串行化

ui 设计
在这里插入图片描述在这里插入图片描述

保存

void CfileDemoDlg::OnBnClickedBtnSave()
{
	UpdateData();
	//CFile file(L"Demo.dat",CFile::modeCreate|CFile::modeWrite);
	第一个参数:文件指针
	第二个参数:模式
	//CArchive ar(&file, CArchive::store);
	//ar << m_strName;
	//ar << m_strSex;
	//ar << m_nAge;
	//ar << m_nHeight;
	//ar << m_fWeight;
	//ar << m_fSalary;
	//ar.Close();
	//file.Close();
	//m_doc.OnNewDocument();//创建一个新文档
	m_doc.OnSaveDocument(L"Demo.dat");//保存
}

读取

void CfileDemoDlg::OnBnClickedBtnRead()
{
	//CFile file(L"Demo.dat",  CFile::modeRead);
	//CArchive ar(&file, CArchive::load);
	注意:一定要按照写入顺序读取,顺序不能乱
	//ar >> m_strName;
	//ar >> m_strSex;
	//ar >> m_nAge;
	//ar >> m_nHeight;
	//ar >> m_fWeight;
	//ar >> m_fSalary;
	//ar.Close();
	//file.Close();
	m_doc.OnOpenDocument(L"Demo.dat");//打开一个文档
	UpdateData(FALSE);//显示
}

定义一个文档类

#pragma once
#include <afxwin.h>
class CMyDoc :public CDocument
{
	CMyDoc();
};

添加虚函数判断是否保存还是读取
在这里插入图片描述

void CMyDoc::Serialize(CArchive& ar)
{
	CfileDemoDlg* pMainDlg=(CfileDemoDlg*)AfxGetMainWnd();//获取主对话框
	pMainDlg->Serialize(ar);
}

主对话框内添加Serialize虚函数
在这里插入图片描述

void CfileDemoDlg::Serialize(CArchive& ar)
{
	if (ar.IsStoring())//保存
	{
		//第一个参数:文件指针
		//第二个参数:模式
		//CArchive ar(&file, CArchive::store);
		ar << m_strName;
		ar << m_strSex;
		ar << m_nAge;
		ar << m_nHeight;
		ar << m_fWeight;
		ar << m_fSalary;
	}
	else//读取
	{
		ar >> m_strName;
		ar >> m_strSex;
		ar >> m_nAge;
		ar >> m_nHeight;
		ar >> m_fWeight;
		ar >> m_fSalary;
	}
}

全部代码

// fileDemoDlg.h: 头文件

//

#pragma once
#include "CMyDoc.h"

// CfileDemoDlg 对话框
class CfileDemoDlg : public CDialogEx
{
// 构造
public:
	CfileDemoDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_FILEDEMO_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CString m_strName;
	CString m_strSex;
	UINT m_nAge;
	UINT m_nHeight;
	float m_fWeight;
	float m_fSalary;
	CMyDoc m_doc;
	afx_msg void OnBnClickedBtnSave();
	afx_msg void OnBnClickedBtnRead();
	virtual void Serialize(CArchive& ar);
};
// fileDemoDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "fileDemo.h"
#include "fileDemoDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CfileDemoDlg 对话框



CfileDemoDlg::CfileDemoDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_FILEDEMO_DIALOG, pParent)
	, m_nAge(0)
	, m_nHeight(0)
	, m_fWeight(0)
	, m_fSalary(0)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CfileDemoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, m_strName);
	DDX_Text(pDX, IDC_EDIT2, m_strSex);
	DDX_Text(pDX, IDC_EDIT3, m_nAge);
	DDX_Text(pDX, IDC_EDIT4, m_nHeight);
	DDX_Text(pDX, IDC_EDIT5, m_fWeight);
	DDX_Text(pDX, IDC_EDIT6, m_fSalary);
}

BEGIN_MESSAGE_MAP(CfileDemoDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BTN_SAVE, &CfileDemoDlg::OnBnClickedBtnSave)
	ON_BN_CLICKED(IDC_BTN_READ, &CfileDemoDlg::OnBnClickedBtnRead)
END_MESSAGE_MAP()


// CfileDemoDlg 消息处理程序

BOOL CfileDemoDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CfileDemoDlg::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 CfileDemoDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


//保存
void CfileDemoDlg::OnBnClickedBtnSave()
{
	UpdateData();
	//CFile file(L"Demo.dat",CFile::modeCreate|CFile::modeWrite);

	第一个参数:文件指针
	第二个参数:模式
	//CArchive ar(&file, CArchive::store);
	//ar << m_strName;
	//ar << m_strSex;
	//ar << m_nAge;
	//ar << m_nHeight;
	//ar << m_fWeight;
	//ar << m_fSalary;
	//ar.Close();
	
	//file.Close();
	//m_doc.OnNewDocument();//创建一个新文档

	m_doc.OnSaveDocument(L"Demo.dat");//保存

	
}


//读取
void CfileDemoDlg::OnBnClickedBtnRead()
{
	//CFile file(L"Demo.dat",  CFile::modeRead);
	//CArchive ar(&file, CArchive::load);
	注意:一定要按照写入顺序读取,顺序不能乱
	//ar >> m_strName;
	//ar >> m_strSex;
	//ar >> m_nAge;
	//ar >> m_nHeight;
	//ar >> m_fWeight;
	//ar >> m_fSalary;
	//ar.Close();
	//file.Close();
	
	m_doc.OnOpenDocument(L"Demo.dat");//打开一个文档
	UpdateData(FALSE);//显示
}


void CfileDemoDlg::Serialize(CArchive& ar)
{
	if (ar.IsStoring())//保存
	{
		//第一个参数:文件指针
		//第二个参数:模式
		//CArchive ar(&file, CArchive::store);
		ar << m_strName;
		ar << m_strSex;
		ar << m_nAge;
		ar << m_nHeight;
		ar << m_fWeight;
		ar << m_fSalary;

	}
	else//读取
	{
		ar >> m_strName;
		ar >> m_strSex;
		ar >> m_nAge;
		ar >> m_nHeight;
		ar >> m_fWeight;
		ar >> m_fSalary;
	}
}
#pragma once
#include <afxwin.h>
class CMyDoc :public CDocument
{
public:
	CMyDoc();
public:
	virtual void Serialize(CArchive& ar);
};
#include "pch.h"
#include "CMyDoc.h"
#include "fileDemoDlg.h"

CMyDoc::CMyDoc()
{
}
void CMyDoc::Serialize(CArchive& ar)
{
	CfileDemoDlg* pMainDlg=(CfileDemoDlg*)AfxGetMainWnd();//获取主对话框
	pMainDlg->Serialize(ar);
}

单文档应用程序搭建原理

单文档应用程序(SDI应用程序)是一种基于文档的应用程序,它允许用户打开、编辑和保存单个文档。这种类型的应用程序通常用于文本编辑器、图像编辑器、绘图工具等。

在单文档应用程序中,用户可以打开一个文档,对其进行编辑并将其保存。当用户打开同一个文档时,应用程序会将其加载到内存中供用户编辑。用户可以对文档进行各种操作,如添加、删除、修改和移动文档中的内容。

与多文档应用程序(MDI应用程序)不同,单文档应用程序只允许用户同时打开一个文档。这意味着用户必须先关闭当前文档,然后才能打开另一个文档。

属性设置
在这里插入图片描述

搭建框架

在这里插入图片描述
在这里插入图片描述

Win32 过度到MFC 三部曲

CSDIApp 类

1.建立CWinApp 派生类

class CSDIApp :public CWinApp
{
	DECLARE_DYNCREATE(CSDIApp)  //声明动态创建
public:
	BOOL InitInstance();
};

2.重写CWinAPP
3.定义CWinApp派生类的全局变量

#include "stdafx.h"
#include "SDI.h"
#include "CMainFrame.h"

CSDIApp theApp;//定义CWinApp派生类的全局变量
IMPLEMENT_DYNAMIC(CSDIApp, CWinApp) //实现动态创建
BOOL CSDIApp::InitInstance()
{
	//CMainFrame* pFrame = new CMainFrame;
	//pFrame->Create(NULL, L"框架程序");
	//m_pMainWnd = pFrame;
	//pFrame->ShowWindow(SW_SHOW);
	//单文档
	CSingleDocTemplate* pDocTemplate = new CSingleDocTemplate(
		IDR_MAINFRAME,//所有资源ID
		RUNTIME_CLASS(CMainDoc),//文档类
		RUNTIME_CLASS(CMainFrame),//主窗口框架啊
		RUNTIME_CLASS(CMainView)//视图类
	);

	//添加到文档模板对象中
	AddDocTemplate(pDocTemplate);
	//解析命令行信息
	CCommandLineInfo cmdLineInfo;
	ParseCommandLine(cmdLineInfo);

	//执行命令行命令
	if (FALSE == ProcessShellCommand(cmdLineInfo))
		return FALSE;

	//显示窗口
	m_pMainWnd->ShowWindow(SW_SHOW);
	m_pMainWnd->UpdateWindow();


	return TRUE;
}

MFC 框架类

CMainFrame .h

class CMainFrame :public CFrameWnd 
{
	DECLARE_DYNCREATE(CMainFrame)  //声明动态创建
public:
	CMainFrame();
};

CMainFrame .cpp

#include "stdafx.h"
#include "CMainFrame.h"


IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) //实现动态创建

CMainFrame::CMainFrame()
{
}

完成框架
在这里插入图片描述在这里插入图片描述

设置ID资源

设置菜单
在这里插入图片描述设置图标
名字统一在这里插入图片描述
添加快捷键
在这里插入图片描述在这里插入图片描述
添加字符串
在这里插入图片描述在这里插入图片描述工具栏资源
在这里插入图片描述

创建主文档类

#pragma once
#include "stdafx.h"
class CMainDoc :public CDocument
{
	DECLARE_DYNCREATE(CMainDoc)  //声明动态创建
public:
	CMainDoc();
};
#include "CMainDoc.h"
#include "stdafx.h"
IMPLEMENT_DYNAMIC(CMainDoc,CDocument) //实现动态创建
CMainDoc::CMainDoc()
{
}

创建视图类

#pragma once
#include <afxwin.h>
class CMainView :public CView
{
		DECLARE_DYNCREATE(CMainView)  //声明动态创建
public:
	CMainView();
};
#include "CMainView.h"
#include "stdafx.h"
IMPLEMENT_DYNAMIC(CMainView, CView) //实现动态创建
CMainView::CMainView()
{
}

在这里插入图片描述

全部代码

CMainDoc.h

#pragma once
#include "stdafx.h"
class CMainDoc :public CDocument
{
	DECLARE_DYNCREATE(CMainDoc)  //声明动态创建
public:
	CMainDoc();
};

CMainDoc.cpp

#include "CMainDoc.h"
#include "stdafx.h"

IMPLEMENT_DYNAMIC(CMainDoc,CDocument) //实现动态创建

CMainDoc::CMainDoc()
{
}

CMainFrame.h

#pragma once
class CMainFrame :public CFrameWnd 
{
	DECLARE_DYNCREATE(CMainFrame)  //声明动态创建
public:
	CMainFrame();
};

CMainFrame.cpp

#include "stdafx.h"
#include "CMainFrame.h"

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) //实现动态创建

CMainFrame::CMainFrame()
{
}

CMainView.h

#pragma once
#include "stdafx.h"
class CMainView :public CView
{
	DECLARE_DYNCREATE(CMainView)  //声明动态创建
public:
	CMainView();
	virtual void OnDraw(CDC* /*pDC*/);
};

CMainView.cpp

#include "CMainView.h"
#include "stdafx.h"
IMPLEMENT_DYNAMIC(CMainView, CView) //实现动态创建
CMainView::CMainView()
{
}


void CMainView::OnDraw(CDC* /*pDC*/)
{
	// TODO: 在此添加专用代码和/或调用基类
}

CMainView.h

class CSDIApp :public CWinApp
{
	DECLARE_DYNCREATE(CSDIApp)  //声明动态创建
public:

	BOOL InitInstance();
};

CMainView.cpp

#include "stdafx.h"
#include "SDI.h"
#include "CMainFrame.h"
#include "CMainDoc.h"
#include "CMainView.h"
CSDIApp theApp;
IMPLEMENT_DYNAMIC(CSDIApp, CWinApp) //实现动态创建

BOOL CSDIApp::InitInstance()
{
	/*CMainFrame* pFrame = new CMainFrame;
	pFrame->Create(NULL, L"框架程序");
	m_pMainWnd = pFrame;
	pFrame->ShowWindow(SW_SHOW);*/

	//单文档
	CSingleDocTemplate* pDocTemplate = new CSingleDocTemplate(
		IDR_MAINFRAME,//所有资源ID
		RUNTIME_CLASS(CMainDoc),//文档类
		RUNTIME_CLASS(CMainFrame),//主窗口框架啊
		RUNTIME_CLASS(CMainView)//视图类
	);

	//添加到文档模板对象中
	AddDocTemplate(pDocTemplate);
	//解析命令行信息
	CCommandLineInfo cmdLineInfo;
	ParseCommandLine(cmdLineInfo);

	//执行命令行命令
	if (FALSE == ProcessShellCommand(cmdLineInfo))
		return FALSE;

	//显示窗口
	m_pMainWnd->ShowWindow(SW_SHOW);
	m_pMainWnd->UpdateWindow();
	return TRUE;
}

单文档应用程序

设置标题

在这里插入图片描述

设置窗口名字
在这里插入图片描述

BOOL CSingleDoc::OnNewDocument()
{
	SetTitle(L"名字");

	return CDocument::OnNewDocument();
}

在这里插入图片描述

设置窗口参数,去除多余标题
在这里插入图片描述

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.cx = 800;
	cs.cy = 600;
	cs.style = cs.style &~FWS_ADDTOTITLE;//去掉风格
	return CFrameWnd::PreCreateWindow(cs);
}

在这里插入图片描述在这里插入图片描述

绘图

在View 中绘图
在这里插入图片描述在这里插入图片描述在frame中绘图
在这里插入图片描述

结论:视图在框架之上

简单的管理系统

视图界面继承CListView
在这里插入图片描述

在这里插入图片描述
重写虚函数
在这里插入图片描述

在这里插入图片描述

void CMangerSystmView::OnInitialUpdate()
{
	CListView::OnInitialUpdate();

	m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	m_list.ModifyStyle(0, LVS_REPORT|LVS_SHOWSELALWAYS);//设置风格
	m_list.InsertColumn(0,L"ID",LVCFMT_LEFT,100);
	m_list.InsertColumn(0, L"姓名", LVCFMT_LEFT, 100);
	m_list.InsertColumn(0, L"性别", LVCFMT_LEFT, 100);
	m_list.InsertColumn(0, L"年龄", LVCFMT_LEFT, 100);
}

设置菜单在这里插入图片描述
在这里插入图片描述添加窗口
在这里插入图片描述添加类
在这里插入图片描述添加控件变量
在这里插入图片描述

添加

void CMangerSystmView::OnAdd()
{
	CAddDlg addDlg;
	if (IDCANCEL == addDlg.DoModal())
		return;
	int nCount = m_list.GetItemCount();//获取总行数
	CString str;
	str.Format(L"%d",addDlg.m_nID);
	m_list.InsertItem(nCount,str);
	m_list.SetItemText(nCount, 1, addDlg.m_strName);
	m_list.SetItemText(nCount, 2, addDlg.m_strSex);
	str.Format(L"%d", addDlg.m_nAge);
	m_list.SetItemText(nCount, 3, str);
}

在这里插入图片描述

删除

void CMangerSystmView::OnDelete()
{
	POSITION pos = m_list.GetFirstSelectedItemPosition();//获取相中的位置
	int nSel=m_list.GetNextSelectedItem(pos);
	CString str;
	str.Format(L"%d", nSel);
	SetWindowText(str);
	if (nSel < 0)
	{
		MessageBox(L"请选中后在删除");
		return;
	}
	
	if (IDYES == MessageBox(L"确定要删除吗", L"提示", MB_YESNO))
	{
		m_list.DeleteItem(nSel);
	}
}

修改
在这里插入图片描述在这里插入图片描述

void CMangerSystmView::OnModify()
{
	CModifyDlg dlg;
	POSITION pos = m_list.GetFirstSelectedItemPosition();//获取相中的位置
	int nSel = m_list.GetNextSelectedItem(pos);//获取当前选项

	if (nSel < 0)
	{
		MessageBox(L"请选中后在修改");
		return;
	}
	dlg.m_nID=_wtoi(m_list.GetItemText(nSel, 0 ));
	dlg.m_strName = m_list.GetItemText(nSel, 1);
	dlg.m_strSex= m_list.GetItemText(nSel, 2);
	dlg.m_nAge = _wtoi(m_list.GetItemText(nSel, 3));
	if (IDCANCEL == dlg.DoModal())
	{
		return;
	}
	CString str;
	str.Format(L"%d", dlg.m_nID);
	m_list.SetItemText(nSel, 0,str);
	m_list.SetItemText(nSel, 1, dlg.m_strName);
	m_list.SetItemText(nSel, 2, dlg.m_strSex);
	str.Format(L"%d", dlg.m_nAge);
	m_list.SetItemText(nSel, 3, str);

}

添加快捷键
查看菜单ID在这里插入图片描述>设置工具栏
在这里插入图片描述在这里插入图片描述

请添加图片描述

部分代码

//MangerSystmView.h

public:
	virtual void OnInitialUpdate();
	afx_msg void OnAdd();
	afx_msg void OnDelete();
	afx_msg void OnModify();
	CListCtrl& m_list ;

// MangerSystmView.cpp: CMangerSystmView 类的实现

//

#include "pch.h"
#include "framework.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "MangerSystm.h"
#endif

#include "MangerSystmDoc.h"
#include "MangerSystmView.h"

#include "CAddDlg.h"
#include "CModifyDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMangerSystmView

IMPLEMENT_DYNCREATE(CMangerSystmView, CListView)

BEGIN_MESSAGE_MAP(CMangerSystmView, CListView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, &CListView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CListView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CListView::OnFilePrintPreview)
	ON_COMMAND(ID_ADD, &CMangerSystmView::OnAdd)
	ON_COMMAND(ID_DELETE, &CMangerSystmView::OnDelete)
	ON_COMMAND(ID_MODIFY, &CMangerSystmView::OnModify)
END_MESSAGE_MAP()

// CMangerSystmView 构造/析构

CMangerSystmView::CMangerSystmView():m_list(GetListCtrl())
{
	// TODO: 在此处添加构造代码

}

CMangerSystmView::~CMangerSystmView()
{
}

BOOL CMangerSystmView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式

	return CListView::PreCreateWindow(cs);
}

void CMangerSystmView::OnInitialUpdate()
{
	CListView::OnInitialUpdate();

	m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	m_list.ModifyStyle(0, LVS_REPORT|LVS_SHOWSELALWAYS);//设置风格
	m_list.InsertColumn(0,L"ID",LVCFMT_LEFT,100);
	m_list.InsertColumn(0, L"姓名", LVCFMT_LEFT, 100);
	m_list.InsertColumn(0, L"性别", LVCFMT_LEFT, 100);
	m_list.InsertColumn(0, L"年龄", LVCFMT_LEFT, 100);
}


void CMangerSystmView::OnAdd()
{
	CAddDlg addDlg;
	if (IDCANCEL == addDlg.DoModal())
		return;
	int nCount = m_list.GetItemCount();//获取总行数
	CString str;
	str.Format(L"%d",addDlg.m_nID);
	m_list.InsertItem(nCount,str);
	m_list.SetItemText(nCount, 1, addDlg.m_strName);
	m_list.SetItemText(nCount, 2, addDlg.m_strSex);
	str.Format(L"%d", addDlg.m_nAge);
	m_list.SetItemText(nCount, 3, str);
}


void CMangerSystmView::OnDelete()
{
	POSITION pos = m_list.GetFirstSelectedItemPosition();//获取相中的位置
	int nSel=m_list.GetNextSelectedItem(pos);
	CString str;
	str.Format(L"%d", nSel);
	SetWindowText(str);
	if (nSel < 0)
	{
		MessageBox(L"请选中后在删除");
		return;
	}
	
	if (IDYES == MessageBox(L"确定要删除吗", L"提示", MB_YESNO))
	{
		m_list.DeleteItem(nSel);
	}
}

//修改
void CMangerSystmView::OnModify()
{
	CModifyDlg dlg;
	POSITION pos = m_list.GetFirstSelectedItemPosition();//获取相中的位置
	int nSel = m_list.GetNextSelectedItem(pos);//获取当前选项

	if (nSel < 0)
	{
		MessageBox(L"请选中后在修改");
		return;
	}

	dlg.m_nID=_wtoi(m_list.GetItemText(nSel, 0 ));
	dlg.m_strName = m_list.GetItemText(nSel, 1);
	dlg.m_strSex= m_list.GetItemText(nSel, 2);
	dlg.m_nAge = _wtoi(m_list.GetItemText(nSel, 3));
	if (IDCANCEL == dlg.DoModal())
	{
		return;
	}
	CString str;
	str.Format(L"%d", dlg.m_nID);
	m_list.SetItemText(nSel, 0,str);
	m_list.SetItemText(nSel, 1, dlg.m_strName);
	m_list.SetItemText(nSel, 2, dlg.m_strSex);
	str.Format(L"%d", dlg.m_nAge);
	m_list.SetItemText(nSel, 3, str);

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux驱动开发:驱动开发框架,linux内核字符设备驱动开发过程

一、驱动框架 1.Linux内核模块和字符驱动的关系 模块是Linux进行组建管理的一种方式, 结构体:对设备的管理内核需要抽象出来一个结构体来描述设备所有的共性信息写驱动需要申请一个结构体并赋值(初始化),然后注册给内核让内核统一管理 驱动:由内核统一管理,所以驱动…

Flask_自定义flask的cmd命令

创建自定义命令 from flask import Flaskapp Flask(__name__)app.cli.command() def hello():"""命令说明写这里"""print("hello python")if __name__ __main__:app.run() 执行flask --help 可以在命令查看定义的命令 注意事项&a…

CDN技术(Content Delivery Network,内容分发网络)分布式网络架构(CND与P2P(Peer-to-Peer)区别)

文章目录 CDN是什么&#xff1f;CDN的优势CDN的应用1. 静态内容加速2. 动态内容加速3. 视频流媒体4. 软件分发5. 游戏加速6. 移动应用加速 CDN收费吗&#xff1f;CND与P2P区别什么是静态内容和动态内容&#xff1f; CDN是什么&#xff1f; CDN&#xff08;Content Delivery Ne…

设计模式大白话——工厂模式

文章目录 设计模式大白话——工厂模式1.1、简单工厂:1.2、工厂方法1.3、抽象工厂 设计模式大白话——工厂模式 1.1、简单工厂: 场景与思路 ​ 现在需要开一个 Pizza 店&#xff0c;Pizza 店可以生产各种口味的 Pizza ​ 既然要生产各种各样的 Pizza&#xff0c;那就会很容易想…

在新建环境下配置低版本opencv

我这边是要解决 python报错&#xff1a;AttributeError: ‘module’ object has no attribute xfeatures2d’的问题&#xff0c; xfeatures2d在新版本已经被取消&#xff0c;但是需要使用老版本的一个函数 确定opencv与python的版本对应关系 一般来说可以对照这个表 具体来说…

【Spring】Spring更简单的读取和存储对象---使用注解

目录 1.Spring的存储对象------存储Bean对象 1.前置工作&#xff0c;配置扫描路径 2.添加注解存储Bean对象 1.Controller&#xff08;控制器存储&#xff09; 2.service&#xff08;服务存储&#xff09; 3.Repository&#xff08;仓库存储&#xff09; 4.Component&…

Java面试突击

Java面向对象有哪些特征&#xff0c;如何应用 ​ 面向对象编程是利用类和对象编程的一种思想。万物可归类&#xff0c;类是对于世界事物的高度抽象 &#xff0c;不同的事物之间有不同的关系 &#xff0c;一个类自身与外界的封装关系&#xff0c;一个父类和子类的继承关系&…

手动下载composer项目放在vendor目录下并加载

比如添加easywechat。 说是手动&#xff0c;其实半手动。 到GitHub或gitee下载 1、下载后放在项目根目录下的vendor文件夹 2、在项目根目录的文件composer.json文件添加一段 "autoload": {"psr-4": {"EasyWeChat\\": "vendor/overtrue/wech…

HCIP第一课实验小练习

目录 题目&#xff1a;​编辑 第一步&#xff1a;地址规划&#xff08;子网划分&#xff09; 第二步&#xff1a;设计拓扑并规划地址配置 第三步&#xff1a;VLAN规划配置 LW1 LW2 第四步&#xff1a;网关配置 第五步&#xff1a;及静态路由配置 第六步防止成环 题目&…

计算机视觉和滤帧技术

01 什么是计算机视觉 进入主题之前&#xff0c;先聊聊计算机视觉。 计算机视觉是指利用摄像头和电脑识别、跟踪和测量目标&#xff0c;并进行图像处理&#xff0c;使其适合人眼观察或仪器检测。作为一个科学学科&#xff0c;计算机视觉模拟生物视觉&#xff0c;旨在实现图像和视…

郭东白的架构课学习笔笔记(1)

1.架构师的品质 自信和勇气&#xff08;正确的废话&#xff09;拥有战略意图&#xff0c;所谓战略意图&#xff0c;就是拥有与其资源和能力极不相称的雄心壮志。使用演绎法寻找架构原理&#xff0c;而不是归纳法。 2.如何提升自己的架构能力 向身边比自己厉害的优秀架构师或…

【yarn】 ‘husky install‘ fails if ‘.git‘ directory does not exists解决方法

问题描述 环境&#xff1a;win10 yarn 1.22.19 问题&#xff1a;在使用yarn安装前端依赖时&#xff0c;yarn install 出现错误: .git can’t be found (see https://git.io/Jc3F9) error Command failed with exit code 1. 截图 原因分析 根据设计&#xff0c;husky安装必…

scala学习手册

1. case class学习 样例类模式匹配 1.1 样例类&#xff08;case class&#xff09;适合用于不可变的数据。它是一种特殊的类&#xff0c;能够被优化以用于模式匹配。 case class MetaData(userId: String)case class Book(name: String) {def printBookName(): Unit {printl…

Python读取excle文件,插入到数据库

一、需求背景 最近项目实践过程中遇到了一个问题&#xff1a;在使用Navicat将数据导入到PostgreSQL数据库时&#xff0c;发现时间格式的字段中的时间数值发生了变化&#xff0c;导致部分数据的时间不正确&#xff0c;故数据手动导入数据库报错。为了解决这个问题&#xff0c;决…

ARM中栈的种类与运用

1. 栈的概念 栈&#xff0c;本身是一段内存&#xff0c;程序运行时用于保存一些临时数据&#xff0c;如局部变量、参数、返回地址等等。 学习了数据结构&#xff0c;对栈的概念相信大家都不陌生&#xff0c;后进先出的数据结构&#xff0c;即最后进栈的元素最先出栈。但是在C语…

(学习笔记-TCP基础知识)TCP与UDP区别

UDP UDP不提供复杂的控制机制&#xff0c;利用IP提供面向[无连接]的通信服务。 UDP协议非常简单&#xff0c;头部只有8个字节(位)&#xff0c;UDP的头部格式如下&#xff1a; 目标和源端口&#xff1a;主要是告诉UDP协议应该把报文发给哪个进程包长度&#xff1a;该字段保存了…

【码银送书第二期】《高并发架构实战:从需求分析到系统设计》

很多软件工程师的职业规划是成为架构师&#xff0c;但是要成为架构师很多时候要求先有架构设计经验&#xff0c;而不做架构师又怎么会有架构设计经验呢&#xff1f;那么要如何获得架构设计经验呢&#xff1f; 一方面可以通过工作来学习&#xff0c;观察所在团队的架构师是如何…

栈和队列【数据结构】

1、栈 &#xff08;1&#xff09;Stack.h #pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <stdbool.h>typedef int STDataType;typedef struct Stack {STDataType* a;int top;int capacity; }ST;void STInit(ST*…

设计模式——桥梁模式

桥梁模式 定义 桥梁模式&#xff08;Bridge Pattern&#xff09;也叫做桥接模式。 将抽象和显示解耦&#xff0c;使得两者可以独立地变化。 优缺点、应用场景 优点 抽象和实现的解耦。 这是桥梁模式的主要特点&#xff0c;它完全是为了解决继承的缺点而提出的设计模式。优…

声音生成项目(6)——在矢量量化变分编码器上使用自回归模型PixelCNN模型生成新的样本

文章目录 引言PixelCNN论文简读模型介绍自回归模型PixelCNN模型结构 基础知识回顾 代码实现PixelConvLayer具体运行过程卷积模块整体网络结构 模型执行效果问题解决训练好的模型在生成新的图片时&#xff0c;为什么要逐个元素进行生成&#xff1f;掩码卷积仅仅是考虑了一部分的…