Newsgroup: it.comp.lang.visual-basic
Titolo: [?] GetTextMetrics

Con l'api GetTextMetrics() ricavo alcune informazioni relative
all'impostazione del font di un hDC.
Ma come faccio a settarne di nuove? Non esiste nessuna SetTextMetrics()...
E poi come si fa a sapere se il font č Bold?
Grazie.
Ciao

E poi come si fa a sapere se il font è Bold?
Niente, tutto risolto con la SelectObject() e LOGFONT
Ciao



 E poi come si fa a sapere se il font è Bold?
Ciao Zanna,
partiamo dalla domanda più semplice; per sapere se il font è bold devi
controllare all'interno della struttura TEXTMETRIC il valore del membro
"tmWeight", ecco una tabellina che ti potrà servire:
Value                            Weight
FW_DONTCARE        0
FW_THIN                     100
FW_EXTRALIGHT     200
FW_ULTRALIGHT      200
FW_LIGHT                  300
FW_NORMAL            400
FW_REGULAR          400
FW_MEDIUM             500
FW_SEMIBOLD        600
FW_DEMIBOLD        600
FW_BOLD                  700       <<=====||
FW_EXTRABOLD     800
FW_ULTRABOLD     800
FW_HEAVY               900
FW_BLACK               900
Per poter invece cambiare le caratteristiche di un font associato ad un
device-context ("DC" e non "hDC") credo che l'unico modo sia quello di
crearti tramite la CreateFont() il nuovo font *logico* modificato - magari
sfuttando la GetTextFace() e qualche parametro che ottieni dalla
GetTextMetrics() - ed associarlo al DC con la classica SelectObject().
Ciao.
--
Princi, 
princ...@programmer.net
--------------------------------------------------------------------------
"Tutti sanno che una cosa è impossibile da realizzare,
finché arriva uno sprovveduto che non lo sa e la inventa." A.E.

GetTextMetrics() - ed associarlo al DC con la classica SelectObject().
Già... l'ho capita anch'io.
Quello che non ho capito è perchè sia la TEXTMETRIC che la LOGFONT
contengono le stesse informazioni.
Adesso il mio problema è questo:
Creo un font (*logico* ovviamente) con la CreateFontIndirect() e lo voglio
mettere al posto di quello attuale, e quello attuale buttarlo via (insomma
cambiare il font del DC - senz'acca :) - )
Ho provato così ma sembra che non venga rilasciata della memoria, per cui
dopo un po' di giri mi da l'errore 7.
    Dim TM As TEXTMETRIC
    Dim hNewF As Long
    Dim hF As Long
    Dim F As LOGFONT
    hF = GetCurrentObject(hDC, OBJ_FONT)
    Call GetObject(hF, Len(F), F)
    ' qui modifico le proprietà di F che voglio cambiare...
    hNewF = CreateFontIndirect(F)
    hF = SelectObject(hDC, hNewF)
    Call DeleteObject(hF) ' butto via il vecchio font
Dov'è l'errore? Da qualche altra parte?
Ciao.



 Dov'č l'errore? Da qualche altra parte?
In genere, una volta sostituito l'oggetto di default con uno nuovo,
una volta terminate le operazioni grafiche devi ripristinare il
vecchio oggetto, rimetterlo " a posto".
Non lo puoi cancellare come fosse un oggetto che hai creato tu.


Ora vado a memo ma, mi sbaglio io o non bisogna mica segnalare al sistema
il nuovo font?  (con SendMessage, guardati bene l'SDK, bisogna mandarlo in
broadcast).
Scusa se non ti dico di + ma da dove scrivo non ho la possibilitą di leggere
i miei appunti.
Ciao, Clod.

Non lo puoi cancellare come fosse un oggetto che hai creato tu.
Non č vero... gnč-gnč cicca-cicca :)
L'errore stava nel fatto che in un altro punto non cancellavo (dopo aver
selezionato quello nuovo) il brush.
Quindi il mio sistema funziona perfettamente.
"In genere" si _dovrebbe_ rimettere a posto, ma a me serve selezionarlo
punto e basta, per cui del vecchio oggetto non saprei piů che farmene.
Ciao, grazie comunque.

 Ciao.
Ma chi ti insegnato tra trattare così le cose non tue? Il vecchio font è di
windows ed il DC anche! Se vuoi, e se sei umile, windows ti ci fa giocare
per un pochino, ma poi devi rimettere tutto come l'hai trovato (non te l'ha
mai detto la mamma?)
A parte gli scherzi, puoi smontare e rimontare un DC come vuoi tu, ma quando
windows lo chiude lo deve trovare esattamente come quando lo ha creato
(perché ricordati che alla fine lo crea sempre lui, tu al massimo puoi
dirgli di farlo).
Il vecchio font tienitelo da parte, fai quello che vuoi fare, lo rimetti al
suo posto e poi butti via il tuo.


 punto e basta, per cui del vecchio oggetto non saprei più che farmene.
Se ottenevi un errore altrove non lo posso sapere, comunque quello che
dico è corretto. "Dovresti" rimetterlo a posto. Anche se probabilmente
la guida dirà "should" e non "must", ricordo bene che bisogna "richiudere
i cassetti" prima di uscire. Se poi con VB nessuno s'adonta se non lo fai
potrà anche essere, però...

potrà anche essere, però...
Vero, vero, è una delle regole di buona programmazione.
Però attenzione: quando MSDN dice "dovresti" rimettere a posto è solo per
"rispetto" verso gli altri programmi che potrebbero agire sullo stesso
oggetto dopo di te e trovarsi spiazzati da come hai lasciato le cose.
Anche sulla DeleteObject() dice che "cancella l'oggetto e ne libera tutte le
risorse assiociate [...] a meno che l'oggetto sia invalido o attualmente in
uso" quindi non c'è niente di sporco.
Ciao

punto e basta, per cui del vecchio oggetto non saprei piů che farmene.
OCCHIO ZANNA,
JIMI ha perfettamente ragione, non puoi distruggere te qualcosa fatto da
altri, perchč non sai che oggetto sia!
Esistono una serie di oggetti (brush, fonts, etc) di sistema, che il sistema
usa di default, e che assegna per default
ai DC. Se deallochi uno di questi oggetti, il sistema continua ad usarli
inconscio che tu l'hai deallocati, risultato,
un creash video, tutto il video a puttane.
Anche da manuale viene espressamente scritto che gli oggetti di sistema NON
vanno deallocati.
Ciao
By -MES-   Maronese Ettore
http://www.maronese.com/mes
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb