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

最后更新于:2019-02-15 01:27:26

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

1.打开链接的函数:

[cpp] view plain copy

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

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

[cpp] view plain copy

  1. SYSTEMTIME sys;
  2. CString txt_show;
  3. GetLocalTime(&sys);
  4. 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);
  5. SetDlgItemText(IDC_EDIT2, txt_show);

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

[cpp] view plain copy

  1. CTime time1 = CTime::GetCurrentTime();
  2. CTime m_begintime = CTime(1992, 10, 5, 0, 30, 11, -1);//参数依次为year,month,day,hour,minite,second
  3. CTime m_endtime = CTime::GetCurrentTime();//当前时间
  4. CTimeSpan span;
  5. span = m_endtime - m_begintime;
  6. txt_show.Format(L"猫女破壳 %I64d天  总计%I64d秒", span.GetDays(), span.GetTotalSeconds());
  7. SetDlgItemText(IDC_EDIT3, txt_show);

 

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

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

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

[cpp] view plain copy

  1. BOOL CMFCApplication1Dlg::PreTranslateMessage(MSG* pMsg)
  2. {
  3.     if (pMsg->message == WM_KEYDOWN)
  4.     {
  5.         switch (pMsg->wParam)
  6.         {
  7.         case VK_ESCAPE:
  8.             CDialogEx::OnCancel();
  9.             return true;
  10.             break;
  11.         }
  12.     }
  13.     return CDialogEx::PreTranslateMessage(pMsg);
  14. }

 

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

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

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

[cpp] view plain copy

  1. void CMFCApplication1Dlg::调用时间() {
  2.         while(1){
  3.         SYSTEMTIME sys;
  4.         CString txt_show;
  5.         GetLocalTime(&sys);
  6.         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);
  7.         SetDlgItemText(IDC_EDIT2, txt_show);
  8.         CTime time1 = CTime::GetCurrentTime();
  9.         CTime m_begintime = CTime(1992, 10, 5, 0, 30, 11, -1);//参数依次为year,month,day,hour,minite,second
  10.         CTime m_endtime = CTime::GetCurrentTime();//当前时间
  11.         CTimeSpan span;
  12.         span = m_endtime - m_begintime;
  13.         txt_show.Format(L"猫女破壳 %I64d天  总计%I64d秒", span.GetDays(), span.GetTotalSeconds());
  14.         SetDlgItemText(IDC_EDIT3, txt_show);
  15.         m_begintime = CTime(2016, 11, 21,23, 10, 0, 0);
  16.         span = m_endtime - m_begintime;
  17.         txt_show.Format(L"在一起了:❤%I64d天 %2d小时 %2d分 %2d秒❤", span.GetDays(), span.GetHours(), int(span.GetMinutes()), int(span.GetSeconds()));
  18.         SetDlgItemText(IDC_EDIT6, txt_show);
  19.         m_begintime = CTime(1992, 12, 14, 3, 30, 0, -1);
  20.         span = m_endtime - m_begintime;
  21.         txt_show.Format(L"犬男破壳 %I64d天  总计%I64d秒", span.GetDays(), span.GetTotalSeconds());
  22.         SetDlgItemText(IDC_EDIT5, txt_show);
  23.         Sleep(1000);
  24.         }
  25.     }

 

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

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

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

[cpp] view plain copy

  1. std::thread 线程1;

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

[cpp] view plain copy

  1. BOOL CMFCApplication1Dlg::OnInitDialog()
  2. {
  3.     CDialogEx::OnInitDialog();
  4.     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
  5.     //  执行此操作
  6.     SetIcon(m_hIcon, TRUE);         // 设置大图标
  7.     SetIcon(m_hIcon, FALSE);        // 设置小图标
  8.     // TODO: 在此添加额外的初始化代码
  9.      线程1 = thread([&] {调用时间(); });
  10.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
  11. }

 

.h文件如下

[cpp] view plain copy

  1. #pragma once
  2. #include<thread>  
  3. // CMFCApplication1Dlg 对话框
  4. class CMFCApplication1Dlg : public CDialogEx
  5. {
  6. // 构造
  7. public:
  8.     CMFCApplication1Dlg(CWnd* pParent = NULL);  // 标准构造函数
  9. // 对话框数据
  10. #ifdef AFX_DESIGN_TIME
  11.     enum { IDD = IDD_MFCAPPLICATION1_DIALOG };
  12. #endif
  13.     protected:
  14.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
  15. // 实现
  16. protected:
  17.     HICON m_hIcon;
  18.     // 生成的消息映射函数
  19.     virtual BOOL OnInitDialog();
  20.     afx_msg void OnPaint();
  21.     afx_msg HCURSOR OnQueryDragIcon();
  22.     DECLARE_MESSAGE_MAP()
  23. public:
  24.     std::thread 线程1;
  25.     virtual BOOL PreTranslateMessage(MSG* pMsg);
  26.     afx_msg void OnBnClickedCancel();
  27. //  afx_msg void OnEnChangeEdit1();
  28.     afx_msg void OnBnClickedOk();
  29.     void 调用时间();
  30.     afx_msg void OnBnClickedButton1();
  31. };

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

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

效果图如下: