2015-10-27 59 views
1

我需要在MFC-Project中找到第一個空閒的「控制資源ID」(IDC_)以在運行時創建新的控制元素。第一個免費的MFC資源ID

我的意圖是編寫一個管理類,用於跟蹤運行時的資源。要初始化這個類,我需要知道由「APStudio」(VS2010的所見即所得資源編輯器)分配的最後一個資源ID是什麼。

在看「RESOURCE.H」我可以找到這個ID(_APS_NEXT_CONTROL_VALUE#define語句 - 這個值由所見即所得的編輯器更新,並應解決我的問題。不幸的是,這個定義在編譯時不活躍,但僅在使用APStudio時(#ifdef APSTUDIO_INVOKED)。 刪除#ifdef會導致ID被定義,但不會被APStudio更新(以防手動更改)。 總的來說,我想離開整個項目(Resource.h等),所以我的課程可以普遍使用。

我希望我能以某種方式明確我的問題 - 如果沒有,請隨時提問。 非常感謝您的閱讀和幫助我:-)

+0

還有就是要查詢的第一個「免費」資源ID的標準方法。即使有,你仍然會失敗*「如果有人做了這個」*測試,例如另一個在運行時創建控件並分配ID的對話框。 MFC有一個描述正在使用的ID範圍的文檔([TN020:ID命名和編號約定](https://msdn.microsoft.com/en-us/library/t2zechd4.aspx)),但這不會幫助很多。如果你真的想實現一個管理類,通過他們的'HWND'來引用控件,因爲ID不需要是通用唯一的。 – IInspectable

+0

我不敢讀這個答案。已經找到了TN020,但得出了同樣的結論。我想我會深入使用HWND - 非常感謝你。 – jbjbjbjbjbjbjbjbjbjb

+0

'HWND'通用識別窗口,因此它們是查找/管理密鑰的自然選擇。這也將處理多個窗口共享相同ID的情況。例如,這對靜態控件很常見,通常它們共享相同的ID:'IDC_STATIC'。 – IInspectable

回答

0

該控件的ID只能在其父窗口的範圍內唯一。

爲了唯一標識應用程序中的所有控件,例如,幫助系統將Dialog的ID和Control組合成一個DWORD用作幫助主題。

此外,請不要第一個「免費」的ID不一定開始一個免費的ID序列。

要獲得所有使用的ID的列表,您可以枚舉所有的子窗口,獲得ID並從那裏去。另外,假設沒有一大堆的控制,你可以簡單地在一個循環測試整數值:

ind freeID(0); 
for(;;++freeID) 
    if(GetDlgItem(hDlg, freeID) == 0) 
     break; 
+0

不完全正確:如果應用程序不需要按ID區分這些控件,則具有相同父級的不同控件可以共享相同的ID。靜態控件通常會這樣做。枚舉所有子窗口通常並不可行,因爲它需要創建** all **窗口,並貫穿所有控制路徑,這些動態地創建控件。 'HWND'唯一標識系統中的一個窗口/控件。 – IInspectable