Newsgroup: it.comp.programmare.win32
Titolo: Vari problemi con MFC

Sto scrivendo un progamma che si occupa di analisi digitale dei
segnali, precisamente campiona l'ingresso sonoro ed esamina la
distribuzione di energia nel segnale. Come risultato produce un
vettore di numeri interi; per ora mi limito semplicemente a
visualizzare ogni vettore prodotto.
E' il mio primo programma in MFC e probabilmente mi direte che è
meglio se lo ricomincio da capo, ma mi interessa comunque conoscere
strade alternative (se il progetto fosse + grande non potrei tornare
indietro):
E' un progetto MFC dialog-based
1) Quando il programma sta campionando il segnale voglio che alcune
voci del menu non siano attivabili (grayed) e ho trovato la funzione
CMenu::EnableMenuItem che è perfetta. Purtroppo mi sono ritrovato con
una voce principale di menu da disabilitare (fate finta che sia
"File") e con questa funzione il menu non viene ridisegnato (cioè pur
non rispondendo al click il suo aspetto rimane Enabled fino ad un
OnPaint): infatti di solito la funzione viene invacata su voci o
sottomenu che non sono visibili al momento. Ho provato a forzare il
ridisegno con InvalidateRect(NULL) ma invalida solo l'area client, poi
ho trovato CWnd::RedrawWindow(NULL,NULL,RDW_ERASE | RDW_FRAME |
RDW_INVALIDATE | RDW_UPDATENOW); e così funziona. C'è un modo
migliore?
2) Per visualizzare i risultati utilizzo un controllo Edit multilinea;
con class wizard gli ho associatouna variabile CString a cui gni volta
che ho un risultato pronto appendo la stringa con i valori numerici
già convertiti ed il newline (\r\n). Nelle proprietà del controllo ho
impostato la presenza di entrambe le scrollbar e tutto funziona bene.
Però quando il campionamento si fa rapido o prolungato la finestra
visualizza solo una parte dei dati (quella iniziale) mentre io vorrei
continuare ad osservare quelli appena prodotti. Ho pensato di dire al
controllo di scorrere di una linea ogni volta che ne scrivo una nuova
e ho provato a fare
((CEdit*)GetDlgItem(ID_DEL_MIO_EDIT_BOX))->LineScroll(1);  nulla...
poi
temp=(CEdit*)GetDlgItem(ID_DEL_MIO_EDIT_BOX);
temp->LineScroll(temp->FirstVisibleLine()+1);      ancora  nulla...
quello che ottengo è che scompare solo la primalinea di testo; come
posso fare?
3) Il progetto è dialog based, per cui la classe applicazione invoca
la classe finestra con DoModal() e la funzione OnInitInstance ritorna
FALSE per non attivare la "message pump" (come dice il commento del
VC++5). Dato che quando un buffer di dati è pieno lo devo processare
velocemente per non interrompere il campionamento probabilmente il
modo migliore è fare in modo che ilsistema generi un evento per
segnalare il buffer pieno: come faccio poi a gestirlo nella
MESSAGEMAP? Per ora ho unafunzione callback che (potendo fare molto
poco, che altrimenti si pianta tutto) setta un flag. Poi ho un timer e
in OnTimer verifico il flag (che è poi un puntatore) ed eventualmente
processo i dati. Ho come il sospetto di aver incasinato una cosa
facile, ma all'inizio avevo intenzione di non usare il timer ma
OnIdle. E' possibile recuperare in qualche modo OnIdle anche se mi
sembra che la classe MiaApplicazioneApp non cominci neanche a gestire
i messaggi?
4) Quando ho creato il progetto ho tolto la status bar dicendo "voglio
fare cose semplici che poi mi incasino". Visti i risultati adesso mi
farebbe piacere ci fosse. C'è un modo per aggiungerla "a mano"?
Spero che quello che per me è un problema per voi non sia una
cretinata,
salutoni e grazie a chi mi aiuterà
virgilio
virgi...@hotmail.com

Grazie Antonio, funziona tutto benissimo,
non c'è nessuno che sappia cosa fare con gli altri problemi?