2013-12-17 140 views
4

我使用C++創建了一個簡單的win32程序,但我想我只在這個應用程序中使用c。我需要確定應用程序上按下了哪個HWND按鈕。我搜索了msdn參考,它只告訴我HIWORD是通知代碼,LOWORD是BN_CLICKED消息的標識符。我已經設法確定何時單擊按鈕,但它僅適用於所有按鈕。我所有的按鈕都是在WM_CREATE消息中創建的。這就是我成功地掀起至今:winapi BN_CLICKED如何識別哪個按鈕被點擊?

case: WM_CREATE: 
    HWND hPlus = CreateWindowEx(0, L"BUTTON", L"+", WS_CHILD | WS_VISIBLE, 130, 240, 35, 30, hwnd, (HMENU)IDC_MENU, GetModuleHandle(NULL), NULL); 
    HWND hEquals = CreateWindowEx(0, L"BUTTON", L"=", WS_CHILD | WS_VISIBLE, 170, 205, 65, 65, hwnd, (HMENU)IDC_MENU, GetModuleHandle(NULL), NULL); 
break; 

case WM_COMMAND: 
    switch(HIWORD(wParam)) 
    { 
     case BN_CLICKED: 
      MessageBox(hwnd, L"OK", "OK", MB_OK); 
      break; 
    } 
    break; 

我試圖比較hEquals到LOWORD(wParam中),但在編譯時給了我一個錯誤。我想我也嘗試將它與lParam的HIWORD和LOWORD進行比較,也沒有進行編譯。現在我對接下來要做的事情一無所知。

+0

很高興能有幫助。你爲什麼不接受這兩個答案中的一個? – manuell

+0

嗨文斯。我再次來到這裏是因爲有人提出了我的答案。你爲什麼不接受答案?只是好奇。 – manuell

+0

我非常忙。我很接受答案哈哈。我很容易分心,甚至不記得這是什麼項目。 – Vince

回答

3

給每個按鈕它自己的ID,並在HMENU參數,用於爲傳遞給CreateWindowEx

窗口樣式的句柄,或者指定子窗口標識符,具體取決於 。

#define BTN_PLUS 100 
#define BTN_EQUAL 101 

CreateWindowEx(0, L"BUTTON", L"+", WS_CHILD | WS_VISIBLE, 130, 240, 35, 30, 
       hwnd, (HMENU)BTN_PLUS, GetModuleHandle(NULL), NULL); 

CreateWindowEx(0, L"BUTTON", L"=", WS_CHILD | WS_VISIBLE, 170, 205, 65, 65, 
       hwnd, (HMENU)BTN_EQUAL , GetModuleHandle(NULL), NULL); 

然後,在WM_COMMAND,你可以測試ID:

case WM_COMMAND: { 
    if (LOWORD(wParam) == BTN_PLUS) { 
     [...] 
    } 
    [...] 
    break; 
} 
+0

哇,我從來不知道。我一直認爲菜單是用於窗口的實際菜單,例如。文件,編輯,窗口,幫助等。 – Vince

+0

@Vince:頂級窗口有菜單,子窗口有控制ID。該參數用於兩者。 –

+0

這個事實在文檔中有明確說明。 –

5

你只需要看看lParam它的按鍵手柄:

if ((HWND)lParam == hPlus) 
{ 
    // "plus" clicked ... etc. 
} 

儘管在你的代碼,你需要保持HWND的全局變量來進行比較。

// somewhere global 
HWND hPlus = NULL; 
HWND hEquals = NULL; 

// in your WndProc ... 

case: WM_CREATE: 
    hPlus = CreateWindowEx(0, L"BUTTON", L"+", WS_CHILD | WS_VISIBLE, 130, 240, 35, 30, hwnd, (HMENU)IDC_MENU, GetModuleHandle(NULL), NULL); 
    hEquals = CreateWindowEx(0, L"BUTTON", L"=", WS_CHILD | WS_VISIBLE, 170, 205, 65, 65, hwnd, (HMENU)IDC_MENU, GetModuleHandle(NULL), NULL); 
break; 

case WM_COMMAND: 
    switch(HIWORD(wParam)) 
    { 
     case BN_CLICKED: 
      // see which button was clicked 
      if ((HWND)lParam == hPlus) 
      { 
       MessageBox(hwnd, L"hPlus was clicked", "OK", MB_OK); 
      } 
      break; 
    } 
    break; 

你的想法,我相信....

+0

儘管有很多全局變量不是不好的做法嗎?在我看過的很多C++教程中,他們都說不好有很多全局變量。 – Vince

+0

@Vince是的,完全正確,但這不是你原來的問題,很難判斷要在一個特定的答案中放多少。我只是給了你最小的代碼更改來解決最初的問題。 –

+0

我以前就是這樣試過的,但是我沒有把它和(HWND)hPlus或者其他任何東西比較。相反,我試圖做的是(HIWORD)hPlus,然後(LOWORD)hPlus ......完全忘記它必須轉換爲HWND。 – Vince

相關問題