MFCで動的にコントロールを作成する(コレクションの質問)
質問
中にいくつかのカスタムコントロールがあり、その中にはラジオバイトンまたはチェックボックスを作成する必要があります。子のコントロールの数は、実行時にのみ利用可能です(このカウントを取得するファイルをロードします)。したがって、さまざまな数のコントロールを作成する必要があります。この目的のためにどのコレクションを使用する必要がありますか?
ソリューション1:単に使用します std::vector<HWND>
(また CArray<HWND>
) - MFC(Cbutton)を使用したいので適していません。もちろん出来る Attach()
以降 Detach()
このウィンドウが必要なたびにウィンドウを処理しますが、大きなオーバーヘッドが得られます。
ソリューション2:使用します std::vector<CButton*>
また CArray<CButton*>
また CList<CButton*>
または...この場合、コントロールが不要になったときに「新しい」適切な「削除」を作成することに注意します。私は忘れられない:)
MFCハンドルマップにはcbuttonへのポインターが含まれており、シンプルを使用できません CArray<CButton>
, 、それは彼のサイズが成長するたびに私のオブジェクトを移動するからです。
...そして問題は、MFC制御クラスの変動カウントを含むために使用する必要があるコレクションはどれですか?
解決
カウントパラメーターでファイルのみを読みたい場合は、ボタンを作成し、それらと作業し、後でそれらをすべて削除します。 CArray<CButton*>
私の意見では大丈夫です。ボタンが削除されることを確認するには、次のようなヘルパーにキャレーを包むことができます。
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
パフォーマンス上の理由でより適している可能性があります。 (しかし、UIには数千のボタンがあることを除いて、CarrayのIntersat/Removeatを使用してパフォーマンスの違いに気付くことはないでしょう。これはユーザーインターフェイスよりもアートワークになると思います:))