基于MFC对话框的个人衣橱程序

一、

本程序基于MFC对话框实现,有我的衣橱、查看历史搭配记录,查看文章三大功能。其中我的衣橱有添加、删除、搭配、修改4个小功能。

1.1 主界面

首先,需要给我们的软件界面添加一张烧气的封面:在资源视图中,*.rc右键,添加资源。

然后,选择Bitmap,导入,选择一张我们事先准备好的BMP图片。

再然后,拖动一个Picture控件到主界面上,选择这个Picture控件,在它的type里选择Bitmap。再在Image里选择刚才的图片。于是封面就出来了。

接下来做三大功能。

 1.2 我的衣橱

功能:添加,搭配,删除,修改。

首先,拖动一个“按键控件”到主界面,我们要让这个Button1能进入一个新界面。

在资源视图,右键Dialog,插入Dialog。于是我们就得到了一个新的界面。

 接下来,让Button1和新界面关联起来。

右键新界面,点“添加类”,输入类名:myclothes,点确定。

 

 在*Dlg.cpp中添加头文件myclothes.h

#include "myclothes.h"

 为Button1添加事件处理程序,让其弹出新界面。在*Dlg.cpp中输入:

void CMFCApplication1Dlg::OnBnClickedButton1()//我的衣橱
{
	// TODO: 在此添加控件通知处理程序代码
	myclothes Dlg;
	Dlg.DoModal();
}

 现在运行程序,点击“Button1”,就能弹出新界面了。

 接下来拖入4个“按键控件”到这个新界面。

 

 1.2.1 添加

功能:选择图片,输入图片数据。将图片保存到clothes文件夹,图片数据保存到clothes_data.txt

同样,为“添加” 创建一个新界面。详情参见1.2节。

右键Dialog,插入Dialog。得到了一个新的界面。右键新界面,“添加类”,输入类名:add。

在myclothes.cpp中添加头文件add.h

#include "add.h"

 给按键 “添加”  添加事件处理程序,在myclothes.cpp中输入:

void myclothes::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	add Dlg;
	Dlg.DoModal();
}

 运行程序,这样我们就得到了一个有三级界面的软件。

为这个三级界面add拖入一个按键控件和picture控件、Static txt控件。

picture控件ID改为IDC_add_img,Static txt控件ID改为IDC_STATIC

先在add.h中添加public类的成员变量和函数名。

	CString FileName;//文件名
	CString FilePath_Name;//文件路径+文件名
	void show_pic(CString);//显示图片

  给按键“选择图片”添加事件处理程序,在add.cpp中输入:

void add::OnBnClickedButton1()//选择图片,并显示
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(TRUE, _T(""), _T("*.jpg;*.png"));
	if (dlg.DoModal() == IDOK)
	{
		FilePath_Name = dlg.GetPathName();	//获取文件路径+文件名
		FileName = dlg.GetFileName();//文件名
		SetDlgItemText(IDC_STATIC, FilePath_Name);//静态文本框中显示文件路径+名
	}
	else return;
	show_pic(FilePath_Name);//显示图片
}
void add::show_pic(CString pic_name)
{
	CImage  image;
	CRect   rect;

	image.Load(pic_name);//载入图片

	// 控件大小
	GetDlgItem(IDC_add_img)->GetWindowRect(&rect); //这里要改为你picture控件的ID

	int width = rect.Width();//获取控件宽度
	int height = rect.Height();

	// 将客户区选中到控件表示的矩形区域内  
	ScreenToClient(&rect);

	// 窗口移动到控件表示的区域,窗口大小将根据图片大小改变 
	GetDlgItem(IDC_add_img)->MoveWindow(rect.left, rect.top, width, height, TRUE);

	CWnd *pWnd = GetDlgItem(IDC_add_img);
	pWnd->GetClientRect(&rect);

	CDC *pDc = pWnd->GetDC();

	image.Draw(pDc->m_hDC, rect);
	ReleaseDC(pDc);
}

运行程序,看看效果:

 接下来给add界面再拖入1个文本编辑框和3个Combo Box控件,并给Combo Box的Type改为下拉列表。

 选择衣服颜色对应的Combo Box控件,在Data里输入:红;橙;黄;绿;粉;蓝;紫;黑;白;灰;金;银;

同理,选择衣服风格对应的Combo Box控件,在Data里输入:运动;休闲;淑女;职业;

选择穿戴部位对应的Combo Box控件,在Data里输入:上装;下装;

 选择衣服名称对应的“文本编辑框”控件,右键,添加变量,输入名称:m_cloth_name

同理,选择衣服颜色对应的Combo Box控件,右键,添加变量,输入名称:m_colour

选择衣服风格对应的Combo Box控件,右键,添加变量,输入名称:m_style

选择穿戴部位对应的Combo Box控件,右键,添加变量,输入名称:m_position

 

 在add界面添加“保存”按钮

 在add.h中输入public类的成员变量:

	char color_add[4] = "无";
	char style_add[8] = "无无";
	char position_add[8] = "无无";

 给“保存”按键添加事件处理程序,在add.cpp中输入:

(注意:要在项目-属性-字集符中,改为使用多字节字符集)

void add::OnBnClickedButton2()//保存
{
	// TODO: 在此添加控件通知处理程序代码
	CString cmd("copy ");//复制图片指令
	CString des(" .\\clothes");//目的文件夹
	CString str = cmd + FilePath_Name + des;

	char *name;
	name = (LPSTR)(LPCSTR)str;//cstring转char*
	system(name);//复制图片

	CString cloth_name;//衣服名称
	int color;//颜色
	int style;//风格
	int position;//部位

	m_cloth_name.GetWindowText(cloth_name);//获取编辑框文本到cloth_name
	color = m_colour.GetCurSel();//获取选择的颜色
	style = m_style.GetCurSel();
	position = m_position.GetCurSel();

	switch (color)
	{
	case 0: strcpy_s(color_add, "白"); break;
	case 1: strcpy_s(color_add, "橙"); break;
	case 2: strcpy_s(color_add, "粉"); break;
	case 3: strcpy_s(color_add, "黑"); break;
	case 4: strcpy_s(color_add, "红"); break;
	case 5: strcpy_s(color_add, "黄"); break;
	case 6: strcpy_s(color_add, "灰"); break;
	case 7: strcpy_s(color_add, "金"); break;
	case 8: strcpy_s(color_add, "蓝"); break;
	case 9: strcpy_s(color_add, "绿"); break;
	case 10: strcpy_s(color_add, "银"); break;
	case 11: strcpy_s(color_add, "紫"); break;
	default:
		break;
	}
	switch (style)
	{
	case 0: strcpy_s(style_add, "淑女"); break;
	case 1: strcpy_s(style_add, "休闲"); break;
	case 2: strcpy_s(style_add, "运动"); break;
	case 3: strcpy_s(style_add, "职业"); break;
	default:
		break;
	}
	switch (position)
	{
	case 0: strcpy_s(position_add, "上装"); break;
	case 1: strcpy_s(position_add, "下装"); break;
	default:
		break;
	}

	fstream outfile;
	outfile.open("clothes_data.txt", ios::out | ios::ate | ios::app);
	if (!outfile)
	{
		MessageBox(_T("save fail"));
		return;
	}
	outfile.seekp(0, ios::end);
	outfile << FileName << "  " << cloth_name << "  " << color_add << "  " << style_add << "  " << position_add << endl;
	outfile.close();
}

运行程序:点击保存后,图片会存到clothes文件夹,图片数据会存到clothes_data.txt

1.2.2 搭配

功能:选择衣服库里的图片,按照一定的搭配规则,推荐合适的搭配衣服。并将搭配记录保存到history.txt

1.2.3 删除

功能:删除衣服库里的图片,并删除clothes_data.txt里的数据记录,如果存在对应的搭配记录,也删除。

1.2.4 修改

功能:选择衣服库里的图片,将修改后的属性更改到clothes_data.txt

1.3 查看历史

功能:读取history.txt里的记录,并显示最近3套的搭配记录

拖动一个“按键控件”到主界面,命名为“查看历史”。请见1.2节

在资源视图,右键Dialog,插入Dialog。于是我们就得到了一个新的界面。

右键新界面,点“添加类”,输入类名:history,点确定。

在*Dlg.cpp中添加头文件history.h

#include "history.h"

 为按键“查看历史”添加事件处理程序,让其弹出新界面。在*Dlg.cpp中输入:

void CStylistDlg::OnBnClickedButton2()//查看历史
{
	// TODO: 在此添加控件通知处理程序代码
	history Dlg;
	Dlg.DoModal();
}

在这个新界面拖入6个picture控件和1个按键控件,将picture控件ID依次改为IDC_his_img1-6,按键控件命名为“查看历史”。

 在history.h中输入public类的成员变量和函数名:

(注意:要将num初始化=0)

	char filename_his1[40];//衣服的文件名1
	char filename_his2[40];//衣服的文件名2
	int num;//历史记录的数量

	void draw1(int i,int j);//显示1
	void draw2(int i,int j);//显示2

 为按键“查看历史”添加事件处理程序,在history.cpp中输入:

void history::OnBnClickedButton1()//查看历史搭配
{
	// TODO: 在此添加控件通知处理程序代码
	fstream  infile2;
	infile2.open("history.txt", ios::in | ios::out | ios::app);//打开有历史记录的txt,如果该txt不存在则创建。

	while (!infile2.eof())
	{
		infile2 >>  cloth[num].filename_his1;
		infile2 >>  cloth[num].filename_his2;
		num++;
	}
	infile2.close();

	if (num > 1)//因为txt最后一行为空,所有num比实际大1。
	{
		for (int i = num-2,j=0; i>=0 && i>=num-4; i--,j++)//显示最近3套历史记录
		{

			draw1(i,j);
			draw2(i,j);
		}
	}
	else  MessageBox(_T("没有找到历史记录"));
	num = 0;
}
void history::draw1(int i,int j)
{
	CImage  image;
	CRect   rect;

	image.Load(cloth[i].filename_his1);

	// 控件大小
	GetDlgItem(IDC_his_img1 + j * 2)->GetWindowRect(&rect);

	int width = rect.Width();//获取控件宽度
	int height = rect.Height();


	// 将客户区选中到控件表示的矩形区域内  
	ScreenToClient(&rect);

	// 窗口移动到控件表示的区域,窗口大小将根据图片大小改变 
	GetDlgItem(IDC_his_img1 + j* 2)->MoveWindow(rect.left, rect.top, width, height, TRUE);

	CWnd *pWnd = GetDlgItem(IDC_his_img1 + j * 2);
	pWnd->GetClientRect(&rect);

	CDC *pDc = pWnd->GetDC();

	image.Draw(pDc->m_hDC, rect);
	ReleaseDC(pDc);
}

void history::draw2(int  i,int j)
{
	CImage  image2;
	CRect   rect;

	image2.Load(cloth[i].filename_his2);

	// 控件大小
	GetDlgItem(IDC_his_img2 + j * 2)->GetWindowRect(&rect);

	int width = rect.Width();//获取控件宽度
	int height = rect.Height();


	// 将客户区选中到控件表示的矩形区域内  
	ScreenToClient(&rect);

	// 窗口移动到控件表示的区域,窗口大小将根据图片大小改变 
	GetDlgItem(IDC_his_img2 + j * 2)->MoveWindow(rect.left, rect.top, width, height, TRUE);

	CWnd *pWnd2 = GetDlgItem(IDC_his_img2 + j * 2);
	pWnd2->GetClientRect(&rect);

	CDC *pDc2 = pWnd2->GetDC();

	image2.Draw(pDc2->m_hDC, rect);
	ReleaseDC(pDc2);
}

 运行程序:(因为只有2套记录,只显示两套)

 

1.4 文章推送

功能:读取txt文件中的内容,显示到文本框中。

拖动一个“按键控件”到主界面,命名为“文章推送”。请见1.2节

在资源视图,右键Dialog,插入Dialog。于是我们就得到了一个新的界面。

右键新界面,点“添加类”,输入类名:artcle,点确定。

在*Dlg.cpp中添加头文件artcle.h

#include "artcle.h"

为按键“文章推送”添加事件处理程序,让其弹出新界面。在*Dlg.cpp中输入:

void CStylistDlg::OnBnClickedButton3()//文章推送
{
	// TODO: 在此添加控件通知处理程序代码
	artcle Dlg;
	Dlg.DoModal();
}

在新界面拖入文本编辑框,把文本编辑框的Multiline改为True,Auto HScroll改为False,Auto VScroll改为True,Vertical Scroll改为True

在项目-类向导中,选择类名artcle,选择虚函数OnlnitDialog,添加函数,应用。

 在artcle.cpp中输入:

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

	// TODO:  在此添加额外的初始化
	try  //读取txt里的内容,并显示到文本框。需事先创建artcle.txt,并写入内容
	{
		CString str;
		CFile f("artcle.txt", CFile::modeRead);
		f.Read(str.GetBuffer(f.GetLength()), f.GetLength());
		f.Close();
		GetDlgItem(IDC_EDIT1)->SetWindowText(str);
	}
	catch (...)
	{
		MessageBox(_T("no find artcle.txt"));
	}

	return TRUE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE
}

运行程序:

最后附上程序下载地址:

基于MFC对话框的个人衣橱程序-C++文档类资源-CSDN下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值