C # Impostazione FontDialog per i font TrueType solo visualizzazione
-
25-10-2019 - |
Domanda
Questa domanda è stata posta in praticamente ogni forum, tra cui qui ma non ci sono risposte accettabili da nessuna parte che posso trovare. Sto cominciando a pensare che v'è in realtà alcuna soluzione e non mi resta che avvolgere il mio codice in un blocco try / catch e chiedere scusa per l'utente e chiedere loro di scegliere un altro tipo di carattere.
voglio mostrare un FontDialog
in modo che un utente può modificare i caratteri su un Chart
, se l'utente seleziona un carattere non-TrueType, quindi viene generata un'eccezione. GDI + può gestire solo i font TrueType.
Come faccio a filtrare i caratteri dalla FontDialog che non può essere utilizzato con GDI +?
Soluzione
La classe FontDialog già fa questo, si utilizza la chiamata API ChooseFont () con l'opzione CF_TTONLY. Che costringe il dialogo ai soli font di visualizzazione che si pubblicizzano come i font TrueType. I collegamenti suggerisce che ci sono tipi di carattere di tutto che ingannare la finestra di dialogo, mai sentito parlare prima fino ad oggi. Che lo rende abbastanza raro ma non certo inaspettata, ci sono un sacco di tipi di carattere spazzatura in giro con cattive metadati.
Non è qualcosa che puoi fare per catturare l'eccezione, si è sollevata in una funzione di callback che viene cotto nel framework .NET. Riscrivere la classe è una possibilità, ma non è piacevole. Disinstallare il carattere piantagrane è certamente la soluzione facile.
Altri suggerimenti
Nessun vero bel modo intorno a questo, tranne per provare / blocco catch it
try
{
if (m_FontDialog.ShowDialog(frmMain.mainForm) == DialogResult.OK)
{
//Successful
}
}
catch (Exception ex)
{
//Not a truetype font
MessageBox.Show(frmMain.mainForm, ex.Message + Environment.NewLine + "Font not changed.", "Font Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
Non sono sicuro se funzionerà, ma tenta di impostare FontDialog.AllowSimulations per false .
È possibile utilizzare l'usanza FontDialog disponibili qui per superare questa eccezione. E 'sviluppato in C # .Net.