網上的許多例子確實很麻煩,也很少有真正意義上實現動態控制項。
前提是有時候我們不知道控制項的數量(比方說我們的指標庫是在資料庫中定義的,要為每個指標定義一個控制項,而指標的數量我們是不知道的),這樣在BEGIN_MESSAGE_MAP中列出來是不可能的,當然在AFX_MSG列出來也是不可能的,怎麼解決這個問題,昨天在論壇上徵求大家的建議,終於解決了。
下面把定義動態數組控制項的方法先介紹一下:
1.開啟資源視窗的string talbel 添加一個ID IDC_MYBUTTON0,caption為“動態數組”,系統會自動分配ID號value
2.為你的表單定義一個變數N(私人共有都可以,看情況),它用表示控制項的個數的,將來要被動態賦值。
3.開啟Resource.h檔案(該檔案在你的工程檔案目錄下,或者搜尋IDC_MYBUTTON0,就可以掉出來),添加一個動態數組,目的是為每一個IDC_MYBUTTON分配一個id,方法為:
#define IDC_MYBUTTON(N) IDC_MYBUTTON0+N
4.在視窗的INI方法裡產生對話方塊,方法如下:
N=5;//自訂數量,可有資料庫、設定檔等獲得
CButton* p_MyBut=new CButton[N];
int i=0;
for(i=0;i<N;i++)
{
CString ss;
ss.Format("我是第%d個按鈕",i+1);
p_MyBut[i].Create( ss, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,/
CRect(30,10+i*40,150,50+i*40), this, IDC_MYBUTTON0+i);//CRect負責大小和位置
}
5.運行,可以看到出現了新的5個按鈕
6.為每個按鈕添加事件,方法很簡單,就是開啟對話方塊的類嚮導,重載OnCommand()函數,裡面有兩個參數:
WPARAM wParam, LPARAM lParam,前一個就是按鈕的id,後一個為控制代碼,我們根據id來判斷比較方便,我們判斷方法如下:
用一個for迴圈就可以解決:
int i=0;
for(i=0;i<N;i++)
if (wParam==IDC_MYBUTTON0+i) {
CString ss;
ss.Format("你單擊了第%d個按鈕",i+1);
MessageBox(ss);
}
既然能標誌到你單擊了那個按鈕,完成其他的工作也就沒問題了。