Newsgroup: it.comp.programmare.win32
Titolo: Finestre di Dialogo Modali e non...

Yup, ci riprovo...
Sto scrivendo un'applicazione Dialog based che dovrebbe andare ad
"insidiarsi" nella SystemTray per poi essere richiamata con un double
click...
Fin qui tutto Ok... il problema è che già all'avvio la Dialog dovrebbe
essere invisibile (ShowWindow(SW_HIDE)...credo)... le ho provate tutte, ma
quando l'App entra nel Loop Modale la Dialog viene visualizzata lo stesso!
Ho provato a farla Modeless, ma l'App esce immediatamente...(qui sicuramente
sbaglio qualcosa).
Please Aiutatemi!
Mau : )

La scomparsa (non provocata da EndDialog), in effetti, non è quello che ci
si aspetterebbe da una modale, che dovrebbe garantire l'impossibilità di
continuare ad usare un'applicazione prima di averla chiusa. Evidentemente
questo vale anche per le finestre di dialogo che non hanno una parent window
(non avevo mai provato a nascondere una dialog based app.).
Mi è capitato due o tre volte di fare un'applicazione di questo genere e ho
sempre usato una finestra (non dialog) nascosta che gestisse i messaggi
generati da una qualche azione sull'icona nella tray. Da qui, quando ti
viene segnalato un 2-clic, puoi chiamare DialogBox.
Nota che in questo modo la dialog deve essere portata in primo piano
manualmente dopo la creazione; si può fare chiamando
SetForegroundWindow(hDlg) in WM_INITDIALOG oppure, in fase di design della
finestra di dialogo, impostando il flag "Set foreground" nella scheda "More
styles" della pagina delle proprietà (ammesso che tu stia usando VC).
Per quanto riguarda la modeless, direi che hai scordato il loop dei
messaggi. La funzione CreateDialog (a differenza della DialogBox) ritorna
immediatamente per rendere possibile l'interazione con le altre finestre
dell'applicazione (cosa che con le modal non è permessa). Quindi è chiaro
che l'applicazione termini, se in WinMain non è presente un loop dei
messaggi, che tra le altre cose, è lo stesso loop che consegna alla dialog i
messaggi a lei destinati:
hDlg = CreateDialog(...);
while(GetMessage(&msg,NULL,0,0))
{
 if((hDlg == NULL) || (!IsDialogMessage(hDlg,&msg)))
 {
  TranslateMessage(...);
  DispatchMessage(...);
 }
}
Questo loop controlla se il messaggio sia diretto alla dialog
(IsDialogMessage, che in caso positivo invia il messaggio); se non lo è
(IsDialogMessage == FALSE), o se la dialog nemmeno esiste (hDlg == NULL), il
messaggio viene passato alle solite funzioni TranslateMessage e
DispatchMessage.
Stefano.



 visualizzata lo stesso!
Se scopri come risolvere il problema, potresti farmelo sapere? Ho lo
stesso identico problema. Per ora ho risolto nascondendo la dialog
"prima che posso" all'avvio, ma per un attimo si vede comunque...
Ci sarebbe una strada alternativa e contorta: anziche` creare
un'applicazione dialog-based, si potrebbe creare un'applicazione dotata
di una normale finestra nascosta (in cui puoi overridare PreCreateWindow
impostandola subito come nascosta) che sara` anche quella a cui saranno
spediti i messaggi della traybar. Poi sara` compito di questa finestra
creare la dialog quando viene richiesto...
---
Bye! Lorenzo Lutti
http://www.geocities.com/SiliconValley/Peaks/6258/

 messaggi a lei destinati:
Infatti...era quello che avevo immaginato... solo non pensavo che il loop
dei msg andasse implementato a mano e nel modo "classico" eh eh
Attualmente ho optato per la soluzione Finestra Normale (hidden) + icona
nella TrayBar che al DblClick (o RightClick)  richiama una DialogBox...
ThankZ again!
Mau : )

Yup... Dimenticavo... la mia App è stata sviluppata usando le MFC... (ecco
xchè ho fatto un po' di casino con le Dialog non modali...)
Mau

 "prima che posso" all'avvio, ma per un attimo si vede comunque...
snip
magari e` una sciocchezza, ma impostare le coordinate di posizione della
finestra al di fuori dell'area visibile non funziona?
susanna

 finestra al di fuori dell'area visibile non funziona?
Il problema e` che per le applicazioni dialog-based, MFC
scavalca/nasconde molte delle funzioni membro overridabili disponibili
per le normali finestre... non ci ho mai provato, ma direi che il
problema sia analogo a quello del flag visibile: in che punto la
imposti, la posizione? PreCreateWindow() non viene mai chiamata,
CDialog::Create() non lo consente...


 CDialog::Create() non lo consente...
Scusa, ma credevo che anche con MFC una DialogBased avesse un descrittore
nel sorgente di risorsa (.rc) in cui compaiono, di norma, anche le
coordinate di posizione.
susanna

 coordinate di posizione.
Non ci avevo pensato e per un attimo mi ero illuminato di immenso,
convinto che funzionasse... purtroppo invece provandoci ho notato che la
dialog viene piazzata ignorando quasi del tutto le coordinate di cui
parli. :-(
Se metti coordinate altissime, te la piazzera` nell'angolo in basso a
dx; se le metti negative, in quello in alto a sn...



snip
La questione interessa anche me.
Vuoi provare, su WM_MOVE, un frammeto di codice di questo tipo:
  {
    RECT rc;
    GetWindowRect(hwnd,&rc);
    MoveWindow(hwnd, 2000, 2000, (rc.right-rc.left), rc.bottom-rc.top,
TRUE);
  }
susanna

 }
Si`, cosi` sembra funzionare (a meno che qui da me il "flash" sia troppo
corto per essere visto). C'e` ancora il problema del pulsante sulla
taskbar (il proposito iniziale era quello di nascondere la finestra
immediatamente dopo averla creata), ma e` gia` qualcosa.
