2014-06-10 39 views
0

我有一個C Win32程序執行中斷後的開關大小寫命令

有一個消息處理函數具有switch-case語句來處理消息。

有一種現象讓我感到驚訝...我會盡量用簡單的話來解釋。

switch (Message) 
{ 
case 0: 
    printf("Case 0 \n"); 
    break; 
case 1: 
    printf("Case 1 \n"); 
    break; 
    printf("After Break Case 1 \n"); 
case 2: 
    switch(WHAT_SC(wParam)) { 
     case 1: 
     case 2: 
      if (KEYBOARD_UNLOCKED()) { 
      defstatus = DefWindowProc(hWnd, iMessage, wParam, lParam); 
      } 
      break; 
     case 3: 
      if (bLockWindowSize) { 
       return (TRUE); 
      } 
     default: 
      defstatus = DefWindowProc(hWnd, iMessage, wParam, lParam); 
      break; 
    } 
    break; 
    HANDLE_MSG(hWnd, WM_COMMAND, Func_OC); 
case 3: 
    printf("Case 3 \n"); 
    break; 
    printf("After Break Case 3 \n"); 
default : 
    printf("default \n"); 
    break; 
    printf("After Break default \n"); 
} 

(以上代碼僅僅是僞代碼) 在某些點突破後命令被執行。 即

HANDLE_MSG(hWnd, WM_COMMAND, Func_OC); 

爲什麼/這是怎麼回事?

感謝

+0

是,在調試或發行版本? – cup

+0

它不應該,如果先前的突破實在是相對於外switch case(即沒有額外的循環類似的東西)你能發佈真實的代碼嗎? –

+0

爲什麼你在'break'之後有語句?沒有編譯器給出無法訪問的代碼警告?將警告級別更改爲最高等級(/ W4)。 – doptimusprime

回答

0

這可如果把break語句裏面制動開關或其它開關盒內開關情況下,任何循環纔會發生。

如果你看到

HANDLE_MSG(hWnd, WM_COMMAND, Func_OC); 

是越來越然後執行 「案件3」 必須執行。

1

解決掉......

HANDLE_MSG(hWnd, WM_COMMAND, Func_OC); 

送過來執行,因爲以下原因

HANDLE_MSG(是一個宏。 當我看着的那個定義,我請參閱WindowsX.h中的以下代碼:

#define HANDLE_MSG(hwnd, message, fn) \ 
    case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn)) 

會發生什麼情況是,開關情況下的宏HANDLE_MSG被WindowxS.h中的代碼替換。

這是另一種情況,因此會以返回方式執行。

感謝所有試圖幫助我的人。

(世界盃和dBase的值得特別感謝)

問候 :(一無能的程序員

+0

這仍然不能解決你的問題,「(上面的代碼只是僞代碼)在某個時刻,中斷後的命令得到執行,即 HANDLE_MSG(hWnd,WM_COMMAND,Func_OC);」 – Vagish

+0

仔細閱讀問題中斷後的命令在時間.......即條件成立時執行。它作爲另一種情況起作用。 –

+0

你可能會喜歡接受你自己的答案,所以這會被關閉。 – alk