第9 章 多线程
·221·
else
return 1; // 颜色不对
if( hMutex == NULL )
{
AfxMessageBox("open Mutex error...");
return 1;
}
// 循环,等待信号
while ( true )
{
if ( WaitForSingleObject(hMutex, INFINITE) == WAIT_FAILED )
{
continue;
}
// 马前进
if ( lpHorse->x < lpHorse->rect.right )
{
lpHorse->x ++;
}
// 重绘窗口
InvalidateRect(lpHorse->hWnd, lpHorse->rect, TRUE);
// 释放Mutex
ReleaseMutex(hMutex);
// 等待, 速度快的等待时间短
Sleep(lpHorse->speed);
}
return 0;
}
(8)初始化对话框
改写对话框的OnInitDialog,进行必要的初始化,代码如下:
BOOL CRacingDlg::OnInitDialog()
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·222·
{
……
// TODO: Add extra initialization here
// 初始化Mutex
InitMutexes();
// 初始化对话框
InitDlgItem();
……
}
(9)绘制场景
为CRacingDlg 添加成员函数DrawScene,用来绘制赛马的场景,代码如下:
// 绘制场景的函数
void CRacingDlg::DrawScene(CPaintDC * pDC)
{
CRect rect;
CBrush redBrush(RGB(255, 0, 0));
CBrush greenBrush(RGB(0, 255, 0));
CBrush blueBrush(RGB(0, 0, 255));
CBrush* oldBrush;
m_RacingBox.GetClientRect(rect);
m_RacingBox.ClientToScreen(rect);
pDC->Rectangle(rect);
// 绘制红马
if( m_hRed )
{
pDC->Rectangle(m_RedHorse.rect);
oldBrush = pDC->Select