建立一个对话框,添加一个进度条控件和两个按钮控件。将两个按钮名字分别改为“启动线程1”,“启动线程2”,ID分别改为IDC_THREAD1和IDC_THREAD2。
然后为对话框插入一个MENU资源并编辑,ID为IDR_MENU1.并在对话框属性中的菜单(M)项中将IDR_MENU1选中,即将菜单添加到对黄框中。再插入一个位图资源并编辑,ID号为IDI_HEART,用于线程1,平行移动。
在头文件中定义四个protected变量
BOOL m_bSuspend1; //判断线程1是否启动
BOOL m_bSuspend2; //判断线程2是否启动
CWinThread* m_pThread1;
CWinThread* m_pThread2;
定义两个线程函数代码如下
UINT WorkThread1(LPVOID param) //线程1动作处理函数,自定义,不需要声明
{
CTwoThreadDlg* pMainWnd=(CTwoThreadDlg*)AfxGetMainWnd(); //得到主对话框窗口对象的指针
CButton* pButton=(CButton*)pMainWnd->GetDlgItem(IDC_THREAD1); //获取指定标识符的控件对象的指针
pButton->EnableWindow(FALSE); //禁止掉按钮
CWnd *pIcon=pMainWnd->GetDlgItem(IDI_ICON1);
CRect iconrect;
pIcon->GetWindowRect(&iconrect);
pMainWnd->ScreenToClient(&iconrect); //桌面串口坐标和对话框窗口坐标的转化
int x=iconrect.left;
int y=iconrect.top;
CRect rect;
pMainWnd->GetClientRect(&rect);
while(x<rect.right-iconrect.Width() && !bExit1)
{
pIcon->SetWindowPos(NULL,x,y,0,0,SWP_NOSIZE | SWP_NOZORDER);
x+=2;
Sleep(100); //休眠100ms
}
pButton->EnableWindow(TRUE); //恢复按钮
bExit1=FALSE;
return(0);
}
UINT WorkThread2(LPVOID param) //线程2动作处理函数,自定义
{
CTwoThreadDlg* pMainWnd=(CTwoThreadDlg*)AfxGetMainWnd();
CButton *pButton=(CButton*)pMainWnd->GetDlgItem(IDC_THREAD2);
pButton->EnableWindow(FALSE);
CProgressCtrl* pProgress=(CProgressCtrl*)pMainWnd->GetDlgItem(IDC_PROGRESS1);
pProgress->SetRange(0,500);
pProgress->SetPos(0);
int nPos=pProgress->GetPos();
while(nPos<500 && !bExit2)
{
pProgress->OffsetPos(5);
nPos=pProgress->GetPos();
Sleep(100);
}
pButton->EnableWindow(TRUE);
bExit2=FALSE;
return 0;
}
对两个按钮添加消息响应并编辑代码:
void CTwoThreadDlg::OnThread1() //启动线程1按键消息处理
{
// TODO: Add your control notification handler code here
m_pThread1=AfxBeginThread(WorkThread1,0); //开始线程1的全局函数
}
void CTwoThreadDlg::OnThread2() //启动线程2按键消息处理
{
// TODO: Add your control notification handler code here
m_pThread2=AfxBeginThread(WorkThread2,0); //开始线程1的全局函数
}