View Full Version : [API windows] Formattazione del testo e handle font
17Qwerty71
22-01-2006, 19:36
Quale api occorre utilizzare per formattare del testo, per renderlo italic o in grassetto per esempio?
Mentre per impostare l'handle di un font dandogli come parametro la locazione del font stesso?
Grazie :)
Quale api occorre utilizzare per formattare del testo, per renderlo italic o in grassetto per esempio?
Mentre per impostare l'handle di un font dandogli come parametro la locazione del font stesso?
Ciao, se sei tu che devi scrivere direttamente il testo su un HDC, le funzioni da usare sono:
- CreateFont/CreateFontIndirect per creare un handle HFONT.
- SelectObject per selezionare un HFONT in un HDC.
- TextOut/ExtTextOut/TabbedTextOut/DrawText/DrawTextEx per disegnare il testo sul HDC.
Poi naturalmente ci sono tutta una serie di altre funzioni per ottenere informazioni sui font e sulla loro metriche.
Di solito io faccio così:
//Un tuo font
HFONT tuoFont = ...;
//oppure, il font di default delle finestre
HFONT tuoFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
//Troviamo le caratteristiche di questo font
LOGFONT lf;
GetObject(tuoFont, sizeof(LOGFONT), &lf);
//Trasformiamo le caratteristiche del font attuale:
//italic e underlined
lf.lfItalic = TRUE;
lf.lfUnderline = TRUE;
//Creiamo il font vero e proprio
HFONT newFont = CreateFontIndirect(&lf);
Così hai tutte le caratteristiche del font che stai usando attualmente + corsivo e sottilineato.
Mentre per impostare l'handle di un font dandogli come parametro la locazione del font stesso?
Spiegati meglio, non ho capito na mazz :D
Mentre per impostare l'handle di un font dandogli come parametro la locazione del font stesso?Forse intendi dire come ottenere un handle di font partendo dal nome di un file true-type (o altro tipo) come ad esempio "C:\Documenti\tahoma.ttf"???
17Qwerty71
23-01-2006, 13:21
Forse intendi dire come ottenere un handle di font partendo dal nome di un file true-type (o altro tipo) come ad esempio "C:\Documenti\tahoma.ttf"???
esatto :)
17Qwerty71
23-01-2006, 16:29
Un'altra domanda; ma il messaggio WM_LBUTTONDBLCLK viene inviato dal sistema al doppio click o è un messaggio che deve essere inviato dal nostro codice per simularlo? :confused:
Un'altra domanda; ma il messaggio WM_LBUTTONDBLCLK viene inviato dal sistema al doppio click o è un messaggio che deve essere inviato dal nostro codice per simularlo? :confused:
Sì, viene inviato dal sistema.
C'è da tenere presente inoltre che:
- Solo le finestre che hanno lo stile (della classe) CS_DBLCLKS ricevono il WM_LBUTTONDBLCLK.
- La sequenze di invio dei messaggi è: 1) WM_LBUTTONDOWN, 2) WM_LBUTTONUP, 3) WM_LBUTTONDBLCLK e 4) WM_LBUTTONUP
17Qwerty71
23-01-2006, 17:21
Sì, viene inviato dal sistema.
C'è da tenere presente inoltre che:
- Solo le finestre che hanno lo stile (della classe) CS_DBLCLKS ricevono il WM_LBUTTONDBLCLK.
- La sequenze di invio dei messaggi è: 1) WM_LBUTTONDOWN, 2) WM_LBUTTONUP, 3) WM_LBUTTONDBLCLK e 4) WM_LBUTTONUP
Grazie, perchè cercando un po' in giro trovavo diverse interpretazioni.
Cmq possibile che se invio questo messaggio ad un'elemento (ad esempio uno STATIC con lo stile SS_NOTIFY), viene generata una simulazione della pressione?
Perchè successivamente mi arriva la notifica di doppio click :confused:
Non ho poi ben capito a che servono le macro che si possono inserire nel wParam del messaggio WM_LBUTTONDBLCLK :confused:
esatto :)
Non c'è una funzione, tra le API Win32, per ottenere direttamente un handle di font partendo da un nome di file di font true-type (o simile).
Tutte le funzioni che hanno a che fare con un handle di font, presuppongono che il font sia già installato/registrato nel sistema.
Esistono però le funzioni:
- AddFontResource/RemoveFontResource
e
- AddFontResourceEx/RemoveFontResourceEx (da Win2000 in poi)
per installare/rimuovere un font.
Se hai bisogno di fare cose "particolari" con i font, puoi usare librerie esterne come la libreria FreeType (www.freetype.org (http://www.freetype.org)).
17Qwerty71
23-01-2006, 17:31
Non c'è una funzione, tra le API Win32, per ottenere direttamente un handle di font partendo da un nome di file di font true-type (o simile).
Tutte le funzioni che hanno a che fare con un handle di font, presuppongono che il font sia già installato/registrato nel sistema.
Esistono però le funzioni:
- AddFontResource/RemoveFontResource
e
- AddFontResourceEx/RemoveFontResourceEx (da Win2000 in poi)
per installare/rimuovere un font.
Se hai bisogno di fare cose "particolari" con i font, puoi usare librerie esterne come la libreria FreeType (www.freetype.org (http://www.freetype.org)).
Grazie, mi serviva soprattutto per sfizio (potrebbe tornarmi utile) :p
Grazie, perchè cercando un po' in giro trovavo diverse interpretazioni.
Cmq possibile che se invio questo messaggio ad un'elemento (ad esempio uno STATIC con lo stile SS_NOTIFY), viene generata una simulazione della pressione?
Perchè successivamente mi arriva la notifica di doppio click :confused:Secondo la documentazione su MSDN, per lo stile SS_NOTIFY dice:
"Sends the parent window STN_CLICKED, STN_DBLCLK, STN_DISABLE, and STN_ENABLE notification messages when the user clicks or double-clicks the control".
Quindi il parente del controllo static riceve la notifica STN_DBLCLK (attraverso WM_COMMAND) se qualcuno fa doppio click sul controllo static.
Se vuoi inviare tu di proposito il WM_LBUTTONDBLCLK al controllo, dovrebbe funzionare (non ho mai provato comunque ;) ).
Non ho poi ben capito a che servono le macro che si possono inserire nel wParam del messaggio WM_LBUTTONDBLCLK :confused:Il wParam per WM_LBUTTONDBLCLK è una semplice combinazione di flag come: MK_CONTROL, MK_LBUTTON, MK_MBUTTON, ecc...
17Qwerty71
23-01-2006, 17:42
Secondo la documentazione su MSDN, per lo stile SS_NOTIFY dice:
"Sends the parent window STN_CLICKED, STN_DBLCLK, STN_DISABLE, and STN_ENABLE notification messages when the user clicks or double-clicks the control".
Quindi il parente del controllo static riceve la notifica STN_DBLCLK (attraverso WM_COMMAND) se qualcuno fa doppio click sul controllo static.
Se vuoi inviare tu di proposito il WM_LBUTTONDBLCLK al controllo, dovrebbe funzionare (non ho mai provato comunque ;) ).
Il wParam per WM_LBUTTONDBLCLK è una semplice combinazione di flag come: MK_CONTROL, MK_LBUTTON, MK_MBUTTON, ecc...
Nel senso che se mi arriva la macro MK_MBUTTON in wParam significa che mentre è stato fatto il doppio click si teneva premuto anche il tasto centrale del muose? :confused:
Nel senso che se mi arriva la macro MK_MBUTTON in wParam significa che mentre è stato fatto il doppio click si teneva premuto anche il tasto centrale del muose? :confused:
Esatto:
if (wParam & MK_MBUTTON)
{
/* Pulsante centrale mouse premuto */
}
17Qwerty71
23-01-2006, 18:31
Esatto:
if (wParam & MK_MBUTTON)
{
/* Pulsante centrale mouse premuto */
}
Non ho ben chiara un'altra cosa :confused:
Ma in lParam troverò le coordinate del cursore, ma in riferimento a quale elemento?
E poi perchè se metto un'elemento static con stile SS_NOTIFY e se vado a cliccarci sopra il messaggio non viene inviato, cosa che invece succese non non aggiungo lo stile?
Ancora grazie ;)
Non ho ben chiara un'altra cosa :confused:
Ma in lParam troverò le coordinate del cursore, ma in riferimento a quale elemento?
lParam contiene i valori x/y "impacchettati" nella parte bassa/alta di lParam.
Puoi usare questo codice per "spacchettare" i dati:
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
La posizione che ti viene indicata è quella del punto in cui si è fatto il click/doppio click ed è relativa all'angolo in alto/sinistra dell'area client del controllo su cui si è generato l'evento.
E poi perchè se metto un'elemento static con stile SS_NOTIFY e se vado a cliccarci sopra il messaggio non viene inviato, cosa che invece succese non non aggiungo lo stile?
Non ho capito bene cosa vuoi dire ... faccio poi delle prove.
17Qwerty71
23-01-2006, 19:19
lParam contiene i valori x/y "impacchettati" nella parte bassa/alta di lParam.
Puoi usare questo codice per "spacchettare" i dati:
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
La posizione che ti viene indicata è quella del punto in cui si è fatto il click/doppio click ed è relativa all'angolo in alto/sinistra dell'area client del controllo su cui si è generato l'evento.
Non ho capito bene cosa vuoi dire ... faccio poi delle prove.
Ma il controllo da cui prende le coordinate come fa a riconoscerlo?
Ma il controllo da cui prende le coordinate come fa a riconoscerlo?
Scusa ... non ho capito cosa non hai capito. ;)
Quando fai un doppio click su un controllo, al controllo stesso viene mandato il messaggio WM_LBUTTONDBLCLK, con le coordinate del punto in lParam.
17Qwerty71
23-01-2006, 19:28
Scusa ... non ho capito cosa non hai capito. ;)
Quando fai un doppio click su un controllo, al controllo stesso viene mandato il messaggio WM_LBUTTONDBLCLK, con le coordinate del punto in lParam.
Ah, quindi lui prende come controllo per il calcolo delle coordinate quello sul quale ci clicchi?
Grazie :)
Ah, quindi lui prende come controllo per il calcolo delle coordinate quello sul quale ci clicchi?
Sì, l'ho già specificato qualche post sopra ma lo ripeto: le coordinate del punto sono relative all'angolo in alto/sinistra dell'area client del controllo.
17Qwerty71
24-01-2006, 11:29
ok, capito :)
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.