主要步骤概括:
1、使用类向导创建CWinThread的派生类(以CUIThread类为例)。
2、使用类向导创建CDialog的派生类(以CUIThreadDlg类为例)。
3、在CUIThread类的头文件中,添加CUIThreadDlg类变量m_dlg。
4、利用m_dlg新建对话框窗口和关闭对话框窗口来重载CUIThread的InitInstance()和ExitInstance()。
5、对CUIThreadDlg类,对应的对话框资源,进行功能设计。(如重载OnLButtonDown())。
下面以一个简单例子详细介绍如何实现界面线程:
1、建立一个对话框工程MultiThread,在对话框中加入一个按钮IDC_UI_THREAD,标题为“用户界面线程”。
2、利用类向导为工程添加一个新类CUIThread,基类为CWinThread。
3、在资源视图里面插入一个对话框,ID为IDD_UITHREADDLG,标题为“线程对话框”。
4、为该对话框创建一个基于CDialog类的CUIThreadDlg。该步骤还是利用类向导,点击添加类,选择基类CDialog,输入前面的类名,在ID框中选择刚才插入的那个对话框ID。
5、到此为止我们已经建立了一个对话框工程,新建了一个线程类,一个对话框,并为此对话框建立了一个对话框类。现在需要将该对话框和线程类关联起来。在CUIThread类的头文件里面将对话框类CUIThreadDlg.h包含进来。并添加protected型成员变量CUIThreadDlg m_dlg。这样便在线程类里面创建了对话框类对象,可以利用该对象去重载InitInstance()和Exitinstance()。
BOOL CUIThread::InitInstance()
{
m_dlg.Create(IDD_UITHREADDLG);//创建此ID号的对话框窗口
m_dlg.ShowWindow(SW_SHOW);//显示窗口
m_pMainWnd=&m_dlg;//获取对话框窗口指针
return TRUE;
}
int CUIThread::ExitInstance()
{
m_dlg.DestoryWindow();//销毁窗口
return CWinThread::ExitInstance();
}
以上重载函数内容显而易见,就是在线程类里面关联起之前建立的对话框,有开始,也有结束。
6、接下来我们只需要在主对话框中开启这个界面线程就好了,双击按钮IDC_UI_THREAD,添加消息响应函数,在函数里面只需一句话开启界面线程就可以了
CWinThread* pThread=AfxBeginThread(RUNTIME_CLASS(CUIThread));
当然,既然用到了这个线程类,那么就得把它的头文件包含进来#include "UIThread.h"。这样一个简单的用户界面线程就做好了。编译运行整个工程,就可以在主对话框里面点击按钮开启这个界面线程。
7、进一步我们便可以对这个界面线程产生的对话框进行功能设计了,比如添加一个进度条,或者添加一个消息响应,也可以在里面开启其他的工作线程等。拿最简单的添加一个消息响应来说,利用类向导选中项目里面的UIThreadDlg类,选中一个消息例如WM_LBUTTONDOWN,点击添加处理函数,或者双击就好。然后在里面添加代码即可。例如弹出一个提示框AfxMessageBox(“You clicked zhe left button!!!”)等。