MFC動態建立控制元件的訊息處理 (轉)

worldblog發表於2007-12-12
MFC動態建立控制元件的訊息處理 (轉)[@more@]

MFC動態建立的訊息處理


  前些天有人在論壇裡問在動態建立TreeCtrl後怎麼響應訊息,於是便寫了一點自己的心得,現整理如下。

  本例在view中動態建立一個ListCtrl並響應其NM_CLICK訊息,先寫出動態建立的程式碼:

  新建一SDI工程,給view加上一個成員變數:
 CListCtrl m_list;
  在view的OnCreate中建立它:
 if(!m_list.Create(WS_BORDER |WS_CHILD|WS_VISIBLE|LVS_ICON |LVS_AUTOARRANGE|LVS_SHOWSELALWAYS|LVS_EDITLABELS,CRect(10,10,310,210),this,ID_LISTCTRL))
 {
 TRACE0("Failed to create ListCtrl windown");
 return -1;
 }
 //新增一些項
 CString str;
 for(int i=0;i<10;i++)
 { 
 str.Format("item%d",i);
 m_list.InsertItem(i,str);
 }
  其中的ID_LISTCTRL是這個控制元件的ID,當然你可以直接用數值來表示,但為了清淅還是定義一個常量的好,在主選單View->Re Symbols彈出的對話方塊中點選New按鈕,在Name下面輸入ID_LISTCTRL.

  建立完畢,編譯連結後就可以執行了,但你怎麼點選它都沒反應,當然,因為我們還沒寫訊息處理的程式碼。
  通常做法是手動寫訊息處理及訊息對映,至少得三步:1,在頭中定義訊息處理函式的原型,2,在cpp中實現這個函式,3,在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之間寫上訊息對映。如果是單單處理一個訊息的話那還可以忍受,訊息一多的話不但麻煩還容易出錯。
  
  所以我採取下面的方法:
  1.開啟about對話方塊資源,放入一個ListCtrl控制元件到對話方塊中,並將其ID設為ID_LISTCTRL.
  2.Ctrl+W,把Class Name由原來的CAboutDlg改為CxxxView,在左邊的 IDS中選擇ID_LISTCTRL,這時右邊會出現相應的通知訊息,這時就可以跟平常一樣雙擊新增訊息對映了.
  嘿嘿,是不是跟在對話方塊裡響應控制元件的訊息一樣很方便呀.
  有一點需要注意,只有當開啟你加入控制元件的那個對話方塊資源編輯器的時候按Ctrl+W時,Class Wizard中才會出現那個ID_LISTCTRL,還有發行時注意把對話方塊上的listctrl控制元件刪掉.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992375/,如需轉載,請註明出處,否則將追究法律責任。

相關文章