proof 发表于 2022-3-11 10:31:53

一个windows程序为啥有这多“退出” ?

本帖最后由 proof 于 2022-3-11 10:33 编辑

// 窗口过程window procedure
LRESULT CALLBACK TheWindowProc (........)
{
      switch ( uMsg )
      {
      case WM_KEYDOWN:      //a key has been pressed
                {
                        if ( wParam == VK_ESCAPE ) DestroyWindow ( hWnd ) ;       2号退出
                        return ( 0 ) ;
                } break ;

      case WM_DESTROY : //window being destroyed
                {
                        PostQuitMessage ( 0 ) ;                                                       3号退出
                        return ( 0 ) ;
                } break ;

      }
}


int WINAPI WinMain (.........)
{
      // 消息循环
      MSG msg ;
      for ( ; ; )         {
                //check for a message
                if ( PeekMessage( &msg , NULL , 0 , 0 , PM_REMOVE ) )
                        if ( msg.message == WM_QUIT )   break ;                           1号退出
                        TranslateMessage ( &msg ) ;
                        DispatchMessage ( &msg ) ;
      }
      return ( msg.wParam ) ;
}

---------------------------------------------------------
一个windows程序为啥有这多“退出” ?

高手给解释一下,1、2、3号退出,到底是做什么的?

proof 发表于 2022-3-11 10:32:55

代码的原意是:按ESC键 退出整个应用程序。

1、2、3号退出,是否有的语句根本不会执行?(代码bug?)
真正执行退出动作的是哪一个?哪些个语句是聋子耳朵?

hrpzcf 发表于 2022-3-11 11:43:46

本帖最后由 hrpzcf 于 2022-3-11 11:52 编辑

我的理解:
2:窗口过程检测到WM_KEYDOWN消息后,判断按键是否VK_ESCAPE ,是的话就执行DestroyWindow 销毁窗口并发出一个WM_DESTROY 消息
3:窗口过程检测到WM_DESTROY 消息后,执行PostQuitMessage(0)发出WM_QUIT 消息表示请求退出程序
1:主消息循环检测到WM_QUIT 消息,执行break结束循环,程序跳出循环执行到return ( msg.wParam ) ,也就结束了

proof 发表于 2022-3-11 15:23:31

hrpzcf 发表于 2022-3-11 11:43
我的理解:
2:窗口过程检测到WM_KEYDOWN消息后,判断按键是否VK_ESCAPE ,是的话就执行DestroyWindow 销 ...

噢,明白了。
感谢。
页: [1]
查看完整版本: 一个windows程序为啥有这多“退出” ?