IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> modifier une NSImage
Options
romainB
posté 10 May 2004, 09:56
Message #1


Adepte de Macbidouille
*

Groupe : Membres
Messages : 112
Inscrit : 22 Dec 2003
Membre no 12 727



Bonjour forum,

Dans une sous classe de NSCell, j' utilise des images issues d' un fichier .tiff.
A l'initialisation, je souhaite faire une transformation sur ces images. Donc j'utilise le code suivant pour copier image2 sur image1 et image4 sur image3 :
CODE
- (id)init{
 
 image1 = [NSImage imageNamed: @"image1"];
 image2 = [NSImage imageNamed: @"image2"];

 image3 = [NSImage imageNamed: @"image3"];
 image4 = [NSImage imageNamed: @"image4"];

 [ image1 lockFocus];
 [ image2 compositeToPoint:NSZeroPoint operation: NSCompositeCopy];
 [ image1 unlockFocus];
 
 [ image3 lockFocus];
 [ image4 compositeToPoint:NSZeroPoint operation: NSCompositeCopy];
 [ image3 unlockFocus];

return self;
}


Pour dessiner les cellules, il y a la méthode suivante:
- (void)drawInteriorWithFrame:(NSRect)frame inView:(NSView *)controlView

Problème: quand j'utilise image1 comme image de la cellule, le résultat est une image1 avec desus image2 ET image4.

D'ou vient ce problème ? du choix de la méthode init ? du code pour modifier l' image ? autre ?

Merci.Romain.

Ce message a été modifié par romainB - 10 May 2004, 11:21.
Go to the top of the page
 
+Quote Post
chombier
posté 10 May 2004, 10:45
Message #2


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 580
Inscrit : 20 Mar 2003
Membre no 6 765



Peut-être parceque tu verrouilles le focus sur image1, mais déverrouilles sur image2 ?


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
romainB
posté 10 May 2004, 10:53
Message #3


Adepte de Macbidouille
*

Groupe : Membres
Messages : 112
Inscrit : 22 Dec 2003
Membre no 12 727



c' est une coquille, le problème ne vient pas de là. Mais merci, j'ai corrigé.
Go to the top of the page
 
+Quote Post
Bru
posté 10 May 2004, 12:56
Message #4


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 516
Inscrit : 7 Oct 2001
Membre no 962



Je suppose que la méthode init est celle de ta sous classe NSCell ?

Dans ce cas (à moins de l'avoir fait), n'oublie pas de "retain" tes images (car imageNamed retourne un object en autorelease).

Peux tu aussi nous fournir le code de la méthode drawInteriorWithFrame:inView: ? afin de voir ce qui s'y passe...

.
Go to the top of the page
 
+Quote Post
romainB
posté 10 May 2004, 15:07
Message #5


Adepte de Macbidouille
*

Groupe : Membres
Messages : 112
Inscrit : 22 Dec 2003
Membre no 12 727



La méthode init est celle de NSImageCell.

Ce que j' essaie de faire, c'est une sous-classe de NSMatrix pour avoir une matrix qui ressemble à la barre des TabView dans Panther mais sans les tabs.
Il y a ce genre de controle dans iCal ou iPhoto.

Voilà les sous classes de NSMatrix et NSImageCell.
L' idée c'est que la NSImageCell dessine l' image de fond en redimentionnant une image centrale ("normal-fill") et ensuite ajoute les bords droits ou gauche sur l'image en fonction de la position dans la matrix.
Dans le code, j'ai viré -(id)init pour simplifier mais il faudrait le rajouter.
Le problème est donc que toutes les cellules de la matrix sont dessinées avec les bords droits ET gauche. Ca vient peut-être de la condition pour repérer la cellule dans la matrix, ou alors de l'image qui garde en cache les modifs ... Je patauge car difficile à déboguer.

Si vous voulez recréer le projet, c'est facile, il suffit de sous classer une custom view dans IB en MyMatrix et d'ajouter MyMatrix.m et MyMatrix.h à xcode. Les 3 images proviennent des ressources de iCal et ont le même nom de fichier.

CODE
#import "MyMatrix.h"
#define  NbColumns (int)3

@implementation MyImageCell

- (void)drawInteriorWithFrame:(NSRect)theFrame inView:(NSView *)theView
{
 NSLog(@"drawWithFrame:" );
 NSImage *theImage;
 NSImage *capImage;
 NSPoint point;
 
 // "normal-fill.tiff" est l'image centrale
 theImage = [NSImage imageNamed: @"normal-fill"];
 [theImage setScalesWhenResized:YES];
 [theImage setSize:theFrame.size ];
 
 // DEBUT Ajouter les bords droit ou gauche à l'image

 if ([(MyMatrix*)theView cellAtRow:0 column:0] == self )
  {
 NSLog(@"first column" );
 capImage = [NSImage imageNamed: @"normal-cap-left"];  
 point = NSZeroPoint;
  }
 else if ([(MyMatrix*)theView cellAtRow:0 column: NbColumns-1] == self )
  {
 NSLog(@"third column" );
 capImage = [NSImage imageNamed: @"normal-cap-right"];
 int capImageWidth = [capImage size].width;
 point = NSMakePoint((int)theFrame.size.width - capImageWidth,0);
  }
 
   [ theImage lockFocus];
 [ capImage compositeToPoint: point  operation: NSCompositeCopy];
 [ theImage unlockFocus];  
   // FIN Ajouter les bords droit ou gauche à l'image
 
 [ self setImage:theImage];
 [ super drawInteriorWithFrame:theFrame inView:theView];
}

@end

@implementation MyMatrix

- (id)initWithFrame:(NSRect)frameRect
{
   
 id cell = [[MyImageCell alloc] init]; // create the cell prototype and style it

 [cell setImageAlignment:NSImageAlignCenter];
 [cell setImageFrameStyle:NSImageFrameNone];
 [cell setEnabled:YES];
 
   // create the actual matrix of buttons
 [super initWithFrame:frameRect
     mode:NSListModeMatrix
    prototype:cell
   numberOfRows:1
  numberOfColumns:NbColumns];
 
 [self setDrawsBackground:YES];

   // configure the size and spacing of buttons
   // use the width of the superview (the scroller)
 [cell release];
 [self setCellSize:NSMakeSize((int)frameRect.size.width /NbColumns ,23)];
 [self setIntercellSpacing:NSMakeSize(1,0)];  

 return self;
 }
@end
Go to the top of the page
 
+Quote Post
reversi
posté 10 May 2004, 22:17
Message #6


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 933
Inscrit : 2 Jun 2002
Lieu : France
Membre no 2 604



QUOTE (romainB @ 10 May 2004, 15:07)
La méthode init est celle de NSImageCell.

Ce que j' essaie de faire, c'est une sous-classe de NSMatrix pour avoir une matrix qui ressemble à la barre des TabView dans Panther mais sans les tabs.
Il y a ce genre de controle dans iCal ou iPhoto.

J'ai déjà codé ce genre de truc et en fait c'est NSButtonCell que j'ai dérivé de mon côté. Je me servais des alignements de texte et image pour savoir à quelle type de cellule j'avais affaire.

Si tu ne cherches qu'à être compatible Panther, il y a maintenant une classe de base qui permet d'avoir ce contrôle.
Go to the top of the page
 
+Quote Post
romainB
posté 11 May 2004, 09:18
Message #7


Adepte de Macbidouille
*

Groupe : Membres
Messages : 112
Inscrit : 22 Dec 2003
Membre no 12 727



Je viens de découvrir la classe dont tu parles, c'est exactement ce que je cherchais. Pour ceux que ça interresse, ça s'appelle NSSegmentedControl (10.3 only) et c'est bien caché dans la doc (rien dans l'interface de IB).
Je vais utiliser plutot ce truc même si j' aimerais bien savoir d'où vient le problème avec les images qui se superposent dans le code au dessus.

Autre question pour aller plus loin: ce controle (NSSegmentedControl) permet d' avoir une apparence à la iCal (le bouton semaine/mois/année) mais pas tout à fait. En effet, dans iCal il y a des flèches sur les cotés qui permettent d' incrémenter une valeur. On peut reproduire ce fonctionnement en connectant une action au controle et en examinant la position du segment sélectionné.
La seule différence, c'est que le segment se sélectionne alors que dans iCal il est du type MomentaryLight. J' ai essayé de sous-classer NSSegmentedCell pour changer le type de cellule à l'initialisation mais je ne trouve pas la méthode adaptée.
Si quelqu'un a déjà utilisé NSSegmentedCell et sait comment ça marche, je suis preneur.

A+ . Romain.
Go to the top of the page
 
+Quote Post
Biohazard
posté 12 May 2004, 10:17
Message #8


Adepte de Macbidouille
*

Groupe : Membres
Messages : 52
Inscrit : 31 Jul 2001
Lieu : Metz
Membre no 577



QUOTE (romainB @ 11 May 2004, 08:18)
Je viens de découvrir la classe dont tu parles, c'est exactement ce que je cherchais. Pour ceux que ça interresse, ça s'appelle NSSegmentedControl (10.3 only) et c'est bien caché dans la doc (rien dans l'interface de IB).
Je vais utiliser plutot ce truc même si j' aimerais bien savoir d'où vient le problème avec les images qui se superposent dans le code au dessus.

Autre question pour aller plus loin: ce controle (NSSegmentedControl) permet d' avoir une apparence à la iCal (le bouton semaine/mois/année) mais pas tout à fait. En effet, dans iCal il y a des flèches sur les cotés qui permettent d' incrémenter une valeur. On peut reproduire ce fonctionnement en connectant une action au controle et en examinant la position du segment sélectionné.
La seule différence, c'est que le segment se sélectionne alors que dans iCal il est du type MomentaryLight. J' ai essayé de sous-classer NSSegmentedCell pour changer le type de cellule à l'initialisation mais je ne trouve pas la méthode adaptée.
Si quelqu'un a déjà utilisé NSSegmentedCell et sait comment ça marche, je suis preneur.

A+ . Romain.

Voilà la doc elle est assez explicite :

Using Segmented Control

En fait la majorité des options de configuration sont implémentées dans le NSSegmentedCell.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 26th April 2024 - 21:09