以下代码取自游戏编程中的例子--俄罗斯方块。
canvasApp继承自CWinApp
int canvasApp::Run()
{
MSG msg ; while(true)
{
if( PeekMessage( &msg , 0 , 0 , 0 , PM_REMOVE ))
{
TranslateMessage( &msg );
DispatchMessage( &msg );
if( msg.message == WM_QUIT )
return msg.wParam ;
}else 
{
diRun();//利用directinput将按键记录下来。(作者自己编的函数)
if( app_Proc )         
app_Proc->Run();//游戏控制 }
}
问题:1.PeekMessage获得消息后既然已经remove,为何还调用DispatchMessage?我将PM_REMOVE 改为PM_NOREMOVE程序便  一直处于忙得状态。
     2.DispatchMessage所派遣的消息由谁处理哪?是m_pMainWnd所指向的对象的WindowProc吗?
      3.按键便会产生字符消息使得PeekMessage返回TRUE,那么有如何由 else程序段处理哪?
     

解决方案 »

  1.   

    问题补充。
    canvasFrame:public CFrameWnd.
    LRESULT canvasFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    // TODO: Add your specialized code here and/or call the base class
    switch( message )
    {
    case WM_CREATE :
    //draw create 640*480-clientArea window
    //create device.
    if( !d3dCreate( m_hWnd , 640 , 480 , true ))
    return PostMessage( WM_CLOSE );
    //create inputdevice
    if( !diCreate( AfxGetInstanceHandle() , m_hWnd ))
    return PostMessage( WM_CLOSE );
    //癹伴
    appTetrisIsRun();
    //挡
    return 0 ;
    case WM_DESTROY :
    diRelease();
    d3dRelease();
    return 0 ;
    }
    return CFrameWnd::WindowProc(message, wParam, lParam);
    }
    return 0 ;
    }
      

  2.   

    1 不调用DispatchMessage,消息不就得不到处理了?不Remove,消息一直在队列中,当然程序永远是忙的;
    2 对
    3 当PeekMessage返回错误的时候执行else下面的语句,也即是说没有消息的时候,或者说空闲的时候。按键消息产生之前和之后的短时间内都可以执行到else中。
      

  3.   

    建议楼主看看《深入浅出MFC》一书,书中对于MFC运行机制有比较详细的解释。