gpt4 book ai didi

mfc - 在 MFC 中动态创建控件(集合问题)

转载 作者:行者123 更新时间:2023-12-01 04:19:04 25 4
gpt4 key购买 nike

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

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

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

MFC 句柄映射包含指向 CButton 的指针,我不能使用简单的 CArray<CButton> ,因为每次当他的尺寸变大时,它都会移动我的物体。

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

最佳答案

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

关于mfc - 在 MFC 中动态创建控件(集合问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2565821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com