Ai scapat si de acel warning, care iti spunea ca, in momentul cand s-a ajuns in destructorul din clasa de baza (CDialog), fereastra dialogului nu a fost inca distrusa.
Ok, o va face acel destructor insa te atentioneaza ca "ai fentat" cate ceva din flow-ul din framework si in consecinta PostNcDestroy, care este o functie virtuala apelata dupa WM_NCDESTROY (ultimul mesaj pe care-l primeste o fereastra inainte de-asi da duhul) nu a mai fost apelata. Daca ai de facut acolo ceva curatenie atunci poate fi naspa. Sper ca-i clar.
Si ca tot vorbeam mai devreme de assert-uri: nu strica, la creartea dialogului in CControlBarExt::Create:
Code: Select all
BOOL CControlBarExt::Create(CWnd* pParentWnd, CDialog* pDialog, ...
{
//...
m_pDialog->Create(nID, this);
ASSERT(m_pDialog->GetStyle() & WS_CHILD); // the dialog must be a child, dude!
// ...
Asta te-ar fi ajutat sa gasesti mai repede greseala de care discutam acum.
La fel, spuneam mai devreme ca nu ar fi stricat un assert care sa nu-ti dea voie sa pui control bar-ul intr-un view sau in orice altceva care nu-i un frame:
Code: Select all
BOOL CControlBarExt::Create(CWnd* pParentWnd, CDialog* pDialog, ...
{
//...
ASSERT_KINDOF(CFrameWnd, pParentWnd); // parent window must be a frame, dude!
//...
Si-or mai fi de-om mai gasi.

Assert-urile sunt foarte bune pentru ca te ajuta sa gasesti la timp erori de programare si sau "design".
Bineinteles daca-s unde unde trebuie si nu de aiurea.
Si o mica observatie la
mesajflaviu wrote:Intradevar poate era mai eficient sa porneasca de la un CDialogBar ( iesea un control mai specializat, de ex.CTreeControlBar ), insa aceasta abordare este poate mai versatila, in sensul ca in acel dialog din CControlBar poate fi pus usor orice control ...
Mai "versatil" nu inseamna neaparat "mai bun". O clasa CCameleon care sa poata fi sau verde sau albastra (in cazul nostru un controlbar care sa poata avea sau un tree sau altceva ce-or mai vrea muschii nostri) nu-i neaparat solutia cea mai fericita.
In mod sigur vei da in curand de alte probleme... garantez.
Cel mai bine ar fi sa ai sa ai ceva de genul CTreeBar derivat direct din CControlBar (sau mai bine dintr-o clasa intermediara sa-i zicem CCommonControlBar, care sa se ocupe doar de sizare si de desenarea acelui grip).
Daca vrei un listbox inautru, no probem faci alta: CListBoxBar, s.a.m.d.
Si scapi draq si de acel dialog template care nu cotine altceva dect un tree, in schimb te baga in belele daca nu esti atent la stiluri (si-or mai fi).