Question

J'ai une fonction de dessin qui prend juste un HDC. Mais je dois montrer une version EXACT à l'échelle de ce qui sera imprimé.

actuellement, j'utilise CreateCompatibleDC () avec une imprimante HDC et CreateCompatibleBitmap () avec HDC de l'imprimante.

Je figure ainsi le DC aura la largeur et la hauteur exactes de l'imprimante. Et lorsque je sélectionne les polices dans ce HDC, le texte sera mis à l'échelle exactement comme l'imprimante serait.

Malheureusement, je ne peux pas à un StretchBlt () pour copier les pixels de ce HDC pour HDC du contrôle, car ils sont de différents types HDC je suppose.

Si je crée la « toile de mémoire » d'une fenêtre avec HDC même w, h comme page de l'imprimante, les polices sortent WAY Teeny car ils sont mis à l'échelle pour l'écran, pas la page ...

Si je CreateCompatibleDC () de DC de la fenêtre et CreateCompatibleBitmap () de DC ou quelque chose ??

de l'imprimante

Si quelqu'un pourrait expliquer la bonne façon de le faire. (Et ont encore quelque chose qui ressemble exactement comme il le ferait sur l'imprimante) ...

Eh bien, je vous en serais reconnaissant !!

... Steve

Était-ce utile?

La solution

Selon la façon dont vous voulez être précis, cela peut devenir difficile.

Il existe de nombreuses approches. On dirait que vous essayez de dessiner un bitmap taille imprimante puis rétrécir vers le bas. Les étapes à faire qui sont:

  1. Créer un DC (ou mieux encore, un circuit intégré - Contexte de l'information). Pour l'imprimante
  2. Interroger l'imprimante DC pour connaître la résolution, la taille de la page, les décalages physiques, etc.
  3. Créer un DC pour la fenêtre / écran.
  4. Créer un compatible DC (la mémoire DC).
  5. Créer une image bitmap compatible pour la fenêtre / écran, mais la taille doit être la taille de pixel de la page de l'imprimante. (Le problème avec cette approche est que c'est un bitmap énorme et il peut échouer.)
  6. Sélectionnez le bitmap compatible dans la mémoire DC.
  7. Dessiner à la mémoire DC, en utilisant la même coordonnées utiliseriez si le dessin à l'imprimante réelle. (Lorsque vous sélectionnez les polices, assurez-vous les pouces à l'échelle logique, pas de logique pouces de l'écran de l'imprimante.)
  8. StretchBlt la mémoire continue à la fenêtre, ce qui réduire l'ensemble de l'image. Vous pouvez expérimenter le mode d'étirement pour voir ce qui fonctionne le mieux pour le genre d'image que vous allez afficher.
  9. Libérer toutes les ressources.

Mais avant de vous diriger dans cette direction, tenez compte des solutions de rechange. Cette approche implique l'attribution d'un énorme bitmap hors écran. Cela peut échouer sur les ordinateurs pauvres en ressources. Même si elle ne le fait pas, vous pourriez mourir de faim d'autres applications.

L'approche métafichier donnée dans une autre réponse est un bon choix pour de nombreuses applications. Je commencerai par cela.

Une autre approche est de comprendre toutes les tailles dans une unité à haute résolution fictive. Par exemple, supposons que tout est en 1000e de pouce. Ensuite, vos routines de dessin escaladeraient cette unité imaginaire à la dpi réelle utilisée par le dispositif cible.

Le problème avec cette dernière approche (et peut-être le métafichier un) est que les polices GDI n'échelle pas parfaitement linéaire. Les largeurs des caractères individuels sont tordus en fonction de la résolution cible. Sur un appareil à haute résolution (comme une imprimante laser 300+ dpi), ce peaufinage est minime. Mais sur un écran de 96 ppp, les réglages peuvent ajouter jusqu'à une erreur importante sur la longueur d'une ligne. Ainsi, le texte dans la fenêtre de prévisualisation peut apparaître hors proportion (généralement plus large) que fait sur la page imprimée.

Ainsi, l'approche hardcore est de mesurer le texte dans le contexte de l'imprimante et mesurer à nouveau dans le contexte de l'écran et régler la différence. Par exemple (en utilisant les numéros confectionnés), vous pouvez mesurer la largeur d'un texte dans le contexte de l'imprimante, et il sort à 900 pixels de l'imprimante. Supposons que le rapport des pixels de l'imprimante à l'écran des pixels est égal à 3: 1. Vous attendez le même texte sur l'écran à 300 pixels de l'écran large. Mais on mesure dans le contexte de l'écran et vous obtenez une valeur comme 325 pixels de l'écran. Lorsque vous dessinez à l'écran, vous devrez faire en quelque sorte le texte 25 pixels plus étroit. Vous pouvez les ram entre les caractères, ou choisissez une police légèrement plus petite, puis les étirer.

L'approche hardcore implique une plus grande complexité. Vous pourriez, par exemple, essayer de détecter les substitutions de polices effectuées par le pilote d'imprimante et les faire correspondre aussi étroitement que possible avec les polices d'écran disponibles.

J'ai eu bonne chance avec un hybride du grand-bitmap et les approches hardcore. Au lieu de faire un bitmap géant pour la page entière, je fais un assez grand pour une ligne de texte. Ensuite je dessine au format de l'imprimante au bitmap et offscreen StretchBlt vers le bas à la taille de l'écran. Cela permet d'éliminer face à la différence de taille à une légère dégradation de la qualité de la police. Il est indiqué pour l'aperçu avant impression réelle, mais vous ne voulez pas construire un éditeur WYSIWYG comme ça. Le bitmap d'une ligne est assez petit pour faire de cette pratique.

Les bonnes nouvelles sont que du texte est difficile. Tous les autres dessin est une mise à l'échelle simple coordonet tailles nates.

Je n'ai pas utilisé GDI + beaucoup, mais je pense qu'il a supprimé échelle de la police non-linéaire. Donc, si vous utilisez GDI +, vous devriez juste avoir à l'échelle vos coordonnées. L'inconvénient est que je ne pense pas que la qualité de la police sur GDI + est aussi bonne.

Et enfin, si vous êtes une application native sur Vista ou version ultérieure, assurez-vous que vous avez marqué votre processus comme « DPI-aware". Dans le cas contraire, si l'utilisateur est sur un écran haute DPI, Windows vous mentir et prétendre que la résolution est seulement 96 dpi puis effectuez une mise à l'échelle floue de ce que vous dessinez. Cela dégrade la qualité visuelle et peut faire le débogage de votre aperçu avant impression encore plus compliquée. Depuis tant de programmes ne sont pas bien adaptées aux écrans DPI plus, Microsoft a ajouté « haute mise à l'échelle de DPI » par défaut départ dans Vista.

Edité à Ajouter

Une autre mise en garde: Si vous sélectionnez un HFONT dans la mémoire continue avec le bitmap taille imprimante, il est possible que vous obtenez une police différente de ce qui se lors de la sélection de cette même HFONT dans l'imprimante réelle DC. En effet, certains pilotes d'imprimante remplaceront les polices communes avec dans les mémoires. Par exemple, certaines imprimantes PostScript remplaceront une police PostScript interne pour certaines polices TrueType commun.

Vous pouvez sélectionner d'abord le HFONT dans l'imprimante IC, puis utilisez les fonctions GDI comme GetTextFace, GetTextMetrics, et peut-être GetOutlineTextMetrics pour en savoir plus sur la police réelle sélectionnée. Ensuite, vous pouvez créer un nouveau LOGFONT pour essayer de faire correspondre davantage ce que l'imprimante utiliserait, transformer en un HFONT et sélectionnez que dans votre mémoire DC. Ceci est la marque d'une mise en œuvre très bon.

Autres conseils

Une chose qui pourrait être intéressant d'essayer de créer un métafichier amélioré DC, attirer comme d'habitude, puis l'échelle de cette métafichier en utilisant des paramètres de l'imprimante. Telle est l'approche utilisée par le WTL échantillon BmpView - Je ne sais pas comment cela sera précis mais il pourrait être intéressant de regarder (il devrait être facile au port les classes appropriées à Win32 mais WTL est un grand remplacement pour la programmation Win32 donc pourrait être utile en utilisant.)

Eh bien il ne sera pas la même chose parce que vous avez une résolution plus élevée dans l'imprimante DC, de sorte que vous devrez écrire une fonction de conversion de toutes sortes. Je vais avec la méthode que vous avez à travailler, mais le texte était trop petite et il suffit de multiplier toutes les tailles de position / police par la largeur de la fenêtre de l'imprimante et diviser par la largeur de la fenêtre source.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top