2012-07-21 38 views

回答

5

最好的選擇是給所有的按鈕連續的ID號,然後使用ON_COMMAND_RANGE(FIRST_BUTTON_ID,LAST_BUTTON_ID,HandlerFunction)。然後HandlerFunction將採用一個UINT nID,它將是調用處理程序的按鈕的ID號。更多信息here

2

對於典型的WM_COMMAND消息,消息的lParam成員應該保存發件人的HWND - 如果發件人是窗口。正如@Redeye所回答的那樣,你可以將所有的按鈕放在一個範圍內,並在消息表和一個OnCommand(UINT nCmd)(或者任何你命名的)中寫入一個ON_COMMAND_RANGE()條目作爲窗口,對話框,視圖的成員函數,框架或文檔類。按鈕不一定必須在一個範圍內。您可以將每個按鈕ID的單個條目作爲ON_COMMAND_RANGE(IDC_BUTTON1, IDC_BUTTON1) - 或任何標識符。 Thjust ere對於那個宏來說並不是一個規則,即開始和結束範圍必須不同。你可以編寫自己的消息破解宏,它基本上做ON_COMMAND_RANGE()所做的事情,但只需要一個條目。

您也可以在您的處理程序中調用CWnd :: GetCurrentMessage(),並在處理程序中將其檢索以檢索該命令。消息的wParam成員的LOWORD持有控制標識符。消息的lParam成員擁有發送控件HWND - 如果它是一個窗口。對於類似於工具欄的東西,工具欄按鈕不是真正的按鈕,而是由工具欄繪製,這樣lParam將始終是工具欄的HWND。

1

如果我正確理解了這個問題,那很簡單:在屬性編輯器中分配OnCommand事件時,不要再次單擊(並讓該向導添加另一個消息處理程序,而是選擇其中一個現有處理程序。無法完成這項工作(不知道你的VStudio版本和設置),你可以手動完成:通常創建新的處理程序,保存,然後到達.cpp和.h文件,刪除類頭中的聲明和.cpp文件中的實現,轉到消息映射並更改ON_COMMAND條目,以便它使用現有的(old/common)處理程序。對於ON_UPDATE_UI處理程序也非常有用,其中幾個UI對象(菜單項,工具欄按鈕等等)可以基於相同的條件啓用/禁用/檢查/等(因此可以將它們分組並且具有一個處理程序,每個處理程序有一個處理程序)

編輯:也許我錯了,如果問題是關於未解決的外部唯一,是OnSignButton()作爲CTabTwo的成員實現?如果您發佈的實現(代碼)不在類聲明中,則不是。將它聲明爲void CTabTwo :: OnSignButton(UINT ID)...

+0

感謝康斯坦丁爲你的答案,你救了我,我不是爲什麼我犯了這個錯誤!非常感謝。 – 2012-07-23 12:17:38

0

恰好碰巧看到這篇文章。 這是另一種方式嗎? 使用虛函數OnCommand。

BOOL CKeyboard::OnCommand(WPARAM wParam, LPARAM lParam) 
{ 
// TODO: Add your specialized code here and/or call the base class 
// 
if (HIWORD(wParam)==BN_CLICKED) 
{ 
switch(LOWORD(wParam)) 
{ 
case IDC_BUTTON1: 
break; 
case IDC_BUTTON2: 
break; 
case IDC_BUTTON3: 
break; 
} 
} 
return CView::OnCommand(wParam, lParam); 
} 
相關問題