Pro*_*ter 5 controls mfc creation dynamic
我有一些自定义控件,我应该在其中创建单选按钮或复选框。子控件的计数仅在运行时可用(它加载一些从中获取此计数的文件)。所以我需要创建可变数量的控件。我应该使用哪个集合来实现此目的?
解决方案 1:只需使用std::vector<HWND>
(或CArray<HWND>
) - 不适合,因为我想使用 MFC (CButton)。当然,我可以Attach()
稍后在Detach()
每次需要此窗口时处理窗口,但这会带来很大的开销。
解决方案 2:使用std::vector<CButton*>
orCArray<CButton*>
或CList<CButton*>
or... 在这种情况下,当不需要控制时,我会注意创建“新”和适当的“删除”。我很健忘:)
MFC 句柄映射包含指向 CButton 的指针,我不能使用 simple 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);
}
Run Code Online (Sandbox Code Playgroud)
然后将此类的对象添加为自定义控件 ( m_MyButtonArrayWrapper
) 的成员,并使用以下命令添加按钮:
CButton* aButton=new CButton;
aButton->Create( ... );
m_MyButtonArrayWrapper.Add(aButton);
Run Code Online (Sandbox Code Playgroud)
如果您需要随机添加和删除按钮,CList
出于性能原因,a 可能更适合。(但是您可能不会注意到使用 CArray 的 InsertAt/RemoveAt 的性能差异,除非您的 UI 有数千个按钮。我想这更像是一件艺术品而不是用户界面:))
归档时间: |
|
查看次数: |
4262 次 |
最近记录: |