Dans mon application C #, je tente de générer un aperçu avant impression sans la boîte de dialogue de progression apparue à l'écran.
Je pense que vous pouvez utiliser PrintDocument.PrintController Pour empêcher cela lors de l'impression pour réel (c.-à-d. Pas un aperçu de l'impression), mais cela ne semble pas Pour fonctionner lors de l'aperçu d'impression. p>
Mon code est comme suit: P>
public FrmDeliveryNotePrintPreview(DeliveryNote deliveryNote) { InitializeComponent(); this.Text = "Delivery Note #" + deliveryNote.Id.ToString(); // The print preview window should occupy about 90% of the // total screen height int height = (int) (Screen.PrimaryScreen.Bounds.Height * 0.9); // Making an assumption that we are printing to A4 landscape, // then adjust the width to give the correct height:width ratio // for A4 landscape. int width = (int) (height / 1.415); // Set the bounds of this form. The PrintPreviewControl is // docked, so it should just do the right thing this.SetBounds(0, 0, width, height); PrinterSettings printerSettings = new PrinterSettings(); PrintDeliveryNotes pdn = new PrintDeliveryNotes( new DeliveryNote[] { deliveryNote }, printerSettings); PrintDocument printDocument = pdn.PrintDocument; printDocument.PrintController = new PreviewPrintController(); ppcDeliveryNote.Document = printDocument; }
8 Réponses :
Vous pouvez avoir une chance avec PreviewPrintController au lieu de StandardPrintController. P>
Ouais, cependant j'ai déjà essayé cela, et cela produit toujours la boîte de dialogue de progrès.
J'ai mis à jour l'échantillon de code pour inclure la classe entière car elle se trouve actuellement.
Une solution de contournement serait d'utiliser l'API d'EnumChildwindows pour trouver la poignée à la fenêtre et, si elle est trouvée, utilisez l'API ShowWindow avec le drapeau SW_HIDE pour masquer la fenêtre.
Voici un exemple d'utilisation de Findwindow si vous savez si vous savez. Le titre de la fenêtre: p>
Ceci fonctionne pour moi:
Définissez la conception de caractères de votre document sur un StandardPrintController code>. p>
static class Program
{
static void Main()
{
PrintDocument doc = new PrintDocument();
doc.PrintController = new StandardPrintController();
doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
doc.Print();
}
static void doc_PrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.DrawString("xxx", Control.DefaultFont, Brushes.Black, new PointF(e.PageBounds.Width / 2, e.PageBounds.Height / 2));
}
}
Cela a travaillé pour moi, bien que je ne fais pas d'aperçu. Voir les remarques ci-dessous pour les différents caractères personnels disponibles: MSDN. microsoft.com/en-us/library/... . PrintController est un personnage de caractères PrintControllerwithStatusTusTatuStatuog par défaut.
Je déteste répondre à ma propre question, mais la solution me regardait au visage. P>
Comme j'ai déjà codé la possibilité d'imprimer une note de livraison, ma prochaine étape consistait à fournir une copie à l'écran (c'est-à-dire aucune intention d'imprimer une copie papier). La boîte de dialogue d'aperçu des impressions semblait être une solution facile. P>
En fin de compte, je viens de créer un formulaire personnalisé et de peindre directement sur celui-ci sans contrôle de prévisualisation d'impression en vue. P>
Malheureusement, je me suis trop concentré sur la tentative d'avoir une prévisualisation d'impression pour vous comporter comme je le voulais, plutôt que de regarder le plus gros problème. P>
Il semble que le printpreviewcontrol code> utilisé par
printpreviewdialog code> remplacera le
printController code> du
printDocument code> de sorte qu'il utilise A
printControllerwithstatusDialog code> lors du processus de rendu de prévisualisation. Une fois que l'opération code> imprimer > est effectuée, le
printController code> est restauré sur sa valeur précédente. Il semble qu'il ne serait pas possible de personnaliser le
printpreviewcontrol code> pour utiliser tout autre
printController code>. P>
Juste pour confirmer la réponse de Pooven. J'ai eu le même problème et j'ai essayé de résoudre, la solution de Stefan n'a pas non plus travaillé de moi. Ensuite, j'ai finalement regardé dans le code source et découvre qu'il est codé dur, il ne peut donc pas être changé. Si vous devez masquer la boîte de dialogue Status, recherchez une autre solution que PrintPreviewControl. Voici le code source du PrintPreviewControl. Source
Étant donné que Winforms est maintenant open source, il est possible d'extraire le code de PrintPreviewControl et de ses dépendances pour modifier son contrôleur d'impression.
Je pense que je l'ai fait. Utilisez cette classe au lieu de PrintPreviewControl:
public class PrintPreviewControlSilent : PrintPreviewControl { public new PrintDocument Document { get { return base.Document; } set { base.Document = value; PreviewPrintController ppc = new PreviewPrintController(); Document.PrintController = ppc; Document.Print(); FieldInfo fi = typeof(PrintPreviewControl).GetField("pageInfo", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); fi.SetValue(this, ppc.GetPreviewPageInfo()); } } }
Une solution qui fonctionne pour moi est d'utiliser Harmony (v1.2) et patch the < Code> ComputePreview Code> Fonction du La classe de correctifs ressemble à ceci p> pour appliquer le patch vous Besoin d'inclure les 2 lignes suivantes dans le démarrage de votre application: p> PrintPreviewControl Code> mentionné ci-dessus:
PrintDeliveryNotes est une classe qui imprime une gamme de notes de livraison. Dans ce cas cependant, je n'appelle pas la méthode d'impression (), mais je récupérais simplement la propriété PrintDocument et de l'alimenter à mon PrintPreviewControl sur un formulaire personnalisé.