Impression d'une NSView

xpechxpech Membre
14:31 modifié dans API AppKit #1
Bonjour,

mon premier message ici :)

J'ai un problème qui doit-être classique, mais il me manque une un clef : J'ai une NSView créée pour l'impression. Hors je ne connait pas la taille du contenu avant d'avoir dessiné.

Je l'initalise à  la taille de la zone d'impression :
<br />-(MzPrintViewTest*)printView<br />{<br />	if (printView == nil)<br />	{<br />		NSPrintInfo *pi = [NSPrintInfo sharedPrintInfo];<br />		NSSize s = [pi paperSize];<br />		CGFloat bottom = [pi bottomMargin];<br />		CGFloat top = [pi topMargin];<br />		CGFloat left = [pi leftMargin];<br />		CGFloat right = [pi rightMargin];<br />		NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];<br />		[defaults setBool:YES forKey: NSPrintHeaderAndFooter ];<br />		printView = [[MzPrintViewTest alloc] initWithFrame:NSMakeRect(0.0, 0.0,s.width - left - right , s.height - top - bottom)];<br />	}<br />	return printView;<br />}<br />


Ensuite j'utilise une NSPrintOperation:
<br />-(void)presentPanel:(id)sender<br />{<br />	id v = [self printView];<br />	po = [[NSPrintOperation printOperationWithView:v] retain];<br />	[[po printPanel] addAccessoryController:self];<br />	[po runOperationModalForWindow:[sender window]<br />						&nbsp; delegate:nil<br />					didRunSelector:nil<br />					&nbsp;  contextInfo:nil];<br />}<br />

L'accessory permet de gérer des option d'impression - ça fonctionne bien.

Il m'appelle le drawRect:, je dessine, et la c'est le drame, comment indiquer proprement la nouvelle taille ! et que la preview fonctionne ?

J'incrémente un compteur de page ... je connait parfaitement la dimension finale, j'ai essayé sans succès de jouer avec setFrameSize:

La solution serait peut-être de créer un faut GraphicContext puis de mettre à  jour la frame avant de passer au NSPrintOperation, mais c'est un peu violent ...


PS : j'ai passé pas mal de temps à  essayer d'utiliser une NSTextView, quelle usine à  gaz !!


Si vous pouvez me donner un coup de pousse ... je suis "out"

merci :)

Réponses

  • CéroceCéroce Membre, Modérateur
    14:31 modifié #2
    Implémente les méthodes
    [tt]- (BOOL)knowsPageRange:(NSRangePointer)range[/tt]
    et surtout
    [tt]- (NSRect)rectForPage:(int)page[/tt]

    Le rectangle frame, il me semble, n'est utilisé que pour l'affichage à  l'écran.
  • xpechxpech Membre
    14:31 modifié #3
    2 méthodes, 2 gros problèmes :
    * knowsPagesRange : je doit avoir tout dessiné pour le connaitre
    * rectForPage : c'est plus simple. Mais dans tout les cas, je ne peux que dessiner l'ensemble.

    En fait je me demande comment je pourrais "beuffeuriser" mon dessin quelque part.

    J'ai fait un proto en équipent mais primitive graphiques pour faire tout le layout sans faire de draw afin de calculer les pages. ça fonctionne plutôt bien, par contre je dessine pour chaque page l'ensemble du document, et je trouve ça un peu lourd.

    Il me faudrait presque générer un PDF puis envoyer ça dans la vue à  imprimer ... je vais creuser dans ce sens ...

    Cette parti de l'API est un peu "juste" et manque de simplicité :(
  • HerveHerve Membre
    14:31 modifié #4
    J'sais pas si ça peut t'aider :

    perso, mes "Custom views" dans IB sont associées à  une classe NSView (ou bien c'est c'est une box IBOutlet de mon NSWindowController). Puis une méthode comme cela marche très bien :

    - (IBAction) imprimeCesValeurs : (id) sender{<br />	NSPrintOperation *impression = [NSPrintOperation printOperationWithView:laPanoplie];<br />//laPanoplie est l&#039;IBOutlet customView, ici une Box<br />	[[impression printInfo] setLeftMargin:0.15];//par exemple, ce que tu veux comme mise en page ici.<br />	[[impression printInfo] setRightMargin:0.15];//idem<br />	<br />	[impression runOperation];//et c&#039;est parti!!<br />}
    


    Je ne crois pas que ce soit mauvais...
  • xpechxpech Membre
    14:31 modifié #5
    Merci Herve, j'avais pas penser le faire à  cette étape, même si ça ne change rien sur le fond.

    En fait j'était déjà  perturbé par le fait de ne pas pouvoir changer la view de la NSPrintOperation. Je voulais faire un système d'impression à  base de plugin à  choisir dans la vue accessoire, il va falloir réfléchir encore :-).

Connectez-vous ou Inscrivez-vous pour répondre.