2010-11-02 6 views
2

Je voudrais savoir ce que je devrais faire avec la mise en page graphique sous WinAPI/MFC.UI mise en page cauchemar avec WinAPI

Dans le monde idéal, je devrais créer le formulaire/boîte de dialogue via l'éditeur de ressources, et tout devrait fonctionner. Dans le monde réel, l'éditeur de dialogues est un monstre ancien de l'ère glaciaire et ne supporte pas la plupart des contrôles comctl32.

C'est là qu'intervient le problème. L'éditeur de dialogues utilise des unités DLU et lorsque je crée de nouveaux contrôles à l'exécution, je dois les exprimer en décalages de pixels.

Je suis tombé sur un article sur le calcul des DLU basé sur la police http://support.microsoft.com/kb/145994/en-us, mais j'ai aussi vu un avertissement quelque part que les boîtes de dialogue peuvent avoir des polices non système dans certaines circonstances, donc cette approche n'est pas très sûre. De plus, l'article semble regarder seulement les caractères anglais, sans tenir compte de tous les autres caractères dans l'espace unicode qui pourrait être plus large.

Est-ce que quelqu'un a fait une recherche dans cette direction et trouvé un meilleur moyen?

P.S .: Pas de Winforms/WPF/Delphi, exigences.

Répondre

2

l'éditeur de dialogue est ancien mastodonte de l'âge de la glace et ne supporte pas la plupart des comctl32 commande

Il n'a pas besoin de soutenir les contrôles directement, vous pouvez toujours utiliser juste pour le positionnement en l'insérant comme un contrôle personnalisé et en remplissant la classe de fenêtre dans la page de propriétés. Par exemple, c'est comme ça que j'insère des contrôles de lien dans VS2005: comme un contrôle personnalisé avec la classe "SysLink".

+0

Hmm, comment l'ai-je raté, tous les articles semblent aussi aller de différentes longueurs, mais je n'ai pas vu cette approche auparavant, merci! – Coder

2

MapDialogRect (mentionné dans l'article) est la fonction que Windows utilise pour traduire les unités de dialogue dans la ressource de dialogue en unités de pixel. MapDialogRect fonctionne (où GetDlgBaseUnits échoue) parce qu'il lui donne un handle réel à la boîte de dialogue, et peut lui envoyer un message WM_GETFONT pour récupérer la police réelle avec laquelle le dialogue sera rendu.