2008-10-31 12 views
0

Les notes de version AppKit pour Leopard disent:Impression sans mise en page - réagit aux changements de format et d'orientation du papier?

Dans de nombreuses applications, il n'est pas approprié de présenter des panneaux de mise en page à l'utilisateur, ou même inclure une Mise en page ... dans le menu Fichier, mais il n'y a pas eu d'autre moyen facile pour laisser l'utilisateur spécifier les paramètres de configuration de la page à utiliser lors de l'impression. (nouvel avis interface utilisateur: si votre application ne pas persistante magasin en page paramètres sur une base par document ou ont un mécanisme pour les associer avec tout autre type de à grande échelle les objets de votre application peut traiter avec, il ne devrait probablement pas un panneau de configuration de la page du tout.)

J'ai des besoins d'impression assez simples et je voudrais éliminer la commande « Mise en page ... » de ma demande.

Ma recette précédente pour l'impression de texte consistait à créer une vue de texte hors écran d'une taille appropriée pour le format et l'orientation du papier en cours, puis à lancer une opération d'impression pour cette vue. Toutefois, si vous permettez à l'utilisateur de modifier le format et l'orientation du papier dans le panneau d'impression, je dois réagir à ce changement et reconfigurer mon affichage du texte d'impression.

Quelle est la bonne façon de gérer cette situation? Mon exemple actuel d'application piratée le fait en sous-classant NSTextView et en reconfigurant les nouveaux paramètres de page en -[MyTextView knowsPageRange:].

Répondre

1

Une approche qui est légèrement hacky mais fonctionne très bien est d'exécuter deux NSPrintOperations.

Nous l'utilisons dans le code d'impression de notre application, pour détecter si l'utilisateur a sélectionné une imprimante ordinaire ou une imprimante de reçus dans le panneau d'impression. L'application imprime un document entièrement différent pour chaque type d'imprimante.

Donc PyObjC, code non testé:

def smartlyPrintView_(self, theViewToPrint): 
    # set up and run an initial NSPrintOperation to get printInfo 
    fakePrintOperation = NSPrintOperation.printOperationWithView_(theViewToPrint) 
    NSPrintOperation.setCurrentOperation_(fakePrintOperation) 

    if NSPrintPanel.printPanel().runModal() == True: 
     # get the printInfo so we can do stuff with it 
     printInfo = fakePrintOperation.printInfo() 
     # get rid of our fakePrintOperation 
     NSPrintOperation.currentOperation().cleanUpOperation() 

     # do stuff 

     # run a real NSPrintOperation without a printPanel 
     realPrintOperation = NSPrintOperation.printOperationWithView_printInfo_(theViewToPrint, printInfo) 
     realPrintOperation.setShowsPrintPanel_(False) 
     realPrintOperation.runOperation() 

    else: 
     NSPrintOperation.currentOperation().cleanUpOperation() 

Recette de traduire cela Obj-C:

Ajouter quelques déclarations de variables, remplacer les underscores par deux points, et entrelacer les arguments avec les clauses de la méthode . Mélanger dans une demi-tasse de farine et une poignée de semi-deux-points. Laisser mijoter à feu doux pendant 30 minutes et servir chaud. Bonne chance :)