首先创建一个界面类,在界面类里面添加一个进度条做演示
1 #pragma once 2 #include <afxwin.h> 3 class CMyWnd : 4 public CFrameWnd 5 { 6 7 public: 8 DECLARE_MESSAGE_MAP() 9 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); 10 private: 11 CProgressCtrl m_pos; 12 public: 13 afx_msg void OnTimer(UINT_PTR nIDEvent); 14 afx_msg void OnDestroy(); 15 };
实现方法:
1 #include "pch.h" 2 #include "CMyWnd.h" 3 BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd) 4 ON_WM_CREATE() 5 ON_WM_TIMER() 6 ON_WM_DESTROY() 7 END_MESSAGE_MAP() 8 9 10 int CMyWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 11 { 12 if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 13 return -1; 14 15 // TODO: 在此添加您专用的创建代码 16 17 m_pos.Create(WS_CHILD | WS_VISIBLE, CRect(10, 10, 300, 50), this, 10001); 18 m_pos.SetRange(0, 100); 19 m_pos.SetStep(1); 20 SetTimer(1, 100, 0); 21 return 0; 22 } 23 24 25 void CMyWnd::OnTimer(UINT_PTR nIDEvent) 26 { 27 // TODO: 在此添加消息处理程序代码和/或调用默认值 28 m_pos.StepIt(); 29 30 CFrameWnd::OnTimer(nIDEvent); 31 } 32 33 34 void CMyWnd::OnDestroy() 35 { 36 CFrameWnd::OnDestroy(); 37 38 // TODO: 在此处添加消息处理程序代码 39 KillTimer(1); 40 }
在窗口创建的时候,创建进度条窗口,并设置进度条信息
启动一个定时器,定时更新进度条的进度。添加清理虚函数,结束定时器
创建基于CWinThread的类
1 #pragma once 2 #include <afxwin.h> 3 class MyThread : 4 public CWinThread 5 { 6 DECLARE_DYNCREATE(MyThread) 7 public: 8 virtual BOOL InitInstance(); 9 protected: 10 DECLARE_MESSAGE_MAP(); 11 };
注意:此类必须创建消息循环,否则将会导致AfxBegenThread函数内存不足。并且该类必须重写初始化函数。
实现方法:
1 #include "pch.h" 2 #include "MyThread.h" 3 #include"CMyWnd.h" 4 5 IMPLEMENT_DYNCREATE(MyThread, CWinThread); 6 7 BOOL MyThread::InitInstance() 8 { 9 10 CWinThread::InitInstance(); 11 // TODO: 在此添加专用代码和/或调用基类 12 CMyWnd* Dlg = new CMyWnd(); 13 Dlg->Create(NULL, "线程窗口"); 14 Dlg->ShowWindow(SW_SHOW); 15 Dlg->UpdateWindow(); 16 17 return 1; 18 } 19 20 BEGIN_MESSAGE_MAP(MyThread, CWinThread) 21 END_MESSAGE_MAP()
以上步骤做完后,就可以使用AfxBeginThread来创建界面线程了。
1 void CMFCApplicationDlg::OnBnClickedTest() 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 AfxBeginThread(RUNTIME_CLASS(MyThread)); 5 }
AfxBeginThread有两个版本,一个是界面线程版本,一个是工作线程版本。都是属于MFC的全局API。
其主要的理念就是:
通过基于CWinThread的类的 InitInstance()初始化函数来执行窗口对象。
通过全局API AfxBeginThread来创建线程。
原文:https://www.cnblogs.com/Super-biscuits/p/14845243.html