Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 04-02-2003, 18:59   #1 (permalink)
www.penck.de
 
Benutzerbild von borisp
 
Registriert seit: Jan 2002
Ort: Wiesbaden / Mainz-Kastel
Beiträge: 926
Cool OOP: Windows XP Style Menu-Bar

Sodele, da ich mich auch des öfteren hier im Forum "inspiriere", hier mal ei richtig feines Schmankerl als Tribut an das Flashforum.

Die Windows XP Menus komplett in Actionscript zusammengebastelt und leicht erstellbar als Objekt getarnt

Guggst Du hier

Holst Du da


Ok, noch nicht ganz fertig, aber erst mal ein Waypoint. (Submenus müssen halt noch rein.)

Ein kleiner Bug: Ich musste für die menupunkte erst mal hittest() nehmen, da ein verschachteltes mc.onRelease irgendwie nicht geht - wenn es jemand zufällig rausbekommt - bitte ich doch alle dran teilhaben zu können.

Hier erst mal der Code für die Basis:
ActionScript:
  1. Object.prototype.Toolbar = function() {
  2.    
  3.     T_CONTAINER     = _root.createEmptyMovieClip("MXToolbarContainer",1);
  4.     T_BACKGROUND    = T_CONTAINER.createEmptyMovieClip("MXToolbarBackground",1);
  5.    
  6.     with(T_BACKGROUND) {
  7.         clear();
  8.             moveTo(0,0);
  9.             beginFill(0xDEDED6,100);
  10.            
  11.                 lineStyle(1,0x888888,100);
  12.                 lineTo(Stage.width+4, 0);
  13.                 lineTo(Stage.width+4, 20);
  14.                 lineTo(0, 20);
  15.                 lineTo(0,0);
  16.            
  17.             endFill;
  18.     }
  19.  
  20.     T_CONTAINER.T_MENUITEMS = new Array();
  21.  
  22.     this.buttons = 0;   
  23. }
  24. Toolbar.prototype.addMenuFolder = function(Caption) {
  25.  
  26.     T_CONTAINER.T_MENUITEMS[Caption] = new Array();
  27.  
  28.     T_TEXTFORMAT = new TextFormat();
  29.     T_TEXTFORMAT.font = "Tahoma";
  30.     T_TEXTFORMAT.size = 11;
  31.    
  32.     T_TEXT_DIMENSION = T_TEXTFORMAT.getTextExtent(Caption);
  33.     T_TEXT_WIDTH = T_TEXT_DIMENSION.width+10;
  34.    
  35.     T_BUTTON = T_CONTAINER.createEmptyMovieClip("MXToolbarMenuButton"+this.buttons,this.buttons+2);
  36.    
  37.     T_BUTTON.Caption = Caption;
  38.    
  39.     T_BUTTON.onRelease = function() {
  40.  
  41.         if(T_CONTAINER.overme[0] != undefined) {
  42.             _root[T_CONTAINER.overme[2][2]](T_CONTAINER.overme[2][3]);
  43.         }
  44.  
  45.         this.T_MENUCONTENT = T_CONTAINER.T_MENUITEMS[this.Caption];
  46.  
  47.         if(this.T_MENUCONTENT.length != 0) {
  48.  
  49.             this.clear();
  50.             if(len == undefined) {
  51.             len = this._width;
  52.             }
  53.             hei = (this.T_MENUCONTENT.length)*20;
  54.  
  55.  
  56.             /* Jetzt die Schatten */
  57.             this.moveTo(len+6,6);
  58.             this.beginFill(0x000000,30);
  59.                 this.lineStyle(0,0xDBD7D1,0);
  60.                 this.lineTo(len+9,6);
  61.                 this.lineTo(len+9,18);
  62.                 this.lineTo(len+6,18);
  63.                 this.lineTo(len+6,6);
  64.             this.endFill();
  65.  
  66.             this.moveTo(len+151,25);
  67.             this.beginFill(0x000000,30);
  68.                 this.lineStyle(0,0x000000,0);
  69.                 this.lineTo(len+154,25);
  70.                 this.lineTo(len+154,hei+20);
  71.                 this.lineTo(len+151,hei+20);
  72.                 this.lineTo(len+151,25);
  73.             this.endFill();
  74.    
  75.             this.moveTo(7,hei+19);
  76.             this.beginFill(0x000000,30);
  77.                 this.lineStyle(0,0x000000,0);
  78.                 this.lineTo(len+154,hei+19);
  79.                 this.lineTo(len+154,hei+22);
  80.                 this.lineTo(7,hei+22);
  81.                 this.lineTo(7,hei+20);
  82.             this.endFill();
  83.  
  84.             /* Rahmen */
  85.             this.moveTo(2,2);
  86.             this.beginFill(0xDBD7D1,100);
  87.                 this.lineStyle(1,0x888888,100);
  88.                 this.lineTo(len+5,2);
  89.                 this.lineStyle(1,0x888888,100);
  90.                 this.lineTo(len+5,18);
  91.                 this.lineStyle(1,0xFFFFFF,100);
  92.                 this.lineTo(2,18);
  93.                 this.lineStyle(1,0x888888,100);
  94.                 this.lineTo(2,2);
  95.             this.endFill();
  96.  
  97.             this.moveTo(3,18);
  98.             this.beginFill(0xF8F8F7,100);
  99.                 this.lineStyle(1,0xFFFFFF,100);
  100.                 this.lineTo(len+5,18);
  101.                 this.lineStyle(1,0x888888,100);
  102.                 this.lineTo(len+150,18);       
  103.                 this.lineTo(len+150,hei+18);       
  104.                 this.lineTo(2,hei+18);   
  105.                 this.lineTo(2,18);   
  106.             this.endFill();
  107.            
  108.             this.moveTo(3,19);
  109.             this.beginFill(0xDBD7D1,100);
  110.                 this.lineStyle(0,0x888888,0);
  111.                 this.lineTo(23,19);
  112.                 this.lineTo(23,hei+18);
  113.                 this.lineTo(3,hei+18);
  114.             this.endFill();
  115.            
  116.             this.lineStyle(0,0x888888,0);
  117.  
  118.  
  119.             for(this.T_ITEMCOUNT = 0; this.T_ITEMCOUNT <= this.T_MENUCONTENT.length-1; this.T_ITEMCOUNT++) {
  120.  
  121.                 this.T_TEXTFORMAT2 = new TextFormat();
  122.                 this.T_TEXTFORMAT2.font = "Tahoma";
  123.                 this.T_TEXTFORMAT2.size = 11;
  124.    
  125.                 this.T_TEXT_DIMENSION2 = this.T_TEXTFORMAT2.getTextExtent(this.T_MENUCONTENT[this.T_ITEMCOUNT][0]);
  126.                 this.T_TEXT_WIDTH2 = this.T_TEXT_DIMENSION2.width+10;
  127.  
  128.                 this.T_TMPBUTTONNAME = "Menuitem"+this.T_ITEMCOUNT;
  129.                 this.T_TMPBUTTONTEXTID = "Text"+this.T_TMPBUTTONNAME;
  130.                 this.T_TMPBUTTON = this.createEmptyMovieClip(this.T_TMPBUTTONNAME,1000+this.T_ITEMCOUNT);
  131.                
  132.                 this.T_TMPBUTTON._x = 2;
  133.                 this.T_TMPBUTTON._y = 20+(this.T_ITEMCOUNT*19);
  134.  
  135.                 this.T_TMPBUTTON.createTextField(this.T_TMPBUTTONTEXTID,100+this.T_ITEMCOUNT,25,2,this.T_TEXT_WIDTH2,20);
  136.                 this.T_TMPBUTTON[this.T_TMPBUTTONTEXTID].text = this.T_MENUCONTENT[this.T_ITEMCOUNT][0];
  137.                 this.T_TMPBUTTON[this.T_TMPBUTTONTEXTID].border = false;
  138.                 this.T_TMPBUTTON[this.T_TMPBUTTONTEXTID].selectable = false;
  139.                 this.T_TMPBUTTON[this.T_TMPBUTTONTEXTID].setTextFormat(T_TEXTFORMAT);
  140.  
  141.                 this.T_TMPBUTTON.doAction = this.T_MENUCONTENT[this.T_ITEMCOUNT];
  142.  
  143.                 with(this.T_TMPBUTTON) {
  144.                     clear();
  145.                     beginFill(0xB5BDD6,0);
  146.                         lineStyle(0,0x08216B,0);
  147.                         moveTo(2,2);
  148.                         lineTo(145+len,2);
  149.                         lineTo(145+len,19);
  150.                         lineTo(2,19);
  151.                     endFill();
  152.                 }
  153.  
  154.                 this.T_TMPBUTTON.onEnterFrame = function() {
  155.                     if(this.hitTest(_xmouse,_ymouse)) {
  156.                             this.clear();
  157.                             this.beginFill(0xB5BDD6,100);
  158.                                 this.lineStyle(1,0x08216B,100);
  159.                                 this.moveTo(2,2);
  160.                                 this.lineTo(145+len,2);
  161.                                 this.lineTo(145+len,19);
  162.                                 this.lineTo(2,19);
  163.                             this.endFill();
  164.                             T_CONTAINER.overme = this.doAction;
  165.                     } else {
  166.                         this.clear();
  167.                         this.beginFill(0xB5BDD6,0);
  168.                             this.lineStyle(0,0x08216B,0);
  169.                             this.moveTo(2,2);
  170.                             this.lineTo(145+len,2);
  171.                             this.lineTo(145+len,19);
  172.                             this.lineTo(2,19);
  173.                         this.endFill();
  174.                     }
  175.                 }
  176.             }
  177.         }
  178.     }
  179.  
  180.     T_BUTTON.onRollOver = function() {
  181.  
  182.         len = this._width;
  183.  
  184.         this.moveTo(1,1);
  185.         this.lineStyle(1,0xFFFFFF,100);
  186.         this.lineTo(len+5,1);
  187.         this.lineStyle(1,0x444444,100);
  188.         this.lineTo(len+5,19);
  189.         this.lineTo(1,19);
  190.         this.lineStyle(1,0xFFFFFF,100);
  191.         this.lineTo(1,1);
  192.     }
  193.     T_BUTTON.onRollOut = T_BUTTON.onReleaseOutside = function() {
  194.         this.T_MENUCONTENT = T_CONTAINER.T_MENUITEMS[this.Caption];
  195.        
  196.         for(this.T_ITEMCOUNT = 0; this.T_ITEMCOUNT <= this.T_MENUCONTENT.length-1; this.T_ITEMCOUNT++) {
  197.             this["Menuitem"+this.T_ITEMCOUNT]["TextMenuitem"+this.T_ITEMCOUNT].removeTextField();
  198.             this["Menuitem"+this.T_ITEMCOUNT].removeMovieClip();
  199.         }
  200.         this.clear();
  201.         T_CONTAINER.overme = undefined;
  202.     }
  203.  
  204.     T_BUTTON_NAME = "Button"+this.buttons;
  205.    
  206.     T_BUTTON._x = T_BUTTON_POS;
  207.    
  208.     T_BUTTON.createTextField(T_BUTTON_NAME, 1, 5, 2, T_TEXT_WIDTH, 20);
  209.     T_BUTTON[T_BUTTON_NAME].text = Caption;
  210.     T_BUTTON[T_BUTTON_NAME].border = false;
  211.     T_BUTTON[T_BUTTON_NAME].selectable = false;
  212.     T_BUTTON[T_BUTTON_NAME].setTextFormat(T_TEXTFORMAT);
  213.  
  214.     T_BUTTON_POS += (T_TEXT_WIDTH+5);
  215.     this.buttons++;
  216. }
  217.  
  218. Toolbar.prototype.addMenuItem = function(Folder,ItemText,ItemAction,Icon) {
  219.  
  220.     T_CONTAINER.T_MENUITEMS[Folder][T_CONTAINER.T_MENUITEMS[Folder].length]=[ItemText,ItemAction,Arguments];
  221.  
  222. }

Entwas unübersichtlich, wird aber noch überarbeitet ...

Wie erstellt man nun das Menu? zum Beispiel hiermit:
ActionScript:
  1. function Click(argc) {
  2.     _root.result = argc;   
  3. }
  4.  
  5. function Goto(argc) {
  6.     getURL(argc,"_blank");          
  7. }
  8.  
  9. TB = new Toolbar();
  10. TB.addMenuFolder("File");
  11.     TB.addMenuItem("File","Open","Click","Du Hast 'Open' geklickt");
  12.     TB.addMenuItem("File","Test","Click","Du Hast 'Test' geklickt");
  13.     TB.addMenuItem("File","Hallo","Click","Du Hast 'Hallo' geklickt");
  14.     TB.addMenuItem("File","WinXP","Click","Du Hast 'WinXP' geklickt");
  15.     TB.addMenuItem("File","FlashMX","Click","Du Hast 'FlashMX' geklickt");
  16.     TB.addMenuItem("File","Gefällts?","Click","Du Hast 'Gefällts?' geklickt");
  17. TB.addMenuFolder("Edit");
  18.     TB.addMenuItem("Edit","Lalelu","Click","Du Hast 'Lalelu' geklickt");
  19.     TB.addMenuItem("Edit","Ein Man im Mond","Click","Du Hast 'Ein Man im Mond' geklickt");
  20.     TB.addMenuItem("Edit","Schaut Dir zu","Click","Du Hast 'Schaut Dir zu' geklickt");
  21.     TB.addMenuItem("Edit","abcefghijkl","Click","Du Hast 'abcefghijkl' geklickt");
  22. TB.addMenuFolder("Ansicht");
  23.     TB.addMenuItem("Ansicht","MX Actionscript","Click","Du Hast 'MX Actionscript' geklickt");
  24.     TB.addMenuItem("Ansicht","Von borisp","Click","Jawohl, der war's !!");
  25.     TB.addMenuItem("Ansicht","Für das Flashforum(.de)","Click","Viel Spass damit !");
  26. TB.addMenuFolder("About");
  27.     TB.addMenuItem("About","Der Autor","Goto","http://www.gamate.com");
  28.     TB.addMenuItem("About","Zeit?","Click","Hat mich ca. 4 Stunden gekostet :)");
  29.     TB.addMenuItem("About","Fertig?","Click","Noch nicht soooo ganz ...");
  30.     TB.addMenuItem("About","Was fehlt denn?","Click","Submenus");

Damit setzt sich das Teil nach oben im Flash und ist genauso breit wie die Bühne und bastelt sein Menu zusammen. Recht flott wie ich finde.

TB.addMenuItem(Foldername, Beschriftung, Funktion die aufgerufen werden soll, Argument für die Funktion);



BE INSPIRED

Geändert von borisp (04-02-2003 um 20:43 Uhr)
borisp ist offline   Mit Zitat antworten
Alt 04-02-2003, 19:16   #2 (permalink)
nerdig working
 
Benutzerbild von michael
 
Registriert seit: Jul 2001
Ort: Hamburg
Beiträge: 5.832
Thumbs up

du hast aber auch einen output derzeit

klasse

gruss
michael
michael ist offline   Mit Zitat antworten
Alt 04-02-2003, 20:41   #3 (permalink)
hOk
Neuer User
 
Benutzerbild von hOk
 
Registriert seit: Jun 2001
Ort: berlin
Beiträge: 829
Hammer borisp,
das ist ja sehr genial!
netten Gruß, Holger
__________________
gobogo
hOk ist offline   Mit Zitat antworten
Alt 04-02-2003, 22:50   #4 (permalink)
Nordlicht
 
Benutzerbild von astaroth
 
Registriert seit: Jun 2001
Ort: Hamburg
Beiträge: 569
Thumbs up

Tja, was osll ich da noch zu sagen ??

EINFACH GOIL !!!!
__________________
"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen."
Wachsamkeit ist der Preis der Freiheit - Keine Zensur!

– Wau Holland –

http://www.wauland.de
astaroth ist offline   Mit Zitat antworten
Alt 04-02-2003, 23:57   #5 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
Spitzensache - Sieht sehr fein aus !
Gruss nky
nky ist offline   Mit Zitat antworten
Alt 05-02-2003, 08:45   #6 (permalink)
LastActionScriptHero
 
Benutzerbild von k7c4
 
Registriert seit: Apr 2002
Beiträge: 572
gefällt! gekauft!

Fehlt nur noch eine Shortcut und Alt-Taste-Steuerung :gier:
__________________
All your AS are belong to us! haha!
Beweise heute Deine Tierliebe: Schlage nie ein totes Pferd!
k7c4 ist offline   Mit Zitat antworten
Alt 05-02-2003, 08:55   #7 (permalink)
www.penck.de
 
Benutzerbild von borisp
 
Registriert seit: Jan 2002
Ort: Wiesbaden / Mainz-Kastel
Beiträge: 926
Shortcuts, joa - mal rumexperimentieren. Was mir noch eingefallen ist, das menu sollte sich schließen wenn man drauf geklickt hat...

Wird demnächst noch aktualisiert.
borisp ist offline   Mit Zitat antworten
Alt 05-02-2003, 09:06   #8 (permalink)
LastActionScriptHero
 
Benutzerbild von k7c4
 
Registriert seit: Apr 2002
Beiträge: 572
Vielleicht schaffst Du ja auch ein zweites FlashOS

( FlashOS )

Vielleicht noch den StringWidthCalculator dazufügen
__________________
All your AS are belong to us! haha!
Beweise heute Deine Tierliebe: Schlage nie ein totes Pferd!

Geändert von k7c4 (05-02-2003 um 09:10 Uhr)
k7c4 ist offline   Mit Zitat antworten
Alt 05-02-2003, 09:35   #9 (permalink)
www.penck.de
 
Benutzerbild von borisp
 
Registriert seit: Jan 2002
Ort: Wiesbaden / Mainz-Kastel
Beiträge: 926
String Width Calculator? Wozu das kann doch MX:

ActionScript:
  1. T_TEXTFORMAT = new TextFormat();
  2.     T_TEXTFORMAT.font = "Tahoma";
  3.     T_TEXTFORMAT.size = 11;
  4.    
  5.     T_TEXT_DIMENSION = T_TEXTFORMAT.getTextExtent(TextVariable);
  6.     T_TEXT_WIDTH = T_TEXT_DIMENSION.width;

(Wird auch in der Bar verwendet - nur die Menus haben noch eine Stadardbreite.
borisp ist offline   Mit Zitat antworten
Alt 05-02-2003, 09:35   #10 (permalink)
◘ ◘
 
Benutzerbild von beachmeat
 
Registriert seit: Dec 2001
Ort: Amsterdam
Beiträge: 6.126
Macht er das nicht bereits mit
T_TEXT_DIMENSION = T_TEXTFORMAT.getTextExtent(Caption);
oder was meinsde?


edit:
na wieda zu spät
__________________
jeden Tag frisch
beachmeat ist offline   Mit Zitat antworten
Alt 05-02-2003, 09:38   #11 (permalink)
LastActionScriptHero
 
Benutzerbild von k7c4
 
Registriert seit: Apr 2002
Beiträge: 572
Oops, sorry, bin wegen Kunden immer noch zu sehr den Flash5-Beschränkungen verhaftet
__________________
All your AS are belong to us! haha!
Beweise heute Deine Tierliebe: Schlage nie ein totes Pferd!
k7c4 ist offline   Mit Zitat antworten
Alt 05-02-2003, 10:47   #12 (permalink)
[Matthias K.] - Moderator
 
Benutzerbild von Madokan
 
Registriert seit: Jun 2001
Ort: Berlin/Germany - and the hole World !
Beiträge: 9.971
k7c4: Ich glaub davor sind wir alle nicht sicher.

borisp: Ich glaub da wird mal wieder ein Daumen fällig und bin sicher, dass diese Umsetzung eine gute Grundlage für eine GUI darstellt.

Liebe Grüsse
Matze K.
Madokan ist offline   Mit Zitat antworten
Alt 05-02-2003, 13:31   #13 (permalink)
www.penck.de
 
Benutzerbild von borisp
 
Registriert seit: Jan 2002
Ort: Wiesbaden / Mainz-Kastel
Beiträge: 926
Smile

Soldele ein Update

Anschauen
Download

--

Neu:
* Es gibt keine .hitTest() mehr (bessere performance)
* Menu schließt, wenn Menupunkt gedrückt wurde.
* Exaktere zeichnung
* Menu bleibt offen bei onRollOut (wie in windows) und schließt sich bei Rollover von der Menubar

Todo:
* Menu schließen bei klick auf die Bühne
* Tastenkombinationen: Schwer, da CTRL+? oftmals schon im Browser definiert ist.
borisp ist offline   Mit Zitat antworten
Alt 05-02-2003, 20:42   #14 (permalink)
rOb
Alter User
 
Registriert seit: Jun 2001
Ort: Bodensee-Metropole
Beiträge: 1.144
schön. kleine anregung noch. wenn du bei xp einmal geklickt
hast, und dann über die rubriken fährst, gehen die schon
onRollover auf, nicht erst on click, ist ein bisschen ungewohnt.

schick isses auf jeden fall
rOb ist offline   Mit Zitat antworten
Alt 05-02-2003, 20:56   #15 (permalink)
Neuer User
 
Benutzerbild von :: RK ::
 
Registriert seit: Jan 2002
Ort: Umgebung Stuttgart
Beiträge: 5.412
hi,

ich als kompletter OOP DAU, weis nicht was der Vorteil bei so einem Menue ist, OOP ein zu setzen,
anstelle ganz normal zu programmieren. sorry da fehlt das Vertändnis
(oder weil ich kein plan von hab )


kann mir bitte einer sagen wo die Vorteile sind ???


PS : geil ist es aber trozdem







CU, :: RK ::
__________________
Das Glück im Leben hängt von den guten Gedanken ab, die man hat.

Easing_Equations / Flash Kontaktformular / FlashPlugin W3C konform / Nützliche Beiträge zu FAQs
:: RK :: ist gerade online   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele