2010-04-02 72 views
4

我有一些自定義控件,我應該在其中創建單選按鈕或複選框。子控件的計數僅在運行時纔可用(它會加載一些文件,從中獲得此計數)。所以我需要創建可變數量的控件。我應該爲此使用哪個集合?解決方案1:簡單地使用std::vector<HWND>(或CArray<HWND>) - 不適合,因爲我想使用MFC(CButton)。當然,我可以Attach()和後來Detach()處理窗口每次我需要這個窗口,但它會給大開銷。在MFC中動態創建控件(集合問題)

解決方案2:使用std::vector<CButton*>CArray<CButton*>CList<CButton*>或者......在這種情況下,我需要關心的是「新」和相應的「刪除」時,控制不必要的。我很健忘:)

MFC處理圖包含指向CButton的指針,我不能使用簡單的CArray<CButton>,因爲每當他的尺寸增大時它會移動我的對象。

...問題是: 我應該使用哪個集合來包含MFC控件類的變量計數?

回答

2

如果你只想用Count參數讀你的文件,創建你的按鈕,使用它們,然後將它們全部刪除,然後CArray<CButton*>在我看來是好的。爲了確保按鈕被刪除,你可以包裹CARRAY到像一個幫手:

class CMyButtonArrayWrapper 
{ 
public: 
    CMyButtonArrayWrapper(); 
    virtual ~CMyButtonArrayWrapper(); 

    void ClearArray(); 
    void Add(CButton* theButton); 

private: 
    CArray<CButton*> m_Array; 
} 

CMyButtonArrayWrapper::CMyButtonArrayWrapper() 
{ 
} 

CMyButtonArrayWrapper::~CMyButtonArrayWrapper() 
{ 
    ClearArray(); 
} 

void CMyButtonArrayWrapper::ClearArray() 
{ 
    for (int i=0; i<m_Array.GetSize(); i++) 
    { 
     CButton* aButton=m_Array.GetAt(i); 
     if (aButton) 
      delete aButton; 
    } 
    m_Array.RemoveAll(); 
} 

void CMyButtonArrayWrapper::Add(CButton* theButton) 
{ 
    m_Array.Add(theButton); 
} 

然後加入這個類的一個對象作爲成員自定義控件(m_MyButtonArrayWrapper),並加入您的按鈕:

CButton* aButton=new CButton; 
aButton->Create(...); 
m_MyButtonArrayWrapper.Add(aButton); 

如果您需要隨機添加和刪除按鈕,CList可能更適合出於性能原因。 (但你不會注意到使用CArray的InsertAt/RemoveAt的性能差異,除了你的UI有幾千個按鈕,我想這應該是一個比用戶界面更多的藝術作品:))

+0

mmm ...是/我只需要在集合的尾部插入,然後創建窗口,然後在每次加載「另一個」文件時重新使用它。所以簡單的CArray將會更加適合,因爲CList會給出'左,右'元素的額外指針...... 感謝您的簡單明確的答案 – ProgramWriter 2010-04-02 23:54:40