Comment trouver la réelle zone imprimable? (PrintDocument)

Pourquoi, c'est de découvrir cette magie Rectangle si difficile?

Dans le OnPrintPage événement, j'ai PrintPageEventArgs et je suis en train de dessiner à l'aide de Graphiques dans les limites du maximum de la zone imprimable.

J'ai essayé d'utiliser PageBounds, PrintableArea, Graphiques.VisibleClipBounds, etc. Tous ne parviennent pas à obtenir régulièrement la zone de dessin, en particulier lors de la commutation du mode Paysage au mode Portrait. PrintableArea ne semblent jamais à changer lorsque vous passez du mode Paysage au mode Portrait.

J'ai aussi remarqué qu'il y a une différence dans la façon dont les Graphiques.VisibleClipBounds est définie en fonction de si je suis en train de faire un aperçu avant impression et l'impression. En avant-première, il montre toujours le Portrait largeur/hauteur, de sorte que je dois vérifier si c'est un aperçu et j'ai manuellement swap de la largeur ou de la hauteur, quand il s'agit d'un Paysage.

J'ai besoin d'un algorithme pour le calcul de la zone imprimable comme il se rapporte à l'actuel contexte Graphique, pas un arbitraire théorique de la zone d'impression qui n'est pas utilisée dans le dessin.


Ma préoccupation est de traiter avec le Graphique de la matrice de décalage. Jusqu'à présent j'ai remarqué graves incohérences entre la façon dont le contexte Graphique est pré-traduits à l'aide de la dur des marges en fonction de facteurs comme:

  • Si OriginAtMargins est vrai ou faux (ne pas se comporter comme je le pense)
  • Si je suis d'impression à une imprimante ou à l'aide de la PrintPreviewControl (je dois vérifier si c'est une impression de l'aperçu ou l'impression de la page pour gérer la traduction correctement)
  • Si je suis avec mon imprimante à la maison ou mon imprimante au travail (à la fois se comporter différemment)

Est-il un moyen standard pour gérer cela? Dois-je tout simplement réinitialiser la matrice? Lorsque j'ai mis OriginAtMargins à true, le Graphisme est pré-traduit de 84,84, mais mes marges sont 100,100. Le dur marges sont 16,16. Ne devrait-elle pas être convertis en 100,100? Depuis 0,0 devrait être à la page limites, pas le dur marges.

Fondamentalement, ma méthode doit toujours travailler à obtenir le meilleur imprimable rectangle. J'ai juste besoin d'un uniforme, indépendamment du périphérique de faire en sorte que mon dessin d'origine (0, 0) est en haut à gauche de la page, dans l'ordre ci-dessus par le Rectangle pour être d'une quelconque utilité pour moi.

  • L'utilisation de e.MarginBounds. Et ensemble PrintDocument.OriginAtMargins de Vrai.
  • J'ai fait un projet simple pour tester que avec juste un défaut PrintDocument/PageSetupDialog/PrintDialog et j'ai mis le OriginAtMargins à true et que les marges de 0,0,0,0. Il semble amende d'impression dans un fichier PDF (CutePDFWriter), mais l'impression à une imprimante, elle ne l'est pas. Je dessine un rectangle avec un 3.0 f largeur de la plume et la page n'a même pas d'imprimer quoi que ce soit (la page sort blanche). Je suppose que cela signifie qu'il pense que il n'y a rien dans les limites de l'impression.
  • Si vous voulez tirer dans le dur marges, alors vous feriez mieux de les utiliser. Il ne peut pas imprimer à 0, c'est à l'intérieur de la dur de la marge. Vous pourriez toujours rien sur le côté du chemin du papier est un peu hors de l'endroit où le pilote pense qu'il est, dépend.