Cum pornesc fereastra in mod ascuns ?

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Cum pornesc fereastra in mod ascuns ?

Post by mesajflaviu » 11 Sep 2008, 09:30

Buna . As vrea sa va intreb si eu ceva : am o aplicatie Dialog Based pe care as vrea sa o pornesc ascunsa , ( ceva in genul microtorrent ) , si in metoda 'OnInitDialog' am incercat ShowWindow(SW_HIDE) dar nu functioneaza . Am rezolvat problema , dar nu elegant : In 'OnInitDialog' pornesc un timer , care dupa un timp foarte scurt apeleaza ShowWindow(SW_HIDE) ......dupa care opresc timerul . Stiu ca nu se face asa , dar alta solutie nu am gasit . Si mai am o intrebare : ca fereastra mea sa ramana deasupra tuturor am incercat : BringWindowToTop();si nu functioneaza , de ce ? In help scrie ca metoda este similara cu SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOREPOSITION); care si merge ...... care este problema ? Va multumesc anticipat !



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

Re: Cum pornesc fereastra in mod ascuns ?

Post by Marius Bancila » 12 Sep 2008, 10:02

Pai sa faci hide in OnInitDialog nu merge, pt. ca dupa apelul la acea functie, framework-ul face show. ;) Treaba cu timer-ul merge, dar daca vrei o solutie mai eleganta e sa postezi (PostMessage) un mesaj din OnInitDialog, si in handler sa faci hide. Treaba e ca probabil ti se va vedea fereastra pt. o clipa.

Daca vrei sa intri mai in miez, si sa suprascri functionalitatea din framework, poti lua ca exemplu articolul asta al meu, http://www.codeguru.com/cpp/cpp/cpp_mfc ... hp/c12669/, si efectiv in RunModalLoop() sa faci hide.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

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

Re: Cum pornesc fereastra in mod ascuns ?

Post by Ovidiu Cucu » 14 Sep 2008, 22:24

O metoda prin care eviti atat aratarea dialogului pentru un timp scurt cat si umblarea la MFC framework este sa hadluiesti mesajul WM_WINDOWPOSCHANGED ca in exemplul de mai jos:

Code: Select all

void CMyDialog::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 
{
   if(!m_bShown)
   {
      lpwndpos->flags &= ~SWP_SHOWWINDOW;
   }
   CDialog::OnWindowPosChanging(lpwndpos);
}
unde m_bShown este o variabila membru pe care o setezi initial cu false si o pui pe true dupa ce arati dialogul.
Exemplu:

Code: Select all

   ShowWindow(SW_SHOW);
   BringWindowToTop();
   m_bShown = true;

sau

Code: Select all

   SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
   m_bShown = true;
Dupa cum cred ca se vede si din exemplele de mai sus, BringWindowToTop
nu este echivalenta cu SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOREPOSITION)
ci cu ceva de genul SetWindowPos(&wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE)

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

Re: Cum pornesc fereastra in mod ascuns ?

Post by mesajflaviu » 16 Sep 2008, 21:34

Va multumesc pentru raspunsuri , prima varianta , cea cu modificarea framework-ului era prea complicata pentru mine , dar cea de-a doua merge brici !! :yes: . Ce-i drept , cele 2 functii : BringWindowToTop() si SetWindowPos(....) nu sant la fel ... :biggrin: desi in help scrie ca sant similare ......

Post Reply