• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            天地之靈學習小組
            我們學習小組的OpenGL學習筆記 大家一定要互相折磨呀~~
            posts - 150,  comments - 156,  trackbacks - 0
            天地之靈16:11:17
            然后呢,說一個最最最特殊的消息  
            天地之靈16:11:21
            WM_QUIT  
            孫婷16:11:22
            ?  
            天地之靈16:11:36
            這是唯一一個跟窗口沒有關系的消息  
            天地之靈16:11:44
            它表示:這個程序要結束了  
            天地之靈16:12:14
            那么,最外面我們一開始那個循環,就應該結束了  
            天地之靈16:12:39
            while(GetMessage(&msg,NULL,0,0))
            {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            }

            while( true )
            {      GetMessage(&msg,NULL,0,0));
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            }

            回到婷婷剛才的問題  
            天地之靈16:13:11
            GetMessage的作用就是:等待一個消息。如果這個消息是WM_QUIT,那么返回FALSE。否則返回TRUE  
            wtt PureMilk16:13:52
            明白
            天地之靈16:13:54
            所以它們的區別就是,前面一個是標準的,當收到WM_QUIT消息的時候,循環結束,正常退出程序。
            而后面那個,因為不能接受WM_QUIT消息,所以永遠不會結束  
            天地之靈16:14:40
            WM_QUIT的作用糖糖明白了嗎  
            wtt PureMilk16:14:52
            等一下又不明白了
            天地之靈16:14:57
             
            孫婷16:15:08
            恩呢 
            天地之靈16:15:16
            哪里不明白了 
            wtt PureMilk16:15:30
            在我們的WindowProc里面是不會出現WM_QUIT的是嗎
            天地之靈16:15:37
            是的。 
            天地之靈16:15:43
            WM_QUIT是唯一一個與窗口無關的消息 
            wtt PureMilk16:15:44
            那它是怎么來的呢
            孫婷16:15:52
            WM_QUIT。。是不是就相當于我按下esc或者alt+f4的時候然后處理消息就推出了。。關了窗口了 
            天地之靈16:15:56
            它的來源是PostQuitMessage函數 
            天地之靈16:16:05
            糖糖:不完全是。 
            wtt PureMilk16:16:09
            啊我知道了
            天地之靈16:16:18
            其實,當你按下Alt+F4的時候,分為三個步驟 
            wtt PureMilk16:16:20
            case WM_CLOSE:
            if(IDYES==MessageBox(hwnd,"是否真的結束?","weixin",MB_YESNO))
            {
            DestroyWindow(hwnd);
            }
            break;
            case WM_DESTROY:
            PostQuitMessage(0);
            break;
            天地之靈16:16:35
            1、系統發出WM_CLOSE,表示用戶試圖關閉窗口 
            天地之靈16:16:49
            當然,這時候你可以彈一個提示確認一下 
            wtt PureMilk16:16:57
            MessageBox(hwnd,"是否真的結束?","weixin",MB_YESNO))
            天地之靈16:17:13
            2、DestroyWindow,真的關閉窗口,發出一個WM_DESTORY 
            天地之靈16:17:32
            3、如果這個窗口關閉就意味著程序結束,那么處理函數里發出一個PostQuitMessage 
            天地之靈16:17:42
            然后GetMessage返回FALSE,程序結束 
            wtt PureMilk16:18:06
            徹底明白
            孫婷16:18:36
            太神奇了 
            天地之靈16:18:52
            好,還有兩個內容,第一節課就結束了 
            天地之靈16:19:07
            內容1是:DefWindowProc 
            天地之靈16:19:32
            實際上系統發出的消息非常非常的多,種類十分十分復雜 
            天地之靈16:19:40
            而我們實際上只關心我們需要關心的消息 
            天地之靈16:19:56
            而對于我們不關心的消息,如果我們不做處理,有時候就會出問題 
            天地之靈16:20:12
            比如
            case WM_CLOSE:
               return;
            窗口就關不掉 
            天地之靈16:20:33
            對于這一類消息,我們通常是希望讓Windows幫我們處理 
            天地之靈16:20:42
            換句話說,“一般的窗口應該怎么做,就怎么做” 
            天地之靈16:20:53
            這就是DefWindowProc的作用 
            天地之靈16:21:08
            舉例來說,它會在WM_CLOSE的時候自動DestoryWindow 
            wtt PureMilk16:21:15
            真的耶
            wtt PureMilk16:21:22
            原來還是關掉了
            天地之靈16:22:22
            另外,DefWindowProc也是一個標準的WindowProc 
            天地之靈16:22:53
            換句話說,如果你什么消息都不想自己處理,你可以直接把DefWindowProc作為窗口類的WindowProc 
            天地之靈16:23:25
            內容2:PeekMessage 
            天地之靈16:23:39
            我們知道GetMessage的意思是“等著一個消息的發生” 
            天地之靈16:23:57
            而我們在還沒有消息發生的時候就什么也不能做了 
            天地之靈16:24:36
            而對于游戲來說,我們要求在沒有消息發生的時候,不斷地重新畫整個畫面 
            天地之靈16:25:01
            所以我們不能被GetMessage占住 
            wtt PureMilk16:25:15
            有道理
            天地之靈16:25:21
            PeekMessage的意思是:
            如果有消息需要處理,返回TRUE,否則返回FALSE 
            天地之靈16:26:07
            另外它的參數有很多種,比如這個被取出的消息是否從消息隊列中清除 
            天地之靈16:27:21
            所以,我們可以寫
            while (true)
            {
               if (PeekMessage(xxxx, xxx, PM_REMOVE))
               {
                 Tranlate
                  Dispatch()
               }
               else
               {
                  doSomething();
                  Sleep(0);
               }

            天地之靈16:27:43
            Sleep(0);的目的是讓出CPU控制權,使得其他程序可以流暢運行,詳細的內容以后再講解 
            wtt PureMilk16:28:03
            耶,那豈不是又像我剛寫的那樣關不掉了
            天地之靈16:28:12
            是的 
            天地之靈16:28:29
            PeekMessage的一個不同的地方就是,它收到WM_QUIT時不會做什么特殊處理 
            天地之靈16:28:40
            我們要自己來做這個處理 
            天地之靈16:28:57
            while (true)
            {
               if (PeekMessage(xxxx, xxx, PM_REMOVE))
               {
                  if (msg.message == WM_QUIT) break;
                 Tranlate
                  Dispatch()
               }
               else
               {
                  doSomething();
                  Sleep(0);
               }

            天地之靈16:29:56
            另外,我讀過的代碼里,有許多程序沒有這個else。婷婷能分析下這樣會有什么不好么? 
            天地之靈16:30:16
            while (true)
            {
               if (PeekMessage(xxxx, xxx, PM_REMOVE))
               {
                  if (msg.message == WM_QUIT) break;
                 Tranlate
                  Dispatch()
               }
               doSomething();
               Sleep(0);
            }

            他們這么寫 
            wtt PureMilk16:30:24
            cpu占用率比較高?
            天地之靈16:30:29
            不是 
            天地之靈16:30:34
            仔細想想 
            天地之靈16:31:13
            答案是,這樣的代碼每次只能處理一個消息 
            天地之靈16:31:19
            然后就進入了doSomething 
            wtt PureMilk16:31:44
            哦……
            天地之靈16:31:47
            1、如果doSomething是個非常慢的函數,比如渲染圖形,那么對消息的處理也會很慢很慢 
            wtt PureMilk16:31:56
            知道了
            天地之靈16:32:02
            積壓的消息不能及時處理,就容易被windows認為沒有響應 
            wtt PureMilk16:32:04
            啊好有意思啊
            天地之靈16:32:14
            2、最壞的情況,如果doSomething里每次都發出了一個消息 
            天地之靈16:32:30
            那么消息就永遠處理不完了,最后程序就會出現錯誤 
            wtt PureMilk16:32:38
            嗯~
            wtt PureMilk16:33:02
            哇貓我自己學的話要學多久才能明白這一點哦
            天地之靈16:33:19
            while (true)
            {
               if (PeekMessage(xxxx, xxx, PM_REMOVE))
               {
                  if (msg.message == WM_QUIT) break;
                 Tranlate
                  Dispatch()
               }
               else
               {
                  doSomething();
                  Sleep(0);
               }
            }


            while (true)
            {
               while (PeekMessage(xxxx, xxx, PM_REMOVE))
               {
                  if (msg.message == WM_QUIT) break;
                 Tranlate
                  Dispatch()
               }
               if (msg.message == WM_QUIT) break;
               doSomething();
               Sleep(0);
            }

            這兩段代碼卻是等價的 
            天地之靈16:34:05
            第二段代碼里把if改為了while,意思就是:把所有的消息處理完,然后才做我想做的事情 
            wtt PureMilk16:34:24
            嗯~~明白
            天地之靈16:34:39
            另外,if/while (PeekMessage(xxxx, xxx, PM_REMOVE))
               {
                  if (msg.message == WM_QUIT) break;
            這個比較有時候比較討厭,我們可以更“優雅”的來寫 
            wtt PureMilk16:35:00
            怎么個優雅法?
            天地之靈16:35:23
            if/while (PeekMessage(xxxx, xxx, PM_NOREMOVE))
               {
                  if (GetMessage(xxx, xxx))
                  {
                     Tranlate
                     Dispatch
                  }
                  else
                     break; 
            wtt PureMilk16:35:50
            wow
            天地之靈16:35:55
            注意PeekMessage的參數變為了不移出 
            天地之靈16:36:03
            然后繼續利用GetMessage的返回值 
            孫婷16:36:18
            這樣有什么好處呢? 
            天地之靈16:36:23
            比較帥 
            wtt PureMilk16:36:25
            漂亮
            孫婷16:36:27
            - -0 
            天地之靈16:36:30
            這個技巧我是在我遺留的早期代碼里學到的 
            孫婷16:36:31
            很好 
            天地之靈16:36:37
            我已經忘記早期的我在哪里學到的了 
            wtt PureMilk16:36:40
            是很漂亮,漂亮多了
            天地之靈16:37:25
             
            天地之靈16:37:36
            關于消息、消息循環的所有內容都已經講完了 
            wtt PureMilk16:37:58
            貓我好崇拜你喔
            天地之靈16:38:14
             
            孫婷16:38:24
            哇卡卡卡~~~我今天會失眠。。 
            wtt PureMilk16:40:58
            天地之靈(402740419)  16:22:53
            換句話說,如果你什么消息都不想自己處理,你可以直接把DefWindowProc作為窗口類的WindowProc

            這句話的意思是,什么消息都自己動手寫代碼嗎
            天地之靈16:41:09
            不是 
            天地之靈16:41:23
            如果你想寫一個“非常標準”的窗口,什么消息你都不需要知道 
            wtt PureMilk16:41:24
            那是什么都不自己動手寫
            天地之靈16:41:32
            對,你就可以什么都不寫 
            wtt PureMilk16:41:45
            哦哦哦我明白了
            孫婷16:41:47
            為什么呢? 
            wtt PureMilk16:41:49
            看錯了
            孫婷16:42:12
            自己寫的和標準窗口是不一樣的么? 
            wtt PureMilk16:42:16
            就是連WindowProc都不要了對吧
            天地之靈16:42:18
            恩 
            wtt PureMilk16:42:28
            誰的恩?
            孫婷16:42:33
            那我怎么在這個窗口做什么啊。。 
            天地之靈16:42:33
            恩婷婷的 
            天地之靈16:42:54
            有時候就什么也不做啊 
            天地之靈16:43:19
            一般在游戲里寫WindowProc就是為了一個WM_CLOSE一個WM_DESTORY 
            天地之靈16:43:28
            在很特殊的時候也許會連這兩個也用不著 
             

            FeedBack:
            # re: 11月9日_貓很強大_By PureMilk
            2008-11-09 22:16 | 陳梓瀚(vczh)
            真有耐心……我都是直接翻msdn的那個條目,按字母排序看的……  回復  更多評論
              
            # re: 11月9日_貓很強大_By PureMilk
            2008-11-10 08:55 | 肖赫_王婷婷_王冠_鄭燚_孫婷
            @陳梓瀚(vczh)
            恩貓確實很有耐心  回復  更多評論
              

            <2008年11月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            常用鏈接

            留言簿(6)

            隨筆分類(149)

            隨筆檔案(150)

            同道中人

            搜索

            •  

            積分與排名

            • 積分 - 47441
            • 排名 - 471

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            中文国产成人精品久久亚洲精品AⅤ无码精品 | 伊人久久大香线焦AV综合影院| 久久久久亚洲av毛片大| 久久亚洲欧洲国产综合| 亚洲精品美女久久久久99| 国产欧美久久久精品| 日批日出水久久亚洲精品tv| 亚洲中文字幕无码久久精品1| 狠色狠色狠狠色综合久久| 2019久久久高清456| 91精品婷婷国产综合久久| 亚洲熟妇无码另类久久久| 激情综合色综合久久综合| 日韩精品无码久久久久久| 久久国产香蕉视频| 久久国产精品成人免费| 日产精品99久久久久久| 最新久久免费视频| 免费一级欧美大片久久网| 国产精品久久久久久搜索 | 亚洲AV日韩精品久久久久| 色综合久久88色综合天天| 久久久久人妻一区精品色| 欧美亚洲国产精品久久久久| 很黄很污的网站久久mimi色| 国产精品视频久久久| 超级97碰碰碰碰久久久久最新| 91性高湖久久久久| 国产精品青草久久久久婷婷| 精品久久久噜噜噜久久久 | 久久综合久久自在自线精品自| 久久综合五月丁香久久激情| 99久久99久久精品国产| 久久免费视频观看| 久久精品国产91久久麻豆自制| 2022年国产精品久久久久| 亚洲AV日韩精品久久久久| 久久综合九色综合网站| 久久久久亚洲AV无码专区体验| 精品永久久福利一区二区| 2022年国产精品久久久久|