void CNewTankDlg::OnBnClickedStart()
{
// TODO: 在此添加控件通知处理程序代码
m_BtBang.Play();
m_StartMusic.Stop();
KillTimer(1);
Leve1Dlg m_leve1;
m_leve1.DoModal();
m_StartMusic.Play();
SetTimer(1,10,NULL);
}
在对话框一点击开始进入对话框二
DWORD WINAPI MyPaint(LPVOID lpParam)              //贴图线程
{
Leve1Dlg *c=(Leve1Dlg*)lpParam;
HWND hWnd= c->GetSafeHwnd();                   //获取屏幕的句柄
c->hdc = ::GetDC(hWnd);                        //获取屏幕的DC 
c->mdc =::CreateCompatibleDC(c->hdc);          //关联和屏幕兼容的内存DC
c->bufdc =::CreateCompatibleDC(c->hdc);        //关联和屏幕兼容的缓冲DC
RECT rect;   
::GetWindowRect(hWnd,&rect);                   //获取屏幕的大小
c->hBitmap =::CreateCompatibleBitmap(c->hdc,rect.right,rect.bottom);  //让内存DC关联的位图设置大小
SelectObject(c->mdc,c->hBitmap); //进行关联
c->Back.LoadBitmap(IDB_BITMAP7); //载入关卡1的地图
c->BackGround=HBITMAP(c->Back);  //转换光卡1的地图格式


while(c->Control)
{
SelectObject(c->bufdc,c->BackGround);                               //缓冲DC关联关卡1的地图
BitBlt(c->mdc,0,0,rect.right,rect.bottom,c->bufdc,0,0,SRCCOPY);     //从缓冲DC贴图到内存DC
if(1==c->Player.Attribute)
{
SelectObject(c->bufdc,c->Player.HImage);
switch(c->Player.Direct)
{
case 1:TransparentBlt(c->mdc,c->Player.Site.x,c->Player.Site.y,60,60,c->bufdc,0,0,60,60,RGB(200,200,200));break;
case 2:TransparentBlt(c->mdc,c->Player.Site.x,c->Player.Site.y,60,60,c->bufdc,60,0,60,60,RGB(200,200,200));break;
case 3:TransparentBlt(c->mdc,c->Player.Site.x,c->Player.Site.y,60,60,c->bufdc,120,0,60,60,RGB(200,200,200));break;
case 4:TransparentBlt(c->mdc,c->Player.Site.x,c->Player.Site.y,60,60,c->bufdc,180,0,60,60,RGB(200,200,200));break;
}
}
for(int i=0;i<8;i++)
{
if(1==c->Enemy[i].Attribute)
{
SelectObject(c->bufdc,c->Enemy[i].HImage);
switch(c->Enemy[i].Direct)
{
case 1:TransparentBlt(c->mdc,c->Enemy[i].Site.x,c->Enemy[i].Site.y,60,60,c->bufdc,0,0,60,60,RGB(200,200,200));break;
case 2:TransparentBlt(c->mdc,c->Enemy[i].Site.x,c->Enemy[i].Site.y,60,60,c->bufdc,60,0,60,60,RGB(200,200,200));break;
case 3:TransparentBlt(c->mdc,c->Enemy[i].Site.x,c->Enemy[i].Site.y,60,60,c->bufdc,120,0,60,60,RGB(200,200,200));break;
case 4:TransparentBlt(c->mdc,c->Enemy[i].Site.x,c->Enemy[i].Site.y,60,60,c->bufdc,180,0,60,60,RGB(200,200,200));break;
}
}
}
BitBlt(c->hdc,0,0,rect.right,rect.bottom,c->mdc,0,0,SRCCOPY);       //从内存DC贴图到屏幕DC
::Sleep(1);                                                         //休眠一个毫秒
}
//::ReleaseDC(c->hdc);
    ::ReleaseDC(hWnd,c->hdc);
::DeleteDC(c->mdc);
::DeleteDC(c->bufdc);
return TRUE;
}
对话框二的贴图线程 if(pMsg->wParam==VK_ESCAPE)
{
Control=false;
::Sleep(1000);
EndDialog(0);
}
 }
return CDialog::PreTranslateMessage(pMsg);
}
对话框二的一个消息处理退出对话框二到对话框一
DWORD WINAPI EnemyMove0(LPVOID lpParam)
{
Leve1Dlg *c=(Leve1Dlg*)lpParam;
while(true)
{
if(false==c->Enemy[0].move)
{
c->Enemy[0].ChaseMode(c->Player.Site);
} if(1==c->Enemy[0].Attribute)
{
c->InitCompareTank();
if(!c->Enemy[0].Collision(c->tank,c->TotalEnemy+1))
{
switch(c->Enemy[0].Direct)
{
case 1:c->Enemy[0].Site.y-=c->Enemy[0].Speed;break;
case 2:c->Enemy[0].Site.x+=c->Enemy[0].Speed;break;
case 3:c->Enemy[0].Site.y+=c->Enemy[0].Speed;break;
case 4:c->Enemy[0].Site.x-=c->Enemy[0].Speed;break;
}
if(c->Enemy[0].move==true)
{
c->mtank[0]++;
}
if(10==c->mtank[0])
{
c->Enemy[0].move=false;
c->mtank[0]=0;
}
}
}
::Sleep(30);
}
return TRUE;
}其中一个坦克移动的坐标变化线程现在问题是进入界面二按esc退出到界面一再到界面二 坦克移动速度变快 为什么每次进入线程的速度不稳定。现在头疼解决中。
注坦克图片在网上找的素材,背景自己ps 只是用来学习研究 不用于商业目的

解决方案 »

  1.   

    请问下怎么样真正的关闭窗口呢。有什么API函数没有
    劳烦写几句代码参考一下 真心感谢
      

  2.   


    DestoryWindow就是销毁非模态的,不然WM_CLOSE就是隐藏
      

  3.   

    楼主,你这个情况就是在第一次打开的时候Create了非模态窗体吧?
    你可以初始化的时候,把费模态窗体一起初始化了。这样速度就一致了
      

  4.   


    destroywindow发生中断了 
    应该先释放资源 但是不值得资源咋个释放。晕了