Newsgroup: it.comp.programmare.win32
Titolo: dialog...strana

Salve a tutti gli utenti di programmare win32!
Allora vengo subito al punto.
Sto facendo un programmino semplice semplice in puro c e win32 api, così
tanto per esplorare i meandri, per me ancora oscuri, della programmazione
windows a basso livello.
Utilizzo Visual Studio .NET, per dovere di cronaca.
Inizio a semplificarmi le cose creando una dialog, con 8 child window: 4
static text e 4 edit text. E' facile intuire che avrò disposto ogni
controllo static text come descrizione dell' edit text.
Questa dialog appena creata sarà la finestra principale del programma, che
chiamerò attraverso l'api DialogBoxParam, avendo già definito la sua dialog
procedure. Fin qui tutto bene.
Adesso io decido (e mannaggia a me) di voler creare un "effetto" (che parola
grossa!). In pratica voglio che il testo dello static appaia in grassetto
ogni volta che il corrispondente controllo edit text acquisti il focus.
Effettuo quindi un rudimentale subclassing delle quattro edit text,
analizzando il messaggio WM_KILLFOCUS, e spedendo un relativo messaggio
WM_SETFONT attraverso l'api SendDlgItemMessage. Dopo vari sbattimenti, la
cosa riesce.
Ma.......giochicchiando un po' colla finestra mi accorgo che puntualmente,
dopo un certo tempo, la finestra "esplode", il programma si blocca. E'
difficile da spiegare, comunque pare che mentre stia scrivendo in un edit
control, l'edit viene ricreato in alto a sinistra dello schermo (la finestra
intanto non si può più spostare, i caratteri cambiano aspetto e scompare la
barra del titolo),  la finestra non risponde più ai messaggi e a quel punto
devo soltanto interrompere il programma con un misero CTRL+ALT+CANC.
Qualcuno si è trovato già in questa situazione? Da cosa potrebbe dipendere?
Ha letto sui Message Deadlocks......potrebbe centrare qualcosa?
Metto un link al programma "incriminato", per vedere di persona l'effetto
che ho appena tentato di descrivere:
http://space.virgilio.it/p.cir...@virgilio.it/gen_mailer_X.exe
// Per vedere quando si blocca avviare il programma, e poi cambiare focus da
una casella di testo all'altra, spostare la finestra, toglierle il focus
ecc. (succede dopo una media di 40 volte che il focus si dà e si toglie ed
un edit)
Il codice relativo:
http://space.virgilio.it/p.cir...@virgilio.it/gen_mailer_X.rc
http://space.virgilio.it/p.cir...@virgilio.it/gen_mailer_X.c
Grazie davvero a chiunque mi risponderà! (E scusate le chiacchere)

jhon[array] ha scritto:
Non capisco due cose che hai fatto nel tuo programma:
1) come mai mostri la finestra *dopo* che il ciclo vitale è terminato???
in teoria quelle ShowWindow e UpdateWindow non dovrebbero fare nulla e
dovrebbero restituire un codice di errore...
2) come mai hai subclassato le WindowProc degli edit quando puoi ricevere
tranquillamente la notifica EN_KILLFOCUS dagli edit? il subclassing imho è
da evitare perché è una soluzione poco raffinata (e forse crea pure
qualche casino: chissà che il tuo problema non dipenda da quello...); è
utile anche quello, ma nel tuo caso è certamente una soluzione da non
adottare.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 dovrebbero restituire un codice di errore...
oltretutto ora che ci faccio caso la tua dialog è una modal, quindi il
ciclo non serve a niente...


 adottare.
semplice...non conoscevo la notifica EN_KILLFOCUS! ;-) Mi hai illuminato!
Non era questo il problema, ma sicuramente hai contribuito a portare un po'
di ordine nel mio programma!
Allora il problema risiedeva nell'oggetto HFONT che creavo all'inizio della
dialog procedure e che...non distruggevo alla fine! Testuali parole dall'
MSDN:

 adottare.
semplice...non conoscevo la notifica EN_KILLFOCUS! ;-) Mi hai illuminato!
Non era questo il problema, ma sicuramente hai contribuito a portare un po'
di ordine nel mio programma!
Allora il problema risiedeva nell'oggetto HFONT che creavo all'inizio della
dialog procedure e che...non distruggevo alla fine! Testuali parole dall'
MSDN:
"When you no longer need the font, call the DeleteObject function to delete
it."
Ogni volta che entrava nella dialog procedure creava un nuovo HFONT che
risiedeva in memoria e non veniva eliminato: si creavano così oggetti HFONT
su HFONT che prima o poi mi mandavano in crash l'applicazione. Mi è bastato
mettere un bel DeleteObject alla fine della dialog procedure e ho risolto!!
Ecco come ho modificato il programma:
http://space.virgilio.it/p.cir...@virgilio.it/gen_mailer_X.c
Grazie 1000 ancora!!
A presto e buone feste! ;-)

 A presto e buone feste! ;-)
grazie, anche a te :-)
