Newsgroup: it.comp.lang.c++
Titolo: CWnd::GetClientRect e CDC::GetTextExtent

In una finestra di dialogo, ho inserito dei controlli di tipo static text ,
che posso modificare a runtime tramite una edit box. Il problema è il
seguente: poichè il font utilizzato non è proporzionale, non a senso
limitare il numero di caratteri della edit box per far sì che la stringa
immessa dall'utente non superi la dimensione dello static text. Ho usato
invece la CWnd::GetClientRect per ottenere la dimensione (in pixel) dello
static text, e la CDC::GetTextExtent per ottenere la dimensione della
stringa (in logical units) immessa dall'utente. Come faccio a confrontarli?
Non mi sembra ci siano delle funzioni di conversione in questo senso (e se
esistono non sono riuscito a trovarle).
In più, volevo fare una cosa di questo tipo: per ogni carattere immesso,
controllavo se la lunghezza della stringa eccedesse quella dello static
text. In caso positivo scartavo il carattere. Sull'evento EN_CHANGE posso
fare il controllo, ma non scartare il carattere (a meno di non fare un
SetWindowText con la stringa troncata di un carattere). L'altra soluzione
che conosco è quella di creare una nuova classe derivata da CEdit e definire
una variabile per la edit box basata su questa nuova classe. Quindi
intercettare WM_CHAR. Esiste qualche altra soluzione?

intercettare WM_CHAR. Esiste qualche altra soluzione?
Usando EN_UPDATE riesci ad agire _prima_ che l'edit box si
aggiorni per mostrare il nuovo carattere, ma, per rimuovere il
carattere stesso, non offre scorciatoie -- devi tenerti tu copia
del testo prima della modifica (se no come fai a sapere quale
carattere togliere -- l'utente potrebbe stare inserendo in mezzo!).
(Per effettuare la modifica da nuovo testo per tornare a vecchio
testo, puo` spesso essere marginalmente piu` rapido usare
SetSel + ReplaceSel, piuttosto che non rispedire l'intero testo,
almeno per testi molto lunghi e modifiche verso la fine).
Intercettare WM_CHAR, come gia` noti, e` sicuramente un'altra
possibilita`, e potrebbe portare ad una operazione di efficienza
sostanzialmente maggiore.
Alex

Ti ringrazio per la risposta. Tu mi dici che con MM_TEXT 1 logical unit = 1
pixel, il che significa che se i valori che mi ritornano la GetWindowRect e
la GetTextExtent sono direttamente confrontabili. Nella pratica però ho
riscontrato che non succede questo. La GetTextExtent su una stringa con "M"
mi restituisce 14, con "MM" 28, con "MMM" 42. Questo dovrebbe significicare
che una "M" occupa 14 logical unit = 14 pixel. Ma così non è. La "M" occupa
11 pixel sullo schermo. Dove sbaglio questa volta?
Sul fatto di troncare la stringa avevi ragione. Non ho pensato al fatto che
l'utente potesse inserire nel mezzo. Nel frattempo, comunque, mi è venuta
un'altra idea a riguardo. Ho dimensionato, a design time, la casella di edit
in cui l'utente inserisce la stringa da assegnare allo static text delle
stesse dimensioni dello static text (più un paio di unit per via dei bordi)
e ho disattivato lo stile Auto HScroll per la casella di edit. In questo
modo, l'utente non potrà mai assegnare allo static text una stringa che
ecceda le sue dimensioni. Ovviamente questo funziona quando tutti gli static
text modificabili hanno le stesse dimensioni, come nel mio caso. Tu pensi
sia una buona idea, o ci sono delle ... "controindicazioni"?
Grazie.

sia una buona idea, o ci sono delle ... "controindicazioni"?
Non sarebbe male (puoi anche ridimensionare al volo la casella di edit
se deve riflettere diverse dimensioni di static-text in diversi momenti),
purche`, immagino, si parli dello stesso font nei due casi.
Alex