通过实例我们来看看,MFC到底有多简单。
我们将要实现的例子是,在窗口中显示现在的时间,并实时更新。
我们是行动主义者,废话不多说,开始动手吧。
在VC6.0中,根据向导,建立一个MFC项目(exe,对话框式)。
给窗体添加一个EditBox,ID为IDC_TIME,显示时间用的。
双击OK按钮,建立OnOK()函数。
void
CThreadDlg::OnOK()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO:
Sleep(2000);
MessageBox("线程即将运行!","对话框的题目",MB_OK);
hThread=CreateThread( //hThread变量保存线程句柄,我们需要在头文件中添加
NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc, //ThreadFunc这个函数,待会我们再创建。
NULL,
0,
&ThreadID); //ThreadID 线程的ID,也需要在头文件中追加
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//CDialog::OnOK(); 这句是自动生成的,注释掉。
}
当点击OK按钮的时候,就启动线程。
然后就是在线程中实行的函数。这个函数需要放在OnOK前面,否则会出现没有定义的错误。
void
ThreadFunc(
int
int_param)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CTime time;
CString strTime;
while(TRUE)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
time=CTime::GetCurrentTime(); //取得现在的时间
strTime=time.Format("%H:%M:%S");
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime); //显示时间
Sleep(1000); //每秒更新一次
}
}
OK!现在你可以编译运行一下,慢慢欣赏你的成果吧。
我们已经实现了我们要做的事情,但是为了让我们的工作看上去更专业些,我们需要润色润色。
我们需要做两件事情。
首先把我们的定义写到头文件中。
第二我们启动了线程,当然我们也必要能够终止线程,否则退出程序,线程还没终止,会有预想不到的后果。
我们在头文件中把定义加上
protected
:
HICON m_hIcon;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
HANDLE hThread;
//
加上
DWORD ThreadID;
//
加上
volatile
BOOL m_bEndTread;
//
用于控制线程的终止
void
ThreadFunc(
int
int_param);
//
在这里定义了,就不用非要写在OnOk函数前头了
然后我们把的
while(TRUE)
改成
m_bEndTread = FALSE
while(!m_bEndTread)
让程序退出时,线程结束:双节Cancel按钮,添加OnCancel()函数
void
CThreadDlg::OnCancel()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO:
m_bEndThread = TRUE; //结束线程
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
MessageBox("ByeBye","",MB_OKCANCEL);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
CDialog::OnCancel();
}
OK。这样子,我们的作品就有点薘人的味道了。