以下代码取自游戏编程中的例子--俄罗斯方块。
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程序段处理哪?
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程序段处理哪?
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 对
3 当PeekMessage返回错误的时候执行else下面的语句,也即是说没有消息的时候,或者说空闲的时候。按键消息产生之前和之后的短时间内都可以执行到else中。