7
votes

C # Réglage de Fondialog pour afficher uniquement les polices TrueType

Cette question a été posée dans pratiquement tous les forums, y compris ici mais il n'y a pas de réponses acceptables partout où je peux trouver. Je commence à penser qu'il n'y a pas de solution et je dois juste envelopper mon code dans un bloc d'essai / attraper et de m'excuser à l'utilisateur et de leur demander de choisir une autre police.

Je veux montrer un fondialog de sorte qu'un utilisateur puisse modifier les polices d'un graphique , cependant si l'utilisateur sélectionne une police non trueType, une exception est une exception. jeté. GDI + ne peut gérer que des polices TrueType.

Comment puis-je filtrer les polices de la FonTidialog qui ne peut pas être utilisée avec GDI +?


2 commentaires

Dans quelle mesure serait-il difficile de vous implémenter votre propre Chooser de polices? Cela peut prendre quelques heures pour les options les plus importantes mais ne devrait pas prendre plusieurs semaines.


@David qui dépend vraiment de ce qu'il l'utilise.


4 Réponses :


0
votes

Je ne sais pas si cela fonctionnera, mais essayez de définir fondialog.allowsimulations à false .


0 commentaires

5
votes

La classe Fondialog en fait déjà cela, elle utilise l'appel de l'API Choison () avec l'option CF_TONLY. Qui force la boîte de dialogue pour afficher uniquement des polices qui se font de la publicité comme des polices TrueType. Les liens suggèrent qu'il y a des polices autour de ce imbécile de dialogue, jamais entendu parler de cela avant aujourd'hui. Ce qui le rend assez rare mais certainement pas inattendu, il y a beaucoup de polices indésirables avec de mauvaises métadonnées.

Il n'y a rien que vous puissiez faire pour attraper l'exception, il est soulevé dans une fonction de rappel qui est cuit dans le cadre .NET. La réécriture de la classe est une option mais pas agréable. Désinstallation de la police de Troublemaker est certainement la solution facile.


1 commentaires

Merci Hans. Je suis en train d'exécuter Win7 X64 avec Adobe Photoshop et Mathematica Fonts installés uniquement; Les autres sont toutes des polices de stock. Environ la moitié de mes polices conduisent à cette exception, alors désinstaller la ou les polices gênantes n'est pas une option, tristement.



1
votes

Pas vraiment bon chemin autour de celui-ci, sauf pour essayer / attraper le bloc, il xxx


4 commentaires

Sauf que ce n'est pas une exception capable!


@OZZAH: Que voulez-vous dire par "pas une exception capable"? La capture fonctionne bien. Cela signifie-t-il que vous n'êtes pas censé l'attraper?


@Binus L'exception ne peut pas être attrapée: juste comme StackoverflowException. Si vous mettez le code à l'intérieur d'un essai / Catch, rien n'arrive - l'exception se passe toujours et le programme se bloque toujours.


@Ozzah: Peut-être qu'il y a plus d'un problème similaire là-bas. J'ai pu reproduire le comportement décrit aujourd'hui en utilisant la police suivante: Galette . J'ai obtenu argumendexception , qui peut être attrapé sans problèmes. C'est seulement une sorte d'idiot d'avertir l'utilisateur que la police sélectionnée ne fonctionne pas. Il serait bien mieux de filtrer ces polices avant la sélection.



1
votes

Vous pouvez utiliser le personnage FontDialog disponible ici pour surmonter cette exception. Il est développé en C # .NET.


1 commentaires

MM n'a pas résolu ce bogue, jusqu'à présent. L'exception déclenche des polices TTF, indiquant qu'ils ne sont pas TTF. Ce personnalisé FonTidialog est bien meilleur que le fichier Fondialog par défaut! Il résout non seulement ce problème, mais il peut également gérer correctement les noms de polices longs tels que "Noto Sans Semcond Sembd". Le fichier Fondialog par défaut oubliera ce nom lors de la réouverture. Il comporte des cases à cocher pour italiques, audacieuses et chutout. Je devais ajouter un drapeau pour le bouton ok, cependant, alors je pouvais voir que je n'ai pas frappé Annuler.