Problema creare fereastra pop-up

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
carrera
Junior
Junior
Posts: 38
Joined: 23 Aug 2007, 12:06

Problema creare fereastra pop-up

Post by carrera » 10 May 2012, 10:22

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



User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Problema creare fereastra pop-up

Post by Marius Bancila » 10 May 2012, 14:36

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.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

carrera
Junior
Junior
Posts: 38
Joined: 23 Aug 2007, 12:06

Re: Problema creare fereastra pop-up

Post by carrera » 10 May 2012, 21:43

M-ar interesa una tip toolwindow (va fi o fereastra cu citeva controale care vor modifica datele dintr-o alta fereastra.)

Thx.

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

Re: Problema creare fereastra pop-up

Post by Ovidiu Cucu » 11 May 2012, 09:31

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".

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Problema creare fereastra pop-up

Post by mesajflaviu » 11 May 2012, 14:40

Niste tool-uri se pot pune bine intr-un CControlBar, iar un exemplu foarte bun il gasesti aici

carrera
Junior
Junior
Posts: 38
Joined: 23 Aug 2007, 12:06

Re: Problema creare fereastra pop-up

Post by carrera » 11 May 2012, 16:28

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
Attachments
abc.rar
(29.75 KiB) Downloaded 292 times

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

Re: Problema creare fereastra pop-up

Post by Ovidiu Cucu » 11 May 2012, 20:20

Pai, cand "crapa" aparand un mesaj ca asta...
Debug Assertion Failed.jpg
Debug Assertion Failed.jpg (18.41 KiB) Viewed 10469 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?

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: Problema creare fereastra pop-up

Post by Viorel » 11 May 2012, 20:48

Î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);

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

Re: Problema creare fereastra pop-up

Post by Ovidiu Cucu » 11 May 2012, 20:56

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.

carrera
Junior
Junior
Posts: 38
Joined: 23 Aug 2007, 12:06

Re: Problema creare fereastra pop-up

Post by carrera » 12 May 2012, 22:49

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.

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

Re: Problema creare fereastra pop-up

Post by Ovidiu Cucu » 13 May 2012, 12:03

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.

carrera
Junior
Junior
Posts: 38
Joined: 23 Aug 2007, 12:06

Re: Problema creare fereastra pop-up

Post by carrera » 24 May 2012, 12:21

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.
Attachments
abc.rar
(59.51 KiB) Downloaded 270 times

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

Re: Problema creare fereastra pop-up

Post by Ovidiu Cucu » 24 May 2012, 13:01

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.

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

Re: Problema creare fereastra pop-up

Post by Ovidiu Cucu » 24 May 2012, 13:27

...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.

carrera
Junior
Junior
Posts: 38
Joined: 23 Aug 2007, 12:06

Re: Problema creare fereastra pop-up

Post by carrera » 24 May 2012, 21:07

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.
Attachments
abc.rar
(60.76 KiB) Downloaded 286 times

Post Reply