Newsgroup: it.comp.programmare.win32
Titolo: VC++: Perche' non riesco a far visualizzare le dialog windows?

Ciao a tutti!!
Sto scrivendo (per lavoro) il mio primo programma in VC++ e mentre non
ho avuto problemi con cose che ritenevo impossibili tipo usare piu'
thread contemporaneamente, accedere a un database etc etc mi sono
impantanato sulle finestre :-((
Comunque il mio problema e' questo: il mio programma comunica con un
apparecchiatura esterna tramite RS-232, raccoglie i dati in varie
variabili e poi le deve visualizzare a video.
Per praticità volevo usare piu' finestre di visualizzazione divise per
"argomento" che ovviamente devono poter essere visualizzate anche tutte
insieme.
Ho disegnato le mie finestrine col dialog editor e poi ho creato un
menu' a tendina per andarle a richiamare... niente la dialog compare e
poi subito sparisce... le ho provate tutte...
Le classi delle dialog le ho derivate da CDialog.
Vi prego aiutatemi!!!
Grazie mille
Francesco

 Le classi delle dialog le ho derivate da CDialog.
Come visualizzi le dialog box in questione?  Se fai Create e
ShowWindow (cioe` non-modali) dovrebbero funzionare (non
pero` se fai DoModal, naturalmente).
Alex

 pero` se fai DoModal, naturalmente).
Penso di usare il metodo che dici tu ma non funziona...
Dunque, per esempio, dalla procedura OnVisualizzaIstante (classe CMainFrame) collegata
al messsaggio Command del menu' che mi deve visualizzare la dialog
- dichiaro un'istanza di CWnd
- da questa richiamo la funzione Create passando tutti i parametri tranne il primo (la
classe di     RunTime) e l' ultimo (il Context)
- e poi richiamo showwindow.
Errori non ne ho perche' i valori di ritorno delle funzioni sono tutti ok ma non
compare niente...
Ho anche provato ad usare invece che un'istanza di CWnd una di CDialog usando Create
in questo modo: Create ( IDD_ISTANTE_VIEW, this )
In questo caso la finestra compare e poi sparisce... :-(
Inoltre ho notato una cosa, secondo me strana, e cioe' che nella classe derivata da
CDialog associata alla finestra non mi processa i messaggi di WM_CREATE e WM_PAINT
cosa che invece, secondo me, dovrebbe fare dopo aver usato il comando Create. O
sbaglio?
Hai qualche suggerimento?
Ciao e grazie
Francesco

 Hai qualche suggerimento?
Certo!  Basta che tu non usi oggetti "transitori", ad esempio
variabili locali di un certo blocco (e.g. di una certa funzione),
per usi "non transitori" (oggetti che devono continuare ad
esistere a funzione terminata).
Ad esempio, fai di questi CDialog dei membri della tua
classe (se ne hai piu` di uno, puoi usare vari membri,
ognuno col suo nome, oppure un array).  A questo
punto nella funzione che deve mostrare un dato dialogo
bastera` che tu:
    -- faccia Create se e solo se non lo hai gia` fatto,
    -- faccia ShowWindow (questo e` innocuo anche
        se l'hai gia` fatto in precedenza)
Alex

 ma comunque, alla distruzione, l'oggetto sparirebbe.
GRANDE!!! Funziona!!!
Grazie mille anche se adesso che so che ho perso un giorno di lavoro per non aver pensato al
distruttore dell'oggetto mi sento proprio un pirla... :-(
Grazie e complimenti.
Ciao
Francesco
**************************************************************
* tecna s.r.l.                                               *
* Progettazione e costruzione apparecchiature elettroniche   *
* Via S.Matteo 23/b 41036 Medolla (MO)                       *
*                                                            *
*E_mail: 
tecn...@tin.it
                                     *
**************************************************************

 pensato al distruttore dell'oggetto mi sento proprio un pirla... :-(
Se puo` consolarti... la ragione per cui ho fatto poca fatica a
diagnosticarlo e` proprio che, a suo tempo, c'ero caduto anch'io!-)
Mi sento un po' come George Bush (junior), che adesso predica
bene proprio perche` in gioventu` ha razzolato davvero malino...:-)
Alex


Beh, adesso mi sento meno schiappa... vedremo poi fra un paio di giorni se saro'
riuscito a collegarmi via ADO con Access e soprattutto se saro' riuscito a farmi
ritornare da Excel dei grafici sui dati di Access... non ci voglio pensare ma so gia'
che ci moriro' in questo programma!! (va be' pero' e' il primo in Visual C++...)
Comunque ti volevo sottoporre un  altro problemino che ho con le finestre...
Non so se usare le child o le popup... con le prime ho il problema che devo gestirmi
tutti i messaggi di ridisegno nel caso che, ad esempio, una mi venga spostata sopra
un'altra o fuori dalla schermo oltre al fatto che non riesco a renderle Top e quindi
non mi prendono mai il focus e la barra di sistema mi resta sempre grigia invece che
diventare azzurra , con le seconde ho invece il problema che l'utente me le puo'
spostare fuori dalla finestra MainFrame, sopra le ToolBar ecc.
Hai qualche consiglio da dare a un neofita come me? (l'applicazione e' SDI)
Grazie ancora.
Francesco

 Hai qualche consiglio da dare a un neofita come me? (l'applicazione e' SDI)
Il tuo problema non mi e` chiarissimo.  Se hai molteplici finestre gestite
tutte dalla tua applicazione, perche` non le raggruppi entro un singolo
"main frame", facendone quindi un'applicazione con il tipico look MDI?
Se usi molteplici finestre top-level (scelta discutibile ma non necessariamente
errata), non capisco perche` sia un problema che l'utente puo` spostarle dove
preferisce lui.  Se usi molteplici finestre child (child di chi...?), come potrebbe
succederti che "una venga spostata sopra un'altra"?  Chi se non il tuo programma
puo` spostarle?
Alex

 preferisce lui.
E' effettivamente il metodo che sto usando ora ma non perche' sia la mia volonta,
semplicemente perche' non riesco a fare diversamente :-(    e allora come si dice nel
nostro dialetto piutost che ninta l'e' mei un "tost"...
Quindi il problema e' riuscire a dare all' applicazione il tipico look MDI restando pero'
in SDI...
Spero che adesso sia almeno abbastanza chiaro.
Grazie comunque
Francesco

 in SDI...
Falla MDI, togli all'utente la opzione di aggiungere nuovi documenti,
esplora AddView...
Alex