7
votes

Comment puis-je empêcher la boîte de dialogue de progression d'impression apparaissant lors d'une prévisualisation d'impression

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;
}


1 commentaires

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é.


8 Réponses :


1
votes

Vous pouvez avoir une chance avec PreviewPrintController au lieu de StandardPrintController.


2 commentaires

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.



0
votes

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: xxx


0 commentaires

6
votes

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));
        }
    }


1 commentaires

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.



2
votes

Je déteste répondre à ma propre question, mais la solution me regardait au visage.

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.

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.

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.


0 commentaires

0
votes

Il semble que le printpreviewcontrol utilisé par printpreviewdialog remplacera le printController du printDocument de sorte qu'il utilise A printControllerwithstatusDialog lors du processus de rendu de prévisualisation. Une fois que l'opération imprimer est effectuée, le printController est restauré sur sa valeur précédente. Il semble qu'il ne serait pas possible de personnaliser le printpreviewcontrol pour utiliser tout autre printController .


0 commentaires

3
votes

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. XXX

Source http://reflector.webtropy.com/default.aspx/4@0/4@0/devdiv_tfs/dev10/relases/rtmrel/ndp/fx / SRC / WinForms / géré / System / WinForms / Impression / PrintPreviewControl @ CS / 1305376 / PrintPreviewControl @ CS


1 commentaires

É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.



3
votes

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());
        }
    }
}


0 commentaires

1
votes

Une solution qui fonctionne pour moi est d'utiliser Harmony (v1.2) et patch the < Code> ComputePreview Fonction du PrintPreviewControl mentionné ci-dessus:

La classe de correctifs ressemble à ceci xxx

pour appliquer le patch vous Besoin d'inclure les 2 lignes suivantes dans le démarrage de votre application: xxx


0 commentaires