2011-06-10 83 views
0

所以我已經接近300個變量(只是現在),我已經下令數值它們的ID在RESOURCE.H所以它是:使用文本框的數字ID來初始化DoDataExchange?

#define IDC_BOX1  1 
#define IDC_BOX2  2 
#define IDC_BOX3  3 
#define IDC_BOX4  4 

等我的問題涉及到的是我執行每個DoDataExchange中不同的對話框包含了所有這些變量。我真的不想爲每個變量做以下事情:

DDX_CText(pDX, IDC_BOX1, m_nBox1); 
DDX_CText(pDX, IDC_BOX2, m_nBox2); 
DDX_CText(pDX, IDC_BOX3, m_nBox3); 
DDX_CText(pDX, IDC_BOX4, m_nBox4); 

因爲這太荒謬了。

我該怎麼辦沿着同一路線的東西,因爲這:

for(int i = 0; i < **totalVariables**; i++) 
    DDX_CText(pDX, **nameByIdInResourceFile(i)**, **indexOfVariableNameInArray**; 

我敢肯定,這是可能的,我只是不知道什麼功能可能是拉動IDC _...變量姓名由他們的身份證號碼。有什麼想法嗎?

回答

1

@Mark Ransom的回答非常好。我完全按照他的建議去做,但我還有另外一件事。在我的應用程序啓動期間(由#ifdef DEBUG保護),我有一些代碼驗證我的所有ID都是按照連續的數字順序。這樣,我可以確定有人(可能是我未來)不會出現並添加數字序列ID。

+0

好主意,蘭迪。謝謝你的提示。這絕對是我必須要投入的東西,因爲這可能是人們未來應對的痛苦。 – Jon 2011-06-10 17:14:29

+0

如何驗證所有的ID而不單獨列出?這與原始問題的觀點相矛盾。 – 2011-06-10 17:20:06

+0

就我而言,我有一組4個控件ID,所以我使用了一點宏魔法來做到這一點。這可能不會在@ Jon的情況下工作,尤其是考慮到他的ID名稱沒有按順序編號。 – 2011-06-10 22:51:29

2

既然你已經走了連續地,爲了創建資源ID的麻煩,很容易去通過所有這些在循環:

for(int i = 0; i <= (IDC_BOX300-IDC_BOX1); i++) 
    DDX_CText(pDX, IDC_BOX1+i, ... 

當然,如果有人走來,這將失敗,添加IDC_BOX301並且沒有正確地將它放入序列中,所以要小心!

變量名稱最簡單的解決方案是用數組替換單個變量。

for(int i = 0; i <= (IDC_BOX300-IDC_BOX1); i++) 
    DDX_CText(pDX, IDC_BOX1+i, m_nBoxes[i]); 
+0

那麼我有點歪曲了這一點。我之前只是提供虛擬代碼。資源ID不是這樣的數字......它們的ID號碼是。所以實際上,它們就像「IDC_MAIN_LENGTH」和「IDC_MAIN_MAX_WIDTH」等。但是,我的所有變量都在Resource.h文件中進行了數值排序,所以我希望能夠使用GetResourceById()函數迭代我所有資源的ID號以拉動IDC_MAIN_LENGTH ...等等。名。然後,我將創建一個我的變量名稱的數組,並通過迭代... – Jon 2011-06-10 16:21:21

+0

幾乎就像GetDlgCtrlId()的相反,它接受IDC_VARIABLE_NAME並返回ID號碼...我想的是相反的。 – Jon 2011-06-10 16:26:19

+0

@Jon,我認爲你對事物的工作原理有一個基本的誤解。 DDX函數將ID編號作爲參數,名稱只是這些編號的便捷表示。除了知道第一個和最後一個ID號碼是什麼之外,根本不需要使用這些名稱。至於GetDlgCtrlID,它將窗口句柄作爲輸入,而不是名稱。 – 2011-06-10 16:38:34