entweder Canvas oder Menü

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Pebender

Betreff: entweder Canvas oder Menü

BeitragMi, Jul 06, 2011 7:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

da ich mir BMax zugelegt habe, und vorher in der BB+ Demo angefangen habe an einem Programm zuschreiben, wollte ich das in BMax importieren, leider ohne großen Erfolg.Habe mir auch die MaxGUI aufgespielt.
Da ich noch nicht weit war, dachte ich machst das ganze neu direkt in BMax.
Bin auch dabei das engl. Tuturial zu lesen.
Aber trotzdem hätte ich eine Frage, ist wahrscheinlich nix großes für euch, aber mich bringt es zum verzweifeln.
Habe ein Windows erstellt, zwei Canvases hineingepackt, und will eine Menüleiste machen.
Habe alles in Funktionen gepackt.
Nun habe ich das Problem das ich die Canvases nicht angezeigt bekommen, wenn ich die Menüleiste einbaue.
Wenn ich die Canvas entferne bekomme ich die Menüleiste angezeigt,heiß also:
entweder Canvas oder Menü, und ich weiß nicht worin der Fehler liegt.
Auch wenn ich am Anfang Superstrict schreibe, mault er hingegen bei den Konstanten.
Mit Strict allein funktioniert das.
Und nicht meckern, habe Teile des Codes aus den Tut´s per Copy & Paste eingefügt.
hier mal der Code:

Code: [AUSKLAPPEN]
Import MaxGUI.drivers
    
Strict

'Variabeln definieren

Global Canvas1:TGadget
Global Canvas2:TGadget
Global MyWindow:TGadget

'GADGET erstellen


'Hauptfenster und Haupt-Canvas
   CreateMainWindow(800,600)

'Funktionsaufruf Canvas erstellen
   CreateCanvases()
'Funktionsaufruf Menuleiste erstellen
   Menuleiste()

'Hauptblock

Repeat

  WaitEvent()
  Select EventID()
    Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
        End
       
      Case EVENT_GADGETPAINT
        Process_GadgetPaintEvent
       
  End Select
  'DisplayStatusText

Forever

End

'Funktion Canvases erstellen

Function CreateCanvases()

   Canvas1:TGadget=CreateCanvas(490, 20, 300, 300, MyWindow)
   Canvas2:TGadget=CreateCanvas(20, 20, 300, 300, MyWindow)

End Function


'Funktion Hauptfenster erstellen

Function CreateMainWindow:Int(WinWidth:Int,WinHeight:Int)

  Local Style:Int = WINDOW_TITLEBAR | WINDOW_MENU | WINDOW_STATUS | WINDOW_CLIENTCOORDS
  Local w:Int=(GadgetWidth(Desktop())-WinWidth)/2
  Local h:Int=(GadgetHeight(Desktop())-WinHeight)/2

MyWindow=CreateWindow("Visual Terrazzo",w,h,WinWidth,WinHeight,Null,style)


End Function

Function Menuleiste:Int()

Local filemenu:TGadget
Local editmenu:TGadget
Local helpmenu:TGadget

Const MENU_NEW=101
Const MENU_OPEN=102
Const MENU_SAVE=103
Const MENU_CLOSE=104
Const MENU_EXIT=105
Const MENU_CUT=106
Const MENU_COPY=107
Const MENU_PASTE=108
Const MENU_ABOUT=109


filemenu=CreateMenu("&File",0,WindowMenu(MyWindow))
 CreateMenu"&New",MENU_NEW,filemenu,KEY_N,MODIFIER_COMMAND
  CreateMenu"&Open",MENU_OPEN,filemenu,KEY_O,MODIFIER_COMMAND
   CreateMenu"&Close",MENU_CLOSE,filemenu,KEY_W,MODIFIER_COMMAND
    CreateMenu"",0,filemenu
   CreateMenu"&Save",MENU_SAVE,filemenu,KEY_S,MODIFIER_COMMAND
  CreateMenu"",0,filemenu
CreateMenu"E&xit",MENU_EXIT,filemenu,KEY_F4,MODIFIER_COMMAND

editmenu=CreateMenu("&Edit",0,WindowMenu(MyWindow))
  CreateMenu "Cu&t",MENU_CUT,editmenu,KEY_X,MODIFIER_COMMAND
   CreateMenu "&Copy",MENU_COPY,editmenu,KEY_C,MODIFIER_COMMAND
    CreateMenu "&Paste",MENU_PASTE,editmenu,KEY_V,MODIFIER_COMMAND

helpmenu=CreateMenu("&Help",0,WindowMenu(MyWindow))
CreateMenu "&About",MENU_ABOUT,helpmenu

UpdateWindowMenu MyWindow

While True
   WaitEvent
   Select EventID()
      Case EVENT_WINDOWCLOSE
         End
      Case EVENT_MENUACTION
         Select EventData()
            Case MENU_EXIT
               End
            Case MENU_ABOUT
               Notify "Was auch immer hier erscheint"
         End Select
   End Select
Wend
End Function

'Funktion EVENT_GADGETPAINT

Function Process_GadgetPaintEvent:Int()

    SetGraphics CanvasGraphics (Canvas1)
    SetGraphics CanvasGraphics (Canvas2)
    Cls
    Flip

End Function


mfg Peter
BMax & MaxGUI

Holzchopf

Meisterpacker

BeitragMi, Jul 06, 2011 8:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast in der Funktion, in der das Menü erstellt wird, eine zweite Hauptschleife drin. Das bringt natürlich nix, denn BMax wird die beiden Loops nicht parallel abarbeiten Wink Und weil die "Hauptschleife" in der Funktion Menuleiste den/das GADGETPAINT-Event nicht abfängt, bearbeitet und die Canvases zeichnet, siehst du einfach Nichts.

Ausserdem solltest du die Konstanten nicht innerhalb der Funktion definieren, sonst sind sie im Hauptprogramm "nicht sichtbar". Das Gemeckere bei SuperStrict kommt daher, weil dann bei jeder Deklaration ein Datentyp spezifiziert werden muss - also z.B. ":Int" (oder die Kurzschreibweise) bei Integervariablen angehängt werden muss. Einmal deklariert, ist es übrigens nicht mehr notwendig, die Typendeklaration weiterhin anzuhängen (siehe Funktion CreateCanvases).

BlitzMax: [AUSKLAPPEN]
SuperStrict

Import MaxGUI.drivers

' Konstanten ganz am Anfang oder in einem externen File definieren
Const MENU_NEW:Int = 101
Const MENU_OPEN:Int = 102
Const MENU_SAVE:Int = 103
Const MENU_CLOSE:Int = 104
Const MENU_EXIT:Int = 105
Const MENU_CUT:Int = 106
Const MENU_COPY:Int = 107
Const MENU_PASTE:Int = 108
Const MENU_ABOUT:Int = 109

'Variabeln definieren
Global Canvas1:TGadget
Global Canvas2:TGadget
Global MyWindow:TGadget

'GADGET erstellen


'Hauptfenster und Haupt-Canvas
CreateMainWindow(800,600)

'Funktionsaufruf Canvas erstellen
CreateCanvases()
'Funktionsaufruf Menuleiste erstellen
Menuleiste()

'Funktion Canvases erstellen
Function CreateCanvases()
Canvas1=CreateCanvas(490, 20, 300, 300, MyWindow)
Canvas2=CreateCanvas(20, 20, 300, 300, MyWindow)
End Function

'Funktion Hauptfenster erstellen
Function CreateMainWindow:Int(WinWidth:Int,WinHeight:Int)
Local Style:Int = WINDOW_TITLEBAR | WINDOW_MENU | WINDOW_STATUS | WINDOW_CLIENTCOORDS
Local w:Int=(GadgetWidth(Desktop())-WinWidth)/2
Local h:Int=(GadgetHeight(Desktop())-WinHeight)/2
MyWindow=CreateWindow("Visual Terrazzo",w,h,WinWidth,WinHeight,Null,style)
End Function

Function Menuleiste:Int()
Local filemenu:TGadget
Local editmenu:TGadget
Local helpmenu:TGadget

filemenu=CreateMenu("&File",0,WindowMenu(MyWindow))
CreateMenu"&New",MENU_NEW,filemenu,KEY_N,MODIFIER_COMMAND
CreateMenu"&Open",MENU_OPEN,filemenu,KEY_O,MODIFIER_COMMAND
CreateMenu"&Close",MENU_CLOSE,filemenu,KEY_W,MODIFIER_COMMAND
CreateMenu"",0,filemenu
CreateMenu"&Save",MENU_SAVE,filemenu,KEY_S,MODIFIER_COMMAND
CreateMenu"",0,filemenu
CreateMenu"E&xit",MENU_EXIT,filemenu,KEY_F4,MODIFIER_COMMAND

editmenu=CreateMenu("&Edit",0,WindowMenu(MyWindow))
CreateMenu "Cu&t",MENU_CUT,editmenu,KEY_X,MODIFIER_COMMAND
CreateMenu "&Copy",MENU_COPY,editmenu,KEY_C,MODIFIER_COMMAND
CreateMenu "&Paste",MENU_PASTE,editmenu,KEY_V,MODIFIER_COMMAND

helpmenu=CreateMenu("&Help",0,WindowMenu(MyWindow))
CreateMenu "&About",MENU_ABOUT,helpmenu

UpdateWindowMenu MyWindow
End Function

'Hauptblock
Repeat
WaitEvent()
Select EventID()
Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
End
Case EVENT_GADGETPAINT
Process_GadgetPaintEvent
Case EVENT_MENUACTION
Select EventData()
Case MENU_EXIT
End
Case MENU_ABOUT
Notify "Was auch immer hier erscheint"
End Select
End Select
'DisplayStatusText
Forever

End

'Funktion EVENT_GADGETPAINT

Function Process_GadgetPaintEvent:Int()
SetGraphics CanvasGraphics (Canvas1)
Cls
Flip
SetGraphics CanvasGraphics (Canvas2)
Cls
Flip
End Function


Gut, in der Tat nichts weltbewegendes Wink in der Hauptschleife (bei der BMax zuerst ankam) wurden die Canvase einfach nicht aktualisiert, deshalb sahst du diese auch nicht.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

jsp

BeitragMi, Jul 06, 2011 11:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Was mir noch so aufgefallen ist:
Wenn du den Style WINDOW_CENTER benutzt kannst du dir das sparen:
Local w:Int=(GadgetWidth(Desktop())-WinWidth)/2
Local h:Int=(GadgetHeight(Desktop())-WinHeight)/2

Der Event_GadgetPaint kommt per Canvas, d.h. man könnte je Canvas eine Update Routine schreiben und spezifisch auf das Ereignis reagieren.

Statt mit Constanten für das Menü zu arbeiten, kann man auch das erzeugte Menü Gadget selbst abfragen (in der Waitevent() Schleife), das ist sehr viel flexibler wenn man eine Änderung hat.
Logic Gui Professional a Gui Designer for MaxGui

Pebender

BeitragMi, Jul 06, 2011 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank ihr beiden ,

wenn man das so im nachhinein liest, ist das ja logisch.
Hätte man selber drauf kommen können Very Happy .


mfg Peter
BMax & MaxGUI

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group