2009-11-11 47 views
1

即時通訊開始的Win32 API,即時添加一個按鈕控制到我的主窗口與流動的代碼:C++的Win32 API控制消息


HWND boton = CreateWindow(
    "BUTTON", // 
    "Caption",  // 
    WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles. 
    250,   // x position. 
    10,   // y position. 
    100,  // Button width. 
    40,  // Button height. 
    hwnd,  // Parent window. 
    NULL,  // No menu. 
    (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 
    NULL);  // Pointer not needed. 

如何可以給它分配一個ID,所以我可以得到的消息循環,在消息循環中試圖捕獲消息作爲WM_COMMAND,但我沒有得到任何結果,我試着用WM_NOTIFY了。

+0

的Win32是C API。 – dreamlax

+0

oks5,歡迎來到StackOverflow!請務必更新您的個人資料,以便我們瞭解您。如果你想回復這些信息,那麼這個地方就回到了發佈信息的地方。在你自己的問題的底部,每個答案的底部都是灰色的文字,上面寫着「添加評論」。這將允許您回覆評論。 –

+0

boton - > button;) –

回答

1

要爲其分配一個ID,您必須使用hMenu參數。如果您已指定該窗口爲子窗口(即WS_CHILD),則hMenu參數將被解釋爲該窗口的整數ID。此外,請提供BS_NOTIFY樣式。


HWND boton = CreateWindow (
    "BUTTON", 
    WS_TAPSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | BS_NOTIFY, 
    250, 10, 100, 40, 
    hwnd, 
    (HMENU)101, // This becomes the Control ID 
    (HINSTNACE)GetWindowLong(hwnd,GWL_HINSTANCE), 
    NULL); 

編輯:特嚷出去Heath HunnicuttBS_NOTIFY的信息。

+0

嘿,也許我應該更新我的答案,並提供有關如何將其作爲ID傳遞的信息: -/ –

+0

只有在您想接收除BN_CLICKED以外的通知時才需要BS_NOTIFY。 –

2

實際上,您不需要指定按鈕的ID。問題是你的代碼缺少一個樣式位CreateWindow()

您必須爲父窗口指定樣式BS_NOTIFY以接收來自按鈕控件的通知。

然後,每次單擊按鈕時,您將收到帶有(HIWORD(w_param) == BN_CLICKED)的窗口消息WM_COMMAND。有關更多信息,請參見BN_CLICKED文檔。

使用控件ID是不必要的,因爲BN_CLICKED消息將爲您提供控件的窗口句柄。由於您已經被要求跟蹤窗口句柄,以便在您收到WM_DESTROY時正確呼叫DestroyWindow,比較按鈕的窗口句柄與使用控件ID一樣簡單。

+0

是的,你說得對,我很抱歉偷你的雷霆。有一個投票。只比接受少了5分。 – dreamlax

+0

您不需要銷燬WM_DESTROY中的窗口。擁有的窗戶在其擁有者被摧毀時自動銷燬。如果NULL傳遞給參數8,那麼肯定。 –

0

要設置窗口ID,通過它在就好像它是一個HMENU:

(HMENU)nChildID