définir la couleur de fond d'une NSView

bofybofy Membre
15:38 modifié dans API AppKit #1
Bonjour

Existe-t-il une façon simple de définir la couleur de fond d'une NSView, notamment la contentView d'une fenêtre, sans passer par une usine à  gaz ?

Une sorte d'équivalent de "setBackgroundColor".

Sans IB évidemment (mais je n'ai même pas réussi avec IB).

Merci

Réponses

  • schlumschlum Membre
    15:38 modifié #2
    dans 1214918357:

    Bonjour

    Existe-t-il une façon simple de définir la couleur de fond d'une NSView, notamment la contentView d'une fenêtre, sans passer par une usine à  gaz ?

    Une sorte d'équivalent de "setBackgroundColor".

    Sans IB évidemment (mais je n'ai même pas réussi avec IB).

    Merci


    Je ne crois pas...
    La méthode la plus simple que je connaisse c'est de sous-classer la contentView et de définir le drawRect en dessinant un rectangle plein.
  • NoNo Membre
    15:38 modifié #3
    dans 1214918357:

    [...]notamment la contentView d'une fenêtre, sans passer par une usine à  gaz ?
    Une sorte d'équivalent de "setBackgroundColor".


    Justement, setBackgroundColor: de NSWindow permet de colorer le fond de sa contentView.

    Pour le reste, suffit de sous-classer NSView, de lui ajouter un getter genre setBackgroundColor: sur une variable d'instance de type NSColor, et d'écrire un drawRect: minimal :
    <br />- (void)drawRect:(NSRect)aRect<br />{<br />&nbsp; &nbsp; [couleurNSView set];<br />&nbsp; &nbsp; NSRectFill(aRect);<br />}
    

    où couleurNSView est le nom de la variable d'instance stockant la couleur de fond.
    Cette nouvelle sous-classe pourra ensuite être utilisée plusieurs fois dans ton projet, chaque instance ayant sa propre couleur.
  • Philippe49Philippe49 Membre
    15:38 modifié #4
    dans 1214923824:

    Justement, setBackgroundColor: de NSWindow permet de colorer le fond de sa contentView.

    et  [myWindow setOpaque:NO] permet de jouer sur le champ de l'opacité dans le choix de la couleur de la fenêtre.
  • Philippe49Philippe49 Membre
    15:38 modifié #5
    D'autre part de multiples sous-classes de NSView possèdent la méthode setBackgroundColor. (Il suffit de lancer une recherche sur setBackgroundColor dans la doc).
  • bofybofy Membre
    15:38 modifié #6
    Quelles sous-classes, svp ?
    Quelle doc, svp ? Il y a des milliers de docs Apple...

    dans 1214928972:

    D'autre part de multiples sous-classes de NSView possèdent la méthode setBackgroundColor. (Il suffit de lancer une recherche sur setBackgroundColor dans la doc).

    :o
  • bofybofy Membre
    15:38 modifié #7
    La méthode setBackgroundColor permet de colorer la Window, y compris la contentView, mais pas la contentView spécifiquement, non ?

    dans 1214928342:

    dans 1214923824:

    Justement, setBackgroundColor: de NSWindow permet de colorer le fond de sa contentView.

    et  [myWindow setOpaque:NO] permet de jouer sur le champ de l'opacité dans le choix de la couleur de la fenêtre.
  • NoNo Membre
    15:38 modifié #8
    dans 1215002082:

    La méthode setBackgroundColor permet de colorer la Window, y compris la contentView, mais pas la contentView spécifiquement, non ?


    Une fenêtre (window) c'est une content view + une barre de titre + éventuellement une barre d'outil.
    setBackgroundColor: de NSWindow ne colore que la partie content view.
    Je ne sais plus si le fond de la barre d'outil est affecté car ya  maintenant un réglage (unified style) qui permet de mettre la barre en continuité avec le titre.
  • Philippe49Philippe49 Membre
    15:38 modifié #9
    dans 1215001802:

    Quelles sous-classes, svp ?
    Quelle doc, svp ? Il y a des milliers de docs Apple...

    dans 1214928972:

    D'autre part de multiples sous-classes de NSView possèdent la méthode setBackgroundColor. (Il suffit de lancer une recherche sur setBackgroundColor dans la doc).

    :o


    Ouvre XCode
    Choisir l'option de menu Help > Documentation
    Dans la zone de recherche, tu tapes setBackgroundColor et le réglage ainsi :

  • bofybofy Membre
    15:38 modifié #10
    Oulala !

    Erreur.
    setBackgroundColor: de NSWindow  colore TOUTE la window, pas seulement la contentView. Et c'est mon problème.

    dans 1215004541:

    dans 1215002082:

    La méthode setBackgroundColor permet de colorer la Window, y compris la contentView, mais pas la contentView spécifiquement, non ?


    Une fenêtre (window) c'est une content view + une barre de titre + éventuellement une barre d'outil.
    setBackgroundColor: de NSWindow ne colore que la partie content view.
    Je ne sais plus si le fond de la barre d'outil est affecté car ya  maintenant un réglage (unified style) qui permet de mettre la barre en continuité avec le titre.
  • bofybofy Membre
    15:38 modifié #11
    Depuis que j'interviens, malheureusement pour vous, sur ce forum, j'utilise xcode.
    Mais dans le menu help je n'ai qu'une recherche google.
    Dois-je réinstaller xcode avec un paramètre particulier ?

    dans 1215005127:

    dans 1215001802:

    Quelles sous-classes, svp ?
    Quelle doc, svp ? Il y a des milliers de docs Apple...

    dans 1214928972:

    D'autre part de multiples sous-classes de NSView possèdent la méthode setBackgroundColor. (Il suffit de lancer une recherche sur setBackgroundColor dans la doc).

    :o


    Ouvre XCode
    Choisir l'option de menu Help > Documentation
    Dans la zone de recherche, tu tapes setBackgroundColor et le réglage ainsi :


  • schlumschlum Membre
    15:38 modifié #12
    Installe plutôt AppKiDo...  ;)
  • NoNo Membre
    15:38 modifié #13
    dans 1215006856:

    Erreur.
    setBackgroundColor: de NSWindow  colore TOUTE la window, pas seulement la contentView. Et c'est mon problème.


    Je n'ai pas ce comportement sous 10.4 : la barre de titre reste grise.

    Bon pour être sur de ton coup, crée une petite sous classe de NSView, nommons là  BOFYBackGroundView comme indiqué plus haut. Ca te prendra 3 secondes à  coder cette classe.
  • NoNo Membre
    15:38 modifié #14
    dans 1215007100:

    Depuis que j'interviens, malheureusement pour vous, sur ce forum, j'utilise xcode.
    Mais dans le menu help je n'ai qu'une recherche google.
    Dois-je réinstaller xcode avec un paramètre particulier ?


    Dans un message précédent, tu parlais de problème avec NSLog qui ne s'affichait pas immédiatement dans la console Xcode.
    Maintenant, c'est le menu Help qui semble incomplet.

    Oui, je crois que le mieux est de désinstaller ta version Xcode (ya un outil pour ça), puis de la réinstaller proprement.
  • Philippe49Philippe49 Membre
    juillet 2008 modifié #15
    dans 1215008935:

    Oui, je crois que le mieux est de désinstaller ta version Xcode (ya un outil pour ça), puis de la réinstaller proprement.


    Certainement, parce que faire du Cocoa sans la documentation, c'est conduire sa voiture sans le volant ...


    dans 1215008133:

    dans 1215006856:

    Erreur.
    setBackgroundColor: de NSWindow  colore TOUTE la window, pas seulement la contentView. Et c'est mon problème.

    Je n'ai pas ce comportement sous 10.4 : la barre de titre reste grise.


    Cela dépend si "textured" est cochée ou non .






  • bofybofy Membre
    15:38 modifié #16
    [résolu pour moi]

    Merci à  tous.

    La clé est ce que tu dis
        - sous-classer NSView, ce qui est indiqué dans la doc (mais oui, philippe49, je passe des heures à  consulter la doc, quoi que tu en penses, et c'est quand je ne trouve vraiment rien que je poste) et qui est  facile.
        - créer une méthode drawRect, avec ce qu'il faut dedans : le truc est que drawRect est invoqué automatiquement et ne fait rien, c'est suggéré dans la doc mais pas très clairement, ni surtout l'obligation de fait de créer son propre drawRect.

    Enfin j'ai trouvé un exemple de code dans Hillegrass (p.200), correspondant à  ça. C'est d'ailleurs la première fois que je trouve dans ce livre quelque chose d'utile qui ne soit pas un bête mode d'emploi de IB pour une et une seule application...


    Je ne crois pas...
    La méthode la plus simple que je connaisse c'est de sous-classer la contentView et de définir le drawRect en dessinant un rectangle plein.


    Si ça peut intéresser certains, voici le code, assez tordu je trouve, mais qui peut sans doute être simplifié et n'est peut être pas très robuste. Mais bon il marche.
    <br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface BGColorView : NSView {<br />	NSColor&nbsp; * bgColor;<br />	}<br />-(void)setBgColor:(NSColor *) c;<br />-(NSColor *)bgColor;<br />@end<br /><br />@implementation BGColorView<br />-(id)initWithFrame: (NSRect)rect color: (NSColor *) col{<br />	self = [super initWithFrame:rect];<br />	[self setBgColor:col];<br />	return self;<br />	}<br />-(void)setBgColor:(NSColor *) c {<br />	[c retain];<br />	[bgColor release];<br />	bgColor = c;<br />	[self setNeedsDisplay:YES];<br />	}<br />-(NSColor *)bgColor {<br />	return bgColor;<br />	}<br />-(void)drawRect:(NSRect)rect { // méthode appelée par défaut par setNeedsDisplay ?<br />	NSRect bounds = [self bounds];<br />	[bgColor set];<br />	[NSBezierPath fillRect:bounds];<br />	[[NSColor blackColor] set];<br />	[NSBezierPath strokeRect:bounds];<br />	}<br />@end<br /><br />int main(int argc, char *argv&#91;])<br />{<br />//	NSLog(@&quot;========&gt;&quot;); // pour repère dans console<br />	NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; // sinon des tas de messages dans la console...<br />	[NSApplication sharedApplication]; // création de l&#39;instance NSApp<br />//--------<br />	NSRect frameWindow=NSMakeRect(10.,50.+20.,600.,200.);<br />	NSWindow * testWin;<br />	testWin = [[NSWindow alloc] initWithContentRect:frameWindow &#092;<br />		styleMask: &#092;<br />			NSTexturedBackgroundWindowMask | &#092;<br />			NSTitledWindowMask | &#092;<br />			NSClosableWindowMask | &#092;<br />			NSMiniaturizableWindowMask | &#092;<br />			NSMiniaturizableWindowMask | &#092;<br />			NSResizableWindowMask &#092;<br />		backing:NSBackingStoreBuffered &#092;<br />&nbsp; &nbsp; &nbsp; &nbsp; defer:NO &#092;<br />		screen:[NSScreen mainScreen]];<br />&nbsp; &nbsp; [testWin setBackgroundColor:[NSColor windowFrameColor]];&nbsp; // pm : windowFrameColor pour la fenêtre entière<br />	[testWin setTitle:[NSString stringWithFormat:@&quot;Test Window&quot;]];<br />//--------<br />	NSRect rect = [[testWin contentView] frame];<br />	BGColorView * testView = [[BGColorView alloc] initWithFrame:rect &#092;<br />		color:[NSColor windowBackgroundColor]];&nbsp;  // pm : windowBackgroudColor pour la contentView<br />	[[testWin contentView] addSubview:testView];<br />//--------<br />&nbsp; &nbsp; NSButton * test=[[NSButton alloc] initWithFrame:NSMakeRect(20.,20.,100.,20.)];<br />	[test setAttributedTitle:@&quot;test ?&quot;];<br />	[test setBezelStyle:NSRoundRectBezelStyle];<br />&nbsp; &nbsp; [[testWin contentView] addSubview:test];<br />//--------<br />&nbsp; &nbsp; [testWin makeKeyAndOrderFront:NSApp];<br />//--------<br />	[NSApp run];<br />	[pool release]; // libération du pool<br />	return 0;<br />}<br />
    
  • Philippe49Philippe49 Membre
    15:38 modifié #17
    dans 1215181678:

    philippe49, je passe des heures à  consulter la doc, quoi que tu en penses, et c'est quand je ne trouve vraiment rien que je poste

    Moi je pense rien sur les gens qui postent ... d'ailleurs, je suis en vacances !
    Je voulais simplement dire que les frameworks Apple (dont Cocoa) sont extrêmement riches, souvent d'utilisations très simples, mais puisqu'il faut toujours payer d'une manière ou d'une autre, c'est sans doute dans l'aspect prise d'information, notamment dans la documentation, qu'il faut se forger un savoir-faire. En tout cas, c'est mon expérience.   
Connectez-vous ou Inscrivez-vous pour répondre.