W zasadzie możesz zrobić to na kilka sposobów (mniej lub bardziej "ładnych"). Najłatwiejsze rzeczywiście wydaje się użycie tablicy lub listy (co do różnych klas to nie powinno być problemu, bo każdy dialog dziedziczy po CDialog, więc spokojnie możesz poruszać się po wspólnej klasie bazowej). Jest tylko mały problem: tablice i listy wymagają by obiekt, który przechowują miał zdefiniowany operator przypisania, co w przypadku wbudowanej klasy VC++ nie będzie łatwo utworzyć. Trzebaby podziedziczyć po CDialog, tworząc klasę bazową dla Twoich dialogów (powiedzmy class CmyDialog: public CDialog) - oczywiście trzeba tam zdefiniować ten operator przypisania.
Twoja lista lub tablica bedzie tworzona zatem na bazie CmyDialog. Problem może być z tym operatorem, nie dam ręki uciąć czy wszystkie potrzebne pola klasy uda się przypisać. Inną metodą - bardziej łopatologiczną ale myślę, że skuteczniejszą będzie utworzenie własnej listy dwukierunkowej przechowującej wskaźniki na klasę CDialog (czyli w zasadzie na twoje okienka). Budowa listy jest oklepana także nie sprawi kłopotu, a późniejszy dostęp to okien będzie dosyć wygodny.
class CNode
{
public:
CNode *next;
CNode *prev;
CDialog *dlg;
};
class CDialogList
{
private:
CNode *wsk;
CNode *wsk_dyn;
public:
CDialogList();
~CDialogList();
void AddHead(CDialog *newdlg);
void RemoveHead();
CDialog* GetHead();
CDialog* GetNext();
CDialog* GetPrev();
};
CDialogList::CDialogList()
{
wsk = NULL;
wsk_dyn = NULL;
}
CDialogList::~CDialogList()
{
CNode *node;
while( !wsk )
{
node = wsk->next;
//usuwanie okna wsk->dlg
wsk = node;
}
}
void CDialogList::AddHead(CDialog *newdlg)
{
CNode* first;
CNode* newNode = new CNode();
newNode->dlg = newdlg;
first = wsk;
newNode->next = first;
first->prev = newNode;
newNode->prev = NULL;
wsk = newNode;
}
void CDialogList::RemoveHead()
{
CNode* first;
first = wsk;
wsk = wsk->next;
wsk->prev = NULL;
if( first )
{
//usuwanie okna first->dlg
}
}
CDialog* CDialogList::GetHead()
{
wsk_dyn = wsk;
return wsk->dlg;
}
CDialog* CDialogList::GetNext()
{
wsk_dyn = wsk_dyn->next;
if( !wsk_dyn )
return wsk_dyn->dlg;
return NULL
}
CDialog* CDialogList::GetPrev()
{
wsk_dyn = wsk_dyn->prev;
if( !wsk_dyn )
return wsk_dyn->dlg;
return NULL;
}
Mam nadzieję że walnęłem jakiegoś błędu w kodzie, ale mniej więcej to powinno być to.