MFC入门(四)-- 新建线程+按键响应(计算出生天数+打开掏宝小Demo)

版权声明:本文为博主原创文章,转载请告知一声 https://blog.csdn.net/zmdsjtu/article/details/53335660


//没错,我承认,刚刚谈了一个女朋友…所以用很久很久没用的MFC来练练手啦~


遇到的问题以及关键点总结下:

1.打开链接的函数:

ShellExecute(NULL, _T("open"), _T("www.taobao.com"), NULL, NULL, SW_SHOWNORMAL);


2.显示时间的代码部分:

SYSTEMTIME sys;
CString txt_show;
GetLocalTime(&sys);
txt_show.Format(L"%4d/%02d/%02d %02d:%02d:%02d 星期%1d", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wDayOfWeek);
SetDlgItemText(IDC_EDIT2, txt_show);

3.计算时间的代码部分://主要用到CTimeSpan这个类,用起来非常顺畅!


CTime time1 = CTime::GetCurrentTime();
CTime m_begintime = CTime(1992, 10, 5, 0, 30, 11, -1);//参数依次为year,month,day,hour,minite,second
CTime m_endtime = CTime::GetCurrentTime();//当前时间
CTimeSpan span;

span = m_endtime - m_begintime;


txt_show.Format(L"猫女破壳 %I64d天  总计%I64d秒", span.GetDays(), span.GetTotalSeconds());
SetDlgItemText(IDC_EDIT3, txt_show);


4.GetDays()等函数返回的值是longlong类型,故而转化的时候需要写成%I64d否则写多个%d的时候会篡位……(还没搞清楚原理…)


5.设置按键响应的方法:

在类向导里添加PreTranslateMessage重写如下(具体代码和按键稍微看下就知道啦)

BOOL CMFCApplication1Dlg::PreTranslateMessage(MSG* pMsg)
{
	if (pMsg->message == WM_KEYDOWN)
	{
		switch (pMsg->wParam)
		{
		case VK_ESCAPE:
			CDialogEx::OnCancel();
			return true;
			break;

		}
	}
	return CDialogEx::PreTranslateMessage(pMsg);
}


6.定一个了一个实时刷新显示当前系统时间的函数:

//这里很无脑的写了一个While(1), 这是非常不好的,调试用ESC关闭会出现问题,但是生成EXE不会影响,所以就不管了,233

解决办法很简单,在类里定义一个变量来检测ESC按键,检测到了就退出循环,这里的while(1)换成while(bool)就好

void CMFCApplication1Dlg::调用时间() {
		while(1){
		SYSTEMTIME sys;
		CString txt_show;
		GetLocalTime(&sys);
		txt_show.Format(L"%4d/%02d/%02d %02d:%02d:%02d 星期%1d", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wDayOfWeek);
		SetDlgItemText(IDC_EDIT2, txt_show);

		CTime time1 = CTime::GetCurrentTime();
		CTime m_begintime = CTime(1992, 10, 5, 0, 30, 11, -1);//参数依次为year,month,day,hour,minite,second
		CTime m_endtime = CTime::GetCurrentTime();//当前时间
		CTimeSpan span;

		span = m_endtime - m_begintime;


		txt_show.Format(L"猫女破壳 %I64d天  总计%I64d秒", span.GetDays(), span.GetTotalSeconds());
		SetDlgItemText(IDC_EDIT3, txt_show);

		m_begintime = CTime(2016, 11, 21,23, 10, 0, 0);
		span = m_endtime - m_begintime;


		txt_show.Format(L"在一起了:❤%I64d天 %2d小时 %2d分 %2d秒❤", span.GetDays(), span.GetHours(), int(span.GetMinutes()), int(span.GetSeconds()));
		SetDlgItemText(IDC_EDIT6, txt_show);


		m_begintime = CTime(1992, 12, 14, 3, 30, 0, -1);
		span = m_endtime - m_begintime;

		txt_show.Format(L"犬男破壳 %I64d天  总计%I64d秒", span.GetDays(), span.GetTotalSeconds());
		SetDlgItemText(IDC_EDIT5, txt_show);



		Sleep(1000);
		}
	}


7.重头戏!!!在类里定义一个thread

首先当然需要#include<thread>  //多么方便的C++11线程


接着在生成的类里添加变量 thread 线程1

	std::thread 线程1;


在界面初始化的时候给线程赋值:

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

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

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

	 线程1 = thread([&] {调用时间(); });
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}



.h文件如下

#pragma once

#include<thread>  
// CMFCApplication1Dlg 对话框
class CMFCApplication1Dlg : public CDialogEx
{
// 构造
public:
	CMFCApplication1Dlg(CWnd* pParent = NULL);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MFCAPPLICATION1_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:
	std::thread 线程1;
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	afx_msg void OnBnClickedCancel();
//	afx_msg void OnEnChangeEdit1();
	afx_msg void OnBnClickedOk();
	void 调用时间();
	afx_msg void OnBnClickedButton1();
};



8.换图标的方法,自己做一个ico文件,替换掉res文件目录下的图标就好

所有代码如下:http://download.csdn.net/detail/zmdsjtu/9693610



效果图如下:



最后祝女票大人天天开心:)


展开阅读全文

没有更多推荐了,返回首页