in C++

Using Menus

話說…
前陣子在台北寫的 code,通通忘記帶下來
雖然不多,但是重寫還是很令人煩躁…
這次加入 Menu(功能選單)
很偷懶的直接複製 MSDN 上「Using Menus」的程式碼
怎知,按下選單竟然沒反應…
加入 WM_KEYDOWN 事件來試試。
啊咧~好像要多按幾次才有反應…
重新檢視訊息處理流程,終於發現問題所在

 // Start the main message loop.

 while (GetMessage(&msg, NULL, 0, 0) != 0 &&
                   GetMessage(&msg, (HWND) NULL, 0, 0) != -1)
 {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
 }


在 while 迴圈的條件式,出現了兩次 GetMessage()
導致當 WM_COMMEND 的訊息在第一次取得,還來不及處理就又被丟掉

目前不是很清楚 MSDN 為啥要這樣做,就先當作他是要讓回傳值非 0 非 -1
簡單的改寫成…

 BOOL MsgResult;
 while ( (MsgResult = GetMessage(&msg, NULL, 0, 0) ) != 0 && MsgResult != -1 )
 {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
 }


加入一個 MsgResult 來接收第一次 GetMessage 的回傳值,用來做第二次比對。
這樣就能避免訊息丟失,變得正常了


如有人知道為何 MSDN 那樣做,麻煩告知一下!

–End

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.