2010-04-03 56 views
5

我正在研究一個MFC應用程序,這些應用程序在過去幾年和不同團隊的開發人員中都非常混亂。包含所有命令/消息映射的resource.h文件隨着時間的推移變得相當大,並且存在很多問題(如重複ID)。我不熟悉MFC,所以這個問題可能聽起來很愚蠢......MFC resource.h命令/消息標識

MSDN文檔提到命令ID和消息ID不應該小於WM_USER和WM_APP相應。我發現Visual Studio生成的resource.h中的大多數命令ID都是在100左右開始的。不應該導致一些干擾MFC/Windows命令和消息,這些命令和消息與應用程序定義的ID重疊?例如,我有一個命令ID:

#define ID_MY_ID 101 

並且有一個Windows命令具有相同的ID。當MC向APP發送此命令時,它的處理類似於應用程序定義的ID_MY_ID,並且該應用程序正在採取不必要的操作。這是可能的情況嗎?

另外,是否有一些第三方工具可以幫助分析項目資源?

更新1:

新的問題出現了: 什麼是添加新的自定義命令到應用類的最佳方法是什麼?據我所知,在以下列方式添加之前:向resouce.h添加一個命令ID,然後向處理類添加一個消息映射處理程序。

回答

7

你混合兩件事情:

  1. 消息ID。這些必須大於WM_USER。消息ID沒有在resource.h中定義。從您的描述看來,您並未使用應用程序私人消息。
  2. 命令ID。您的應用程序本身不得有重複的命令ID。命令ID值也不應該干擾afxres.h中定義的標準MFC ID。這些命令ID從0xE100開始,因此resource.h中的值不太可能。資源編譯器將爲您的rc文件中的重複ID生成錯誤

可能不需要您手動編輯resource.h。

我建議使用「資源符號」工具(右鍵單擊資源視圖中的資源並從彈出菜單中選擇,我假設您使用的是VC++),以從resource.h中刪除所有未使用的ID。

+0

問題的一部分是ID手動添加到resource.h中,並且命令處理程序也手動添加到消息映射中。所以資源編譯器不會抱怨這樣的重複。此外,「資源符號」工具會將這些手動添加的命令標記爲未使用,儘管它們實際上已被使用。 – 2010-04-04 10:35:25

+2

「資源符號」工具僅在資源文件(.rc)中未找到命令時將其標記爲未使用。它不監視它們是否用於代碼。 – djeidot 2010-04-05 16:35:47

1

命令消息在WM_COMMAND中用參數中的command id發送,所以它不會與其他消息發生衝突。

1

通常,不需要手動插入或編輯資源中的標識符(由VS自動以正確方式分配的標識符)。有些情況下需要人工干預標識符,但是您可以從假設開始,以前擁有資源的開發團隊的工作是正確的。所以如果你沒有遇到資源問題,請不要觸動它(恕我直言)。

「MSDN文檔提到命令ID和消息ID不應該小於WM_USER和WM_APP相應。」 - 看起來你有點混淆。

+0

問題是這個假設是不正確的。 resource.h被多次手動編輯,由於某種原因,Message ID也存在!這就是爲什麼我開始詢問他們以及命令ID。我不知道他們爲什麼被放在那裏......也許是爲了在一個地方擁有所有的命令ID。 – 2010-04-04 10:06:07

+0

命令ID和消息ID是不同的東西。至於命令ID,resource.h是存儲的正確位置(如前所述)。至於私人信息 - 提取他們到一個單獨的地方,刪除未使用的,驗證ID範圍的正確性,將他們移動到適當的地方(通常用窗口類代碼來處理.cpp和.h文件處理該消息的窗口)。 – VitalyVal 2010-04-04 10:18:15