【问题标题】:Dynamically creating controls in MFC (Collection question)在 MFC 中动态创建控件(收藏题)
【发布时间】:2011-02-03 16:21:35
【问题描述】:

我有一些自定义控件,我应该在其中创建单选按钮或复选框。子控件的计数仅在运行时可用(它加载一些从中获取此计数的文件)。所以我需要创建可变数量的控件。我应该为此目的使用哪个集合?

解决方案 1:只需使用 std::vector<HWND>(或 CArray<HWND>) - 不适合,因为我想使用 MFC(CButton)。当然,每次我需要这个窗口时,我都可以Attach() 和以后的Detach() 处理窗口,但这会产生很大的开销。

解决方案 2:使用 std::vector<CButton*>CArray<CButton*>CList<CButton*> 或... 在这种情况下,我会注意在不需要控制时进行“新”和适当的“删除”。我很健忘:)

MFC 句柄映射包含指向 CButton 的指针,我不能使用简单的 CArray<CButton>,因为它会在每次对象变大时移动我的对象。

...问题是: 我应该使用哪个集合来包含 MFC 控件类的变量计数?

【问题讨论】:

    标签: mfc dynamic controls creation


    【解决方案1】:

    如果您只想使用 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 有数千个按钮。我想这更像是一件艺术品而不是用户界面 :))

    【讨论】:

    • mmm... 是的/我只需要在集合的尾部插入,然后创建窗口,然后在每次加载“另一个”文件时重用它。所以简单的 CArray 会更合适,因为 CList 会给'左,右'元素提供额外的指针......感谢简单明了的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多