Handler comutare view-uri de documente

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
0ptr
Membru
Membru
Posts: 71
Joined: 01 Feb 2011, 23:27
Judet: Ilfov

Handler comutare view-uri de documente

Post by 0ptr » 08 Jun 2012, 17:11

Intr-o aplicatie MDI comut intre view-urile diverselor documente (aranjate ca tab-uri). Relatia document - view este 1:1.
Ma intereseaza care e ceea mai ortodoxa modalitate de-a trata (handlerul) momentul in care mi se schimba view-ul si documentul activ a.i. sa pot face GetActiveView()->GetDocument() pentru noul document ce are focusul (de preferinta in clasa CMainFrame).
De exemplu
tab_demo.png
tab_demo.png (1.89 KiB) Viewed 3032 times
doc1000p100 e activ si vreau sa prind momentul in care am comutat la oricare din celelalte doua documente.



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Handler comutare view-uri de documente

Post by Ovidiu Cucu » 09 Jun 2012, 11:16

In primul rand, nu un document ci o fereastra poate avea "focus".
Poate vrem sa vedem mometul in care o fereastra MDI child devine activa.
Cum altfel decat in handlerul lui WM_MDIACTIVATE, in clasa derivata din CMDIChildWnd(Ex)?

Iaca cam asa:

Code: Select all

void CChildFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd)
{
   CMDIChildWndEx::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);

   if(bActivate)
   {
      CString strText;
      pActivateWnd->GetWindowText(strText);
      if(!strText.IsEmpty())
      {
         TRACE1("\n%s is being activated", strText);
         // further, get the document, the view, and/or everything your muscles want (and can, of course).
      }
   }
}
Vezi si CWnd::OnMDIActivate

[ Later edit ]
0ptr wrote:... de preferinta in clasa CMainFrame ...
Asta miroase a preferinta de architect. :D
Intreb si eu, de curiozitate: de ce?

0ptr
Membru
Membru
Posts: 71
Joined: 01 Feb 2011, 23:27
Judet: Ilfov

Re: Handler comutare view-uri de documente

Post by 0ptr » 09 Jun 2012, 12:42

Ovidiu, multumesc! :)
Incarcand trei documente in ordinea Demo.xyz, DemoColor.xyz si medtest.xyz am remarcat un femomen "ciudat". Are loc activarea noului document deschis. Ulterior se activeaza precedentul si apoi din nou ultimul document deschis.
Demo.xyz is being activated
...
DemoColor.xyz is being activated
Demo.xyz is being activated
DemoColor.xyz is being activated
...
medtest.xyz is being activated
DemoColor.xyz is being activated
medtest.xyz is being activated
Ai idee de ce se intampla asta?

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Handler comutare view-uri de documente

Post by Ovidiu Cucu » 09 Jun 2012, 13:45

Daca pui conditile asa cum le-am pus eu si n-ai facut cinestiece mascari prin alta parte, n-ar trebui sa se intample ce spui.
Altfel, primesti WM_MDIACTIVATE si cand fereastra respectiva se activeaza si cand se dezactiveaza altele (vezi documentatia lui CWnd::OnMDIActivate in link-ul pe care l-am dat mai devreme)
In plus, mai ia un WM_MDIACTIVATE "bonus" de la framework atunci cand este creata.
Si bineinteles, daca ai facut mascari.
Si-or mai fi, pentru ca in clasele din "feature pack", cele cu "CMFC" in fata plus cateva cu "Ex" in coada, e o adevarata tzacneala (parerea mea e ca MFC-ul ar fi putut trai mai bine fara ele).
Daca vrei totusi sau musa-i sa le folosesti, atunci incearca sa customizezi cat mai putin din ele, si-asa-s super customizate.
Daca vrei si una si alta, plus te deranjeaza ca primesti WM_MDIACTIVATE de prea multe ori, atunci pune un breakpoint si trage cu ochiometrul prin "call stack" si/sau da un "search in files" prin MFC dupa "WM_MDIACTIVATE" si "MDIActivate" si vezi ce si cum se-ntampla si daca se mai poate carpi pe undeva.

Asta e, trebuie sa si transpiri un pic, mai ales daca vrei sa-ti bagi nasul in clasele din "MFC feature pack".


PS. Tot nu am aflat de ce architectul zice ca-i de preferat sa facem toata treaba in CMainFrame.
Poate stie el o chichita in Windows/MFC pe care as putea in sfarsit s-o aflu si eu. :)
Sau, mai bine sa-i pun o intrebare-hint (te rog sa-i faci forward)
Intr-o diagrama cu ferestrele unei aplicatii MDI, unde ati pune ferestrele MDI child.
Hai Dom' Architect, ca-i la mintea cucosului!..." :D

viorel2005
Membru
Membru
Posts: 208
Joined: 24 May 2008, 09:41

Re: Handler comutare view-uri de documente

Post by viorel2005 » 09 Jun 2012, 14:58

Si-or mai fi, pentru ca in clasele din "feature pack", cele cu "CMFC" in fata plus cateva cu "Ex" in coada, e o adevarata tzacneala (parerea mea e ca MFC-ul ar fi putut trai mai bine fara ele).
De multe ori se spune sa nu mai reinventeze roata. Intrebarea este: Cand trebuiesc folosite si cand nu trebuiesc folosite? Sunt clase MFC nu controale ActiveX, create sa usureze munca.

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: Handler comutare view-uri de documente

Post by neagu_laurentiu » 09 Jun 2012, 15:56

El e mai conservator. :)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Handler comutare view-uri de documente

Post by Ovidiu Cucu » 09 Jun 2012, 20:21

viorel2005 wrote:
Si-or mai fi, pentru ca in clasele din "feature pack", cele cu "CMFC" in fata plus cateva cu "Ex" in coada, e o adevarata tzacneala (parerea mea e ca MFC-ul ar fi putut trai mai bine fara ele).
De multe ori se spune sa nu mai reinventeze roata. Intrebarea este: Cand trebuiesc folosite si cand nu trebuiesc folosite? Sunt clase MFC nu controale ActiveX, create sa usureze munca.
Asta a fost doar o paranteza pe care ca de obicei, ai rupt-o din context ca sa poti continua cu "Intrebarea este...".
Fii atent ca o sa-ti ceara domnul Mihai Gadea drepturi de autor! :D
Daca ai o aplicatie sau un client care nu poate trai fara riboane, paneluri docabile si/sau cu taburi si alte cularai care sunt in feature pack si daca ai cel putin VS2008, nu te pune nimeni sa reinventezi roata. "Tzicneala" se refera la faptul ca-i mai greu de urmarit ce se intampla acolo decat in clasele din framework-ul MFC de baza (in context, sa aflu de ce primesc asa de multe WM_MDIACTIVATE intr-o clasa derivata din CMDIChildWndEx, cu "Ex" in coada).
Si in fine, ideea principala a fost ca, in general nu prea mai ai ce customiza/extinde la ele, din moment ce deja extind framework-ul lite, clasic si-ti dau totul mura-n gura.
neagu_laurentiu wrote:El e mai conservator. :)
Si Eminescu a fost conservator... nu numai in politica dar si prin faptul ca nu se dadea in vant dupa chestii gen RAD si ale mure-n gura. :D

Post Reply