2011-04-29 122 views
1

好了,所以這裏的這個功能MFC:ON_COMMAND函數混淆?

 
. 
. 
ON_COMMAND (ID_COLOR_RED, OnColor) 
ON_COMMAND (ID_COLOR_GREEN, OnColor) 
ON_COMMAND (ID_COLOR_BLUE, OnColor) 
. 
. 
. 
void CMainWindow::OnColor() 
{ 
    UINT nID = (UINT) LOWORD (GetCurrentMessage()->wParam); 
    m_nCurrentColor = nID _ ID_COLOR_RED; 
} 

所以,在這裏CurrentMessage的wParam中的LOWORD應該包含消息的ID,那也沒關係,但到底是什麼m_nCurrentColor = _的NID ID_COLOR_RED;手段? m_nCurrentColor對於紅色,綠色或藍色分別可以是0,1或2 ...
因此,首先我們在第一條語句中將消息ID轉換爲UINT,但是我們在第二條語句中如何使用m_nCurrentColor = nID _ ID_COLOR_RED?
任何人都可以請解釋嗎?

+0

除非您自己定義ID而不是依賴資源文件,否則無法保證資源編輯器不會使用這些ID。例如,如果你有ID_COLOR_RED = 10000,ID_COLOR_GREEN = 10001,ID_COLOR_BLUE = 10001,事情會很好;但如果編輯器更改了ONLY ONE的數字符號,並且您的代碼肯定會被破壞。 – sergiol 2015-07-08 17:27:10

回答

3

我不知道什麼代碼。主要是因爲m_nCurrentColor = nID _ ID_COLOR_RED不會編譯。您有一個nIDID_COLOR_RED之間的下劃線(_)。這對編譯器沒有任何意義。你的意思是輸入一個減號(-),而不是?


但更一般地,ON_COMMAND macro用於處理WM_COMMAND消息。宏有兩個參數:

  • id,這是命令ID
  • memberFxn,這是該命令被映射

消息投手函數的名稱看起來你這一切都成立了。所有三個命令ID(紅色,綠色和藍色)都由同一個OnColor函數處理。


讓我們來看看WM_COMMAND message的文檔。它表示參數wParamlParam的含義取決於消息的來源。它們具有不同的含義,具體取決於用戶是從菜單中選擇某個項目,是否鍵入加速鍵擊,還是控件正在向其父窗口發送通知消息。

我真的不能從你的問題中知道那些ID_COLOR_RED(和它的兄弟)對應的。
但它並不重要。無論哪種方式,它看起來像像代碼試圖設置一個成員變量(m_nCurrentColor),跟蹤用戶當前選擇的顏色,基於發送最後通知的項目的ID。如果我們假設這是一個跡象,事情開始成爲焦點,一點點:

什麼代碼正在做的是讓多數民衆贊成在發送消息(nID)項目的ID,和第一減去中的值(ID_COLOR_RED)。這意味着,如果nID = ID_COLOR_RED然後m_nCurrentColor爲0。

如果ID_COLOR_RED值,ID_COLOR_GREENID_COLOR_BLUE連續(這是一個很大的如果,一個很好的理由,爲什麼你不應該寫代碼像這樣),那麼如果nID = ID_COLOR_GREEN,m_nCurrentColor將是1。同樣,如果nID = ID_COLOR_BLUE,那麼m_nCurrentColor將是2.

+0

是的,這是我第一次以爲它是一種印刷錯誤,它應該是**減少**而不是**下劃線**,但我只是有點困惑.. thanx求助;-) – Razort4x 2011-04-29 14:08:19

+0

@Razor:是的,但這是一個不能編譯的印記。下劃線在那裏不是一個有效的符號。減去是我能想出的唯一合理的解釋。這是來自一本書或某些東西的代碼?我對這裏教授的編碼實踐非常懷疑。就像我說的那樣,依靠ID將永遠保持順序的事實並不是一個好主意。 – 2011-04-29 14:10:41

+0

是的,這是在一本書中,** MFC與MFC編程窗口,我也認爲減是合理的,但後來我認爲可能是下劃線意味着在MFC中的其他東西。 ;-) – Razort4x 2011-04-29 14:14:16

0

此答案是我對該問題的評論的延續。

對於你的例子,我將在鏈接函數中使用ON_COMMAND_EX宏和switch(nID)。如果某個選項的ID最終改變了,你不會擔心。