NS View anfänger Frage

  • Nun habe ich eine weitere Herausforderung.

    Ich denke nicht, dass 'NSColorWell' das richtige Element für einen Button ist, da es bereits eine eigene Funktionaltät hat und eng mit 'NSColorPanel' arbeitet.
    I would be embarrassed if they did not spy on me.
  • So richtig überzeugt mich die Funktionalität des NSColorWell auch nicht. Gibt es keine Möglichkeit, einen Button mit einem Icon zu nutzen und vielleicht das Icon über NSImage selbst zu generieren? Es muß ja immer nur einen Farbton annehmen, den ich aber frei bestimmen möchte.
  • Danke LongW. Der Link zu diesem anderen Thread war sehr hilfreich. Ich frage mich allerdings, ob es nicht vielleicht doch einen einfacheren Weg gibt. Wie weiter oben schon beschrieben, ist mein Interface im Prinzip zu großen Teilen schon gezeichnet. Bisher auch die später mit Buttonfunktionalität auszustattenden Farbquadrate. Ich hatte bereits versucht einen transparenten Button im IB darüber zu setzen, doch dann bekomme ich keinen Mauszeiger, der dem Benutzer anzeigt, daß es sich bei dem Quadrat um ein Interaktionselement handelt. Am liebsten wäre mir halt ein Weg, der einen viereckigen, klickbaren und somit auch mit entsprechendem Mauszeiger versehenen Bereich erzeugt, den ich einfach nur noch über die Farbquadrate setzen muß.

    Gibt es solch einen Weg?
  • Gibt es solch einen Weg?

    Was Du vorhast, wenn ich das richtig verstehe, ist ein Weg, mit dem Du die Tretminen der 'View'-Hierarchie vermeiden kannst.
    Das ist sicher die saubere Methode, aber leider auch wesentlich aufwendiger. Du musst alle 'mouse-events' selbst abarbeiten, etwa so:

    Quellcode

    1. - (void)mouseDown:(NSEvent *)theEvent {
    2. int eventMode;
    3. NSPoint curPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
    4. if((eventMode = [self handleRectUnderPoint: curPoint]) > 0)
    5. {
    6. // handle the eventmode
    7. }
    8. ....
    9. - (int) handleRectUnderPoint:(NSPoint)point {
    10. int ret = -1;
    11. NSEnumerator *enumerator = [handleRects objectEnumerator];
    12. // handleRects is an NSArray declared as instance variable, containing a bunch of NSValue with NSRect
    13. NSValue * value;
    14. while ((value = [enumerator nextObject])) {
    15. if (NSPointInRect(point, [value rectValue]))
    16. {//NSLog([value description]);
    17. ret = [handleRects indexOfObject:value];
    18. }
    19. }
    20. return (ret + 1);
    21. }
    Alles anzeigen


    Das 'handleRects' füllst Du während des Zeichnes mit den Farbrechtecken.
    I would be embarrassed if they did not spy on me.
  • @Gabriel:
    Nicht so aggresiv. Klar ist es beschrieben, wie ich einem Button ein Image, das ich ja selbst erstellen kann, verpasse. Dann habe ich aber noch keinen transparenten Button und schalte ich ihn transparent (weil ich das Aussehen des Buttons nicht benötige), so verliere ich das Verhalten des Mauszeigers.

    @longW:
    Wenn ich den Quelltext richtig verstehe, untersucht die Methode handleRectUnderPoint, ob sich ein bestimmter Punkt in dem zuvor deklarierten NSArray handleRects befindet. Aufgerufen wird die Methode bei einem Mouse-Down-Event (besser Mouse-Up :)). Richtig?

    So ungefähr hatte ich mir das übrigens vorgestellt. Wobei sich mir da noch die Frage stellt, ob denn der Mauszeiger beim Überfahren der sensitiven Rechtecke auch sein Aussehen verändert bzw. ob ich das dann auch noch programmieren muß.
  • Wie bereits beschrieben habe ich die Farbquadrate ja schon gezeichnet. Ich bräuchte vom Button also nur dessen Klick-Funktionalität in der Form, daß sich der Mauszeiger ändert beim Drüberfahren und ich das Event verarbeiten kann. Nicht mehr und nicht weniger ;)
  • Okay… Entschuldigung. Ich habe dein Beispiel-Projekt mal in Augenschein genommen und getestet. Die Interaktion wird bei dem Button über das temporäre »Niederdrücken« des Images beim Maustaste-Drücken visualisiert. Das ist perfekt so.

    Entweder ich setze im IB alle Buttons schon mal im Voraus und deaktiviere später im Programm die nicht benötigten (es gibt auch nicht vorkommende Werte) während ich allen anderen über deren NSMenuItem ein selbst erzeugtes Image zuweise oder ich erstelle auch die Buttons erst zur Laufzeit. Dabei bin ich aber gerade am Überlegen, wie ich diese Buttons dem CustonView quasi attachen kann.
  • Folgender Testcode:

    Quellcode

    1. NSImage* tempIcon = [[NSImage alloc] initWithSize:NSMakeSize(21, 21)];
    2. [tempIcon lockFocus];
    3. [[NSColor colorWithDeviceRed:1.0 green:0.0 blue:0.0 alpha:1.0] set];
    4. [[NSBezierPath bezierPathWithRect:NSMakeRect(0, 0, 21, 21)] fill];
    5. [tempIcon unlockFocus];
    6. NSButton* tempButton = [[NSButton alloc] initWithFrame:NSMakeRect(0, 0, 21, 21)];
    7. [tempButton setFrameOrigin:NSMakePoint(193, 61)];
    8. [[[tempButton menu] menuItem] setImage:tempIcon];
    9. [self addSubview:tempButton];
    10. [tempIcon release];
    11. [tempButton release];
    Alles anzeigen
    Bei dieser Variante erhalte ich eine Warnung, daß NSMenu eventuell nicht auf menuItem antwortet. Wie komme ich denn nun genau zu diesem NSMenuItem, dem ich dann das Image setze?
  • longW hat mir am 23.11.2007 13:04 den Link zu einem Thread gepostet, bei dem es über das NSMenuItem gemacht wird.

    Quellcode

    1. NSImage* tempIcon = [[NSImage alloc] initWithSize:NSMakeSize(21, 21)];
    2. [tempIcon lockFocus];
    3. [[NSColor colorWithDeviceRed:1.0 green:0.0 blue:0.0 alpha:1.0] set];
    4. [[NSBezierPath bezierPathWithRect:NSMakeRect(0, 0, 21, 21)] fill];
    5. [tempIcon unlockFocus];
    6. NSButton* tempButton = [[NSButton alloc] initWithFrame:NSMakeRect(0, 0, 21, 21)];
    7. [tempButton setFrameOrigin:NSMakePoint(193, 61)];
    8. [tempButton setBordered:NO];
    9. [tempButton setImage:tempIcon];
    10. [self addSubview:tempButton];
    11. [tempIcon release];
    12. [tempButton release];
    Alles anzeigen
    Damit ist die Warnung erstmal verschwunden. Allerdings fügt er den Button noch nicht dem CustonView hinzu. Es scheint also etwas mit Zeile 10 nicht zu stimmen.
  • ich weis net um was es im anderen thread ging. Ich glaube er hat dir den nur gezeigt weil man dort sieht wie man images erstellen kann. Logisch kann man die images auch in ein MenuItem packen aber du hast ja kein menu sondern einen Button. Wo bleibt der hausverstand? bisschen mitdenken wär oft leichter als immer nur im forum zu posten...
  • Ha doch :) Es fehlte eine Kleinigkeit:

    Quellcode

    1. [tempButton setImagePosition:NSImageOnly];
    Aber irgendwas ist ja immer. Denn nun sehe ich das Interaktionsverhalten, wie es dein Beispielprojekt zeigt, nicht mehr. Es pasiert einfach garnichts beim Klicken des Buttons.