Page 1 of 1

Problema creare fereastra pop-up

Posted: 10 May 2012, 10:22
by carrera
Salut,

Am o aplicatie MDI in care vreau sa creez o mica fereastra in care voi avea citeva butoane si care va sta in permanenta pe ecran (asemeni unui toolbar) si numa' nu reusesc sa creez acea fereastra (deci nu va fi un CDialog).
Am incercat din InitInstance mai multe variante dar toate crapa:


1.

Code: Select all

        RECT rec;
	rec.bottom=100;
	rec.left = 100;
	rec.right = 100;
	rec.top = 100;

	CWnd *m_pMainWnd1 = new CWnd;
	m_pMainWnd1->Create(
		_T("myWindowClass"),
		_T("title"),
		WS_OVERLAPPEDWINDOW,
		rec,  CWnd::GetDesktopWindow(),0,0);
	m_pMainWnd1->ShowWindow(SW_SHOW);
2.

Code: Select all

       CWnd* pWnd = new CStatic;

       pWnd->CreateEx(WS_EX_CLIENTEDGE, 
                 _T("STATIC"), _T("abc"),
                 WS_CHILD | WS_TABSTOP | WS_VISIBLE,
                 5, 5, 30, 30,  0, (HMENU)1234);

       pWnd->ShowWindow(SW_SHOW);
3.

Code: Select all

 CWnd* pWnd = new CWnd;
 pWnd->CreateEx(_T("STATIC"), _T("abc"),  WS_POPUP|WS_CHILD | WS_VISIBLE, CRect(0, 0, 20, 20),(CWnd*) this, NULL);
 pWnd->ShowWindow(SW_SHOW);
Vreo idee ?

Thx

Re: Problema creare fereastra pop-up

Posted: 10 May 2012, 14:36
by Marius Bancila
Ce fel de fereastra vrei? Una copil, care sa fie afisata undeva in zona client a parintelui, sau o fereastra de tip toolwindow ce o poti pozitiona oriunde pe ecran.

Re: Problema creare fereastra pop-up

Posted: 10 May 2012, 21:43
by carrera
M-ar interesa una tip toolwindow (va fi o fereastra cu citeva controale care vor modifica datele dintr-o alta fereastra.)

Thx.

Re: Problema creare fereastra pop-up

Posted: 11 May 2012, 09:31
by Ovidiu Cucu
Cand spui ceva gen "am incercat... si crapa" e bine sa ne spui si noua ce/cum crapa si/sau sa pui un cod ceva mai complet decat un simplu apel de functie.
Altfel nu putem decat sa ne dam cu presupusu.

Vezi ca WS_POPUP nu se prea pupa cu WS_CHILD. Ori, ori.
Arunca o privire atenta la: Pe langa asta, ai inregistrat clasa "myWindowClass"?
In fine, ce te deranjeaza la CDialog? Daca vrei "o fereastra cu citeva controale" cel mai comod e sa le plasezi intr-un dialog.
Tocmai de aceea s-au inventat ferestrele tip "dialog".

Re: Problema creare fereastra pop-up

Posted: 11 May 2012, 14:40
by mesajflaviu
Niste tool-uri se pot pune bine intr-un CControlBar, iar un exemplu foarte bun il gasesti aici

Re: Problema creare fereastra pop-up

Posted: 11 May 2012, 16:28
by carrera
Am atasat un exemplu cu problema.
N-as vrea cu CDialog din cauza ca pe parcurs as vrea sa personalizez putin controalele, in sensul sa le aplic un alt look.
thx

Re: Problema creare fereastra pop-up

Posted: 11 May 2012, 20:20
by Ovidiu Cucu
Pai, cand "crapa" aparand un mesaj ca asta...
Debug Assertion Failed.jpg
Debug Assertion Failed.jpg (18.41 KiB) Viewed 10782 times
... inseamna ca ai facut o greseala.
Nu te grabi sa apesi pe "Abort". Apasa "Retry" si o sa te duca pe undeva unse se gaseste un ASSERT si cel mai probabil un mic comentariu care-ti explica despre ce-i vorba.

In fine, in cazul programelului tau, nici asta nu rezolva problema (daca doar inlocuiesti Create cu CreateEx asa cum spune comentariul de care vorbeam).
In MFC nu asa se creaza o fereastra generica.

Code: Select all

CWnd *m_pMainWnd1 = new CWnd;
// s.a.m.d.
In loc, trebuie sa folosesti wizardul si sa derivezi propria ta clasa din CWnd.
Adica
  1. Selectezi "Project/Add Class..." din meniu.
  2. In dalogul "Add Class" selectezi categoria "MFC".
  3. s.a.m.d. iti spune "MFC Class Wizard" ce trebuie sa faci.
Sper acuma sa te descurci. ;)

Totusi...
carrera wrote: N-as vrea cu CDialog din cauza ca pe parcurs as vrea sa personalizez putin controalele, in sensul sa le aplic un alt look.
Ce treaba are persoanlizarea/look-ul unui control cu faptul ca-i intr-un dialog sau in orice alt tip de fereastra?

Re: Problema creare fereastra pop-up

Posted: 11 May 2012, 20:48
by Viorel
Încercă aşa:

Code: Select all

CWnd * m_pMainWnd1 = new CWnd;
LPCTSTR lpszClassName = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
m_pMainWnd1->CreateEx(WS_EX_TOOLWINDOW, lpszClassName, _T("abc"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, CRect(100, 100, 300, 200), m_pMainWnd, 0, 0);

Re: Problema creare fereastra pop-up

Posted: 11 May 2012, 20:56
by Ovidiu Cucu
Ok, Viorel, merge si asa insa mai departe cum facem?
Eu cred ca-i mai bine sa deriveze din CWnd o clasa care sa-si vada de treaba ei, asa cum am spus ma sus.

Re: Problema creare fereastra pop-up

Posted: 12 May 2012, 22:49
by carrera
Merci de raspunsuri, s-a rezolvat, am adaugat o noua clasa cum a zis Ovidiu...
Ovidiu, la intrebarea ta, nu ca nu s-ar putea dar am vazut pe la altii ca in general asa procedeaza... la prima vedere nu-mi dau seama nici eu de ce.

Re: Problema creare fereastra pop-up

Posted: 13 May 2012, 12:03
by Ovidiu Cucu
carrera wrote:Ovidiu, la intrebarea ta, nu ca nu s-ar putea dar am vazut pe la altii ca in general asa procedeaza... la prima vedere nu-mi dau seama nici eu de ce.
Daca altii in general asa procedeaza, nu inseamna ca in general procedeaza bine.

Re: Problema creare fereastra pop-up

Posted: 24 May 2012, 12:21
by carrera
iar am belele...
Am creat o clasa "TEST.H" in care creez o fereastra, in constructor creez doua controale (un combo si-un buton).Problema e ca controalele se intepenesc, nu raspund la nici o comanda, dar de crapat nu crapa nimic totusi.Vreo idee?
Am pus sample-ul in atasament...

Merci.

Re: Problema creare fereastra pop-up

Posted: 24 May 2012, 13:01
by Ovidiu Cucu

Code: Select all

TEST::TEST()
{
  // ...
  // Cream controalele
  CButton myButton1;
  myButton1.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,30), this, 188);

  CComboBox pmyComboBox;
  pmyComboBox.Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST,CRect(10,50,200,700), this, 133);
  //...
}
Ce vezi pe fatzau sunt doar niste zombi. :D
Incearca sa fatzai putin fereastra aia ca s-o faci sa se redeseneze si vezi ce se intampla.
Asta pentru ca myButton1 si pmyComboBox sunt variabile locale. Cand se iese din TEST::TEST() se distrug si bineinteles si ferestrele (controalele) pe care le contin.

Pune-le membre in clasa TEST.

Re: Problema creare fereastra pop-up

Posted: 24 May 2012, 13:27
by Ovidiu Cucu
...si ca observatii suplimentare:
  1. In MFC, ferestrele se creaza in doi pasi: pe langa constructor, clasele derivate din CWnd au si functii Create/CreateEx.
    Asta pentru ca, n-ai cum sti cand instantiezi un obiect de acest fel daca cumva crearea ferestrei a dat kix altfel decat aruncand exceptii, ceea ce nu-i prea kosher.
    Deci:
    1. sterge din constructor tot ce tine de crearea ferestrei si bineiteles de crearea controalelor copil;
    2. adauga propria metoda TEST::Create in care creezi fereastra parinte;
    3. mapeaza mesajul WM_CREATE (la care stii sigur ca parintele a fost creat cu succes) si creaza aici copii.
  2. Insist cu ce spuneam mai inainte: daca ai de-a face cu controale, pune-le mai bine intr-un dialog. Dialog-ul e o fereastra un pic mai speciala facuta anume ca sa tina in ea controale. Daca mergi pe ideea actuala, mai tarziu o sa spui din nou "iar am belele...", nu merge tab-stopul si chestii de care se ocupa sistemul in cazul unui dialog.
    In plus, CDialog are de la mama lui functii care sa-ti faca viata mai usoara in lucrul cu controale (DoDataExchange, DDX_..., UpdateData, etc).
    Si din nou: n-are nici o treaba faptul ca ti-ai propus sa faci niste controale mai "personalizate" cu locul unde le pui.

Re: Problema creare fereastra pop-up

Posted: 24 May 2012, 21:07
by carrera
Asta pentru ca myButton1 si pmyComboBox sunt variabile locale. Cand se iese din TEST::TEST() se distrug si bineinteles si
ferestrele (controalele) pe care le contin.
ce greseli prostesti pot sa fac... merci... merci si de sfaturi.

Cu o singura intrebare mai fac tulburare pe aici: incerc sa folosesc un dialog in locul ferestrei asa ca am creat o noua clasa, insa odata cu crearea dialogului focusul ramane pe el si pina nu-l inchid nu pot accesa main-ul sau child-ul.Se pare ca nu merge cu un simplu SetFocus().Vreau ca dialogul sa ramana pitit intr-un colt (nu minimizat) si sa-l pot accesa oricind.