keine Bilder auf MaxGui Buttons auf dem MAC?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Midimaster

Betreff: keine Bilder auf MaxGui Buttons auf dem MAC?

BeitragMi, Mai 25, 2011 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Windows-Version erhalte ich auf den Checkbuttons (als Taster dargestellt) Icons statt Texte. Auf dem MAC scheitert das. Geht das nicht, oder mache ich was falsch?
BlitzMax: [AUSKLAPPEN]
' createbutton.bmx

Import MaxGui.Drivers

Strict

Global window:TGadget = CreateWindow("MaxGUI Buttons",40,40,400,330,Null,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS)
Global Button:TGadget = CreateButton("123", 100, 100, 100,100, window, BUTTON_CHECKBOX|BUTTON_PUSH)
Global icon:TPixmap = LoadPixmap("test.png")
SetGadgetPixmap button, icon, GADGETPIXMAP_ICON|GADGETPIXMAP_NOTEXT
Print icon=Null
Repeat
Select WaitEvent()
Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
End
EndSelect
Forever
 

FWeinb

ehemals "ich"

BeitragMi, Mai 25, 2011 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Für solche Sachen, lohnt es sich in den Code des Cocoateils der MaxGui zu schauen:
Code: [AUSKLAPPEN]
void NSSetImage(nsgadget *gadget,NSImage *image,int flags){
   PanelView *panel;
   NSButton *button;
   NSMenuItem *menu;
   
   switch (gadget->internalclass){
   case GADGET_PANEL:
      panel=(PanelView*)gadget->handle;
      [panel setImage:image withFlags:flags];
      break;
   case GADGET_BUTTON:
      if ((flags & GADGETPIXMAP_ICON) && (gadget->style <= BUTTON_PUSH)){
         button=(NSButton *)gadget->handle;
         [button setImage:image];
         if (flags & GADGETPIXMAP_NOTEXT) {
            [button setImagePosition:NSImageOnly];
         } else {
            [button setImagePosition:NSImageLeft];
         }
      }
      break;
   case GADGET_MENUITEM:
      if (flags & GADGETPIXMAP_ICON){
         menu=(NSMenuItem*)gadget->handle;
         [menu setImage:image];
      }
      break;
   }
}


Dort kann man sehen, dass GADGET_BUTTON nur dann ein Bild bekommen, wenn es Maximal ein BUTTON_PUSH ist. Also reicht es das BUTTON_CHECKBOX aus dem Code zu streichen und es Funktioniert, natürlich ist es dann keine Checkbox mehr:

BlitzMax: [AUSKLAPPEN]
' createbutton.bmx

Import MaxGui.Drivers

Strict

Global window:TGadget = CreateWindow("MaxGUI Buttons",40,40,400,330,Null,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS)
Global Button:TGadget = CreateButton("123", 100, 100, 150,150, window, BUTTON_PUSH)
Global icon:TPixmap = LoadPixmap("Quadrate.png")
SetGadgetPixmap Button, icon, GADGETPIXMAP_ICON
'Print icon=Null
Repeat
Select WaitEvent()
Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
End
EndSelect
Forever



So sieht es dann aus:
user posted image

Hatte das "Quadratbild" gerade Griffbereit.


[EDIT]
Als fix könntest du den MaxGui Code anpassen (was sehr unschön ist) oder die NSSetImage Methode in einem eingenen Modul implementieren und dir eine eigene SetGadgetPixmap Funktion schreiben. Der Fix würde dann so aussehen:
Einfach das:
Code: [AUSKLAPPEN]
if ((flags & GADGETPIXMAP_ICON) && (gadget->style <= BUTTON_PUSH)){

mit dem hier:
Code: [AUSKLAPPEN]
if ((flags & GADGETPIXMAP_ICON) && (gadget->style <= (BUTTON_PUSH + BUTTON_CHECKBOX))){

ersetzen.

Midimaster

BeitragMi, Mai 25, 2011 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
ah, danke für diese Information. Bewunder! In die dahinterliegenden C-Routinen würde ich mich ja nie schauen trauen, geschweige denn dort was ändern....

Wie schätzt Du das ein? Ist das eher ein Bug oder gab es wahrscheinlich gute Gründe den Button als Checkbox nicht für Bilder freizugeben?

d-bug

BeitragMi, Mai 25, 2011 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Cocoa sind Checkboxes einfach nicht in der Lage Icons oder Bilder zu haben.
Wurde wohl von Apple nicht vorgesehen. Gilt übrigens auch für Radiobuttons.

Apple selbst treibt bei solchen Custom-Gadgets in ihren Programmen sehr viel Schindluder.
 

Macintosh

BeitragMi, Mai 25, 2011 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
In welchen programmen gibt es denn icons an checkboxen/radio buttons?
Man kann custom-views aber auch sehr sauber schreiben ;)

Midimaster

BeitragDo, Mai 26, 2011 2:06
Antworten mit Zitat
Benutzer-Profile anzeigen
@Macintosh:

für mein Notenschreib-Editor innerhalb meines aktuellen Projekt wäre es sehr ergonomisch, wenn der User die Auswahl-Optionen lieber über Icons als über Texte wahrnimmt. Sieh selbst:

so ist es viel verständlicher, wozu all die Buttons dienen sollen:
user posted image

und die untere Hälfte zeigt, wie es dann leider am MAC aussieht.

Klar kann man die Custom-Views selber schreiben, aber wozu hat man den eine GUI? Und wie meine anderen Beiträge heute zeigen ist die MaxGui da eben sehr schnell an Grenzen angekommen...(SetGadgetSensitivity()-Mangel bei den Combo-Boxen oder Tabber-Problem am MAC)

d-bug

BeitragDo, Mai 26, 2011 8:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha, ich dachte wir reden hier über Checkbox, also die Viecher mit den Haken vorne.
Das was du möchtest ist durchaus möglich. Allerdings hat BRL das nicht in MaxGUI vorgesehen.
Von ca. 20 verschiedenen Button-Arten die Cocoa bietet hat man nur einen Bruchteil in MaxGUI vorgesehen.
Da bleibt dir nur der Weg, den "Ich" beschrieben hat.
 

FWeinb

ehemals "ich"

BeitragDo, Mai 26, 2011 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal ein kleines Modul zusammengeschnürt was die Funktionen bereitstellt. >Hier<
Das ganze ist Undokumentiert.

Und so würde man es dann Benutzt:

BlitzMax: [AUSKLAPPEN]
' createbutton.bmx

Import MaxGui.Drivers
Import fab.cocoaext
Strict

Global window:TGadget = CreateWindow("MaxGUI Buttons",40,40,400,330,Null,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS)
Global Button:TGadget = CreateButton("123", 100, 100, 150,150, window, BUTTON_CHECKBOX|BUTTON_PUSH)
Global icon:TPixmap = LoadPixmap("Quadrate.png")

MACOS_SetGadgetPixmap Button, icon, GADGETPIXMAP_ICON|GADGETPIXMAP_NOTEXT
MACOS_setFocusRing(Button, NSFocusRingTypeNone)

'Print icon=Null
Repeat
Select WaitEvent()
Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
End
EndSelect
Forever


In dem Modul sind noch ein paar Funktionen mehr drin die sollten im Moment aber nicht stören.
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group