Problème:imprimer un formulaire à plus dpi que l'écran résolution
Nous avons besoin d'aide avec l'utilisation de la capacité de WinForms à auto-échelle différente de DPI pour nous permettre d'imprimer nos formulaires à 600dpi, plutôt qu'à l'écran DPI. Pour l'impression What-You-See-Is-What-You-Get, nous avons simplement pris notre fenêtre joliment aménagé et l'impression (éteindre les barres de défilement et les boutons et autres). Cela fonctionne très bien SAUF pour une chose: il sort à 96dpi ou 120dpi (quelle que soit la résolution de l'écran) ... l'un ou l'autre aspect granuleux et non professionnel (nos clients se plaignent). Et bien qu'il soit aussi lisible que ce qui serait à l'écran, vous vous attendez à ce que les documents imprimés soient plus lisibles qu'à l'écran ... vous devriez pouvoir voir des détails supplémentaires, lire des textes plus petits, etc.
Autres solutions envisagées:
Étant donné que nous avons beaucoup de travail auto-mise à l'échelle, de sorte que notre fenêtre se présente bien dans 96dpi, 120dpi, 144 dpi, etc., nous espérons que nous pouvions tirer notre fenêtre à 600dpi puis imprimer cette. OU, nous avons cherché à dessiner la fenêtre hors écran 5-6x plus grande que la normale de sorte que nous ayons le même nombre de pixels que 600dpi, mais à 96 ou 120 ppp ... mais en dessinant ensuite cette fenêtre géante à la page imprimée à 300 ou 600 dpi (quelle que soit l'imprimante).
Si vous pouvez nous dire comment faire l'une ou l'autre de ces alternatives, OU si vous pouvez nous donner un moyen différent d'atteindre notre objectif, nous l'apprécierions grandement.
Code actuel:
Dans le cas où il importe, notre formulaire se compose d'un FlowLayoutPanel pose d'autres FlowLayoutPanels plus petits dans les colonnes, les FlowLayoutPanels plus petites pose une seule colonne de TextBoxes, RichTextBoxes, un RichTextEditor tiers, PictureBoxes et DataGridViews. Nous utilisons une classe dérivée de PrintDocument implémentant OnBeginPrint, OnPrintPage et OnEndPrint. Dans OnPrintPage, il manipule notre fenêtre normale hors écran (ci-dessous et à droite des écrans réels) pour s'adapter à la taille de la page, puis demande à notre panneau principal (le FlowLayoutPanel supérieur) à DrawToBitmap, puis utilise l'objet Graphics transmis dans PrintEventArgs à DrawImage ce bitmap. Nous utilisons également Graphics.DrawString pour appliquer un pied de page à chaque page. Le code principal:
using (Bitmap bm = new Bitmap(sz.Width, sz.Height))
{
Rectangle rect = new Rectangle(0, 0, sz.Width, sz.Height);
mp.DrawToBitmap(bm, rect);
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; // so footer is anti-aliased
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; // so when we scale up, we smooth out the jaggies somewhat
e.Graphics.DrawImage(bm, this.MarginBounds, rect, GraphicsUnit.Pixel);
if (this.Footer != null)
e.Graphics.DrawImage(this.Footer, this.FooterLocation);
if (!string.IsNullOrEmpty(pageNumber))
{
e.Graphics.DrawString(pageNumber, KBStyle.Normal.Font, Brushes.Black,
this.MarginBounds.X, this.FooterLocation.Y + FooterOffset);
}
}
Comment devrions-nous faire cela pour obtenir 600dpi à la page imprimée? (Ou même 300 dpi serait génial!)
Lorsque nous imprimons cela, il semble beaucoup mieux lorsqu'il est imprimé à partir d'une machine 120dpi que lorsqu'il est imprimé à partir d'une machine 96dpi, d'où nous savons qu'il imprime à la résolution d'écran. Mais nous nous demandons aussi s'il y a une façon simple de le dire: «Ce formulaire devrait dessiner à 600 dpi» et tout le reste du code ci-dessus fonctionne. Remarque: si nous prenons un métafichier EMF (métafichier amélioré) et l'imprimons à l'imprimante dans le code ci-dessus, cette EMF sort à 600 ppp. Malheureusement, nous n'avons pas trouvé de méthode DrawToEMF que nous pouvons appeler sur FlowLayoutPanel au lieu de DrawToBitmap. Changer la bitmap à 600dpi n'aide pas ... la méthode DrawToBitmap semble toujours dessiner le bitmap à la résolution de l'écran.
Merci!
Vous ne pouvez pas convertir votre vue d'écran FlowLayoutPanel en vue imprimable. Vous devrez créer votre propre routine de dessin dans l'événement PrintPage à l'aide de la méthode DrawString. Pas de repas gratuit. – LarsTech
@LarsTech, je ne suis pas sûr d'avoir compris votre commentaire ... DrawToBitmap fonctionne très bien sur un FlowLayoutPanel ... c'est beaucoup un "free lunch", pour ainsi dire ... c'était assez facile de le rendre imprimable (on l'utilise maintenant , avec succès). Dans le code ci-dessus, "mp" est un FlowLayoutPanel. Le seul problème est qu'il le fait à la résolution de l'écran. Et même si la taille de la fenêtre est plus grande (correspondant aux pixels de la page), nous semblons toujours se retrouver avec seulement une résolution d'écran. –
Les imprimantes ont une bien meilleure résolution. Si vous voulez que les résolutions de l'imprimante soient attrayantes, vous devrez supprimer la routine DrawToBitmap où le texte est impliqué et commencer à utiliser les routines Printer DrawString. – LarsTech