Autor Thema: GUI: Fenster  (Gelesen 13475 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« am: 10. May 2006, 20:43 »
Hi,

wie ihr ja alle wisst, progge ich an einem OS mit GUI. Ich habe auch schon einiges. Ich bin jetzt bei dem Thema "Fenster". Da tue ich mich aber schwer. Ich habe keine richtige Idee wie ich das machen soll. Also es darf ja nur ein Fenster in einem Task laufen, wenn man einen Pixel schreibt muss man prüfen ob dort das Fenster überhaupt zu sehen ist, wenn man einen Button drückt der nur halb zu sehen ist, darf er nur halb eingedrückt gezeichnet werden usw. Auch wenn ich Fenster verschiebe, muss ich ja vorher das abspeichern, was unter dem Fenster ist. Also ich habe keine richtige Vorstellung wie ich das machen soll. Ich bräuchte eure Hilfe. Einige von euch haben ja schon eine GUI mit Fenstern. Habt ihr euch die Metode ausgedacht oder habt ihr Infos dazu? Könnt ihr mir helfen? danke!!!

bitmaster
In the Future everyone will need OS-64!!!

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #1 am: 10. May 2006, 21:04 »
also ich hab im videotreiber eine funktion, die das sichtfeld einstellt, und dann nur die pixel, die gesehen werden können zeichnet. das fenster ist bei mir eine unterklasse von "gui_element" und enthält damit eine liste mit seinen unterobjekten (auch vom typ "gui_element"), die dann beim zeichnen des fensters abgerufen wird.

das ist aber alter code... ich schreibe grad an einer userlevel gui, die wird vermutlich ganz anders (?)

du könntest dir dazu doch einfach mal den guimanager in der irrlicht engine ansehen, oder andere bibliotheken, die sowas implementiert haben.

maumo

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 10. May 2006, 21:06 »
Zitat von: maumo
also ich hab im videotreiber eine funktion, die das sichtfeld einstellt, und dann nur die pixel, die gesehen werden können zeichnet. das fenster ist bei mir eine unterklasse von "gui_element" und enthält damit eine liste mit seinen unterobjekten (auch vom typ "gui_element"), die dann beim zeichnen des fensters abgerufen wird.

das ist aber alter code... ich schreibe grad an einer userlevel gui, die wird vermutlich ganz anders (?)

du könntest dir dazu doch einfach mal den guimanager in der irrlicht engine ansehen, oder andere bibliotheken, die sowas implementiert haben.

maumo
Hmm... Was ist "guimanager in der irrlicht engine"?  :oops:
In the Future everyone will need OS-64!!!

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #3 am: 10. May 2006, 21:07 »
also die irrlicht engine ist eine 3d engine. der guimanager ist die klasse, die die fensterverwaltet. theoretisch gesehen könntest du den in deinem system unterbringen, müsstest halt nur den videotreiber in der engine anpassen^^.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 10. May 2006, 21:47 »
Zitat von: maumo
also die irrlicht engine ist eine 3d engine. der guimanager ist die klasse, die die fensterverwaltet. theoretisch gesehen könntest du den in deinem system unterbringen, müsstest halt nur den videotreiber in der engine anpassen^^.
Verstehe zwar immer noch nicht wovon du sprichst, aber ich werde mal schauen wie ich das so machen werde.

bitmaster
In the Future everyone will need OS-64!!!

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 10. May 2006, 22:45 »
Benutz doch einfach einen ZBuffer.
Für jeden Pixel reservierst du ein Byte in dem du die "höhe" des gezeichneten Objektes speicherst.

Wenn du mehrere Fenster geöffnet hast, werden sie ja in einer bestimmten Reihenfolge sortiert. (das Aktive Fenster z.B. ganz vorne mit der 0)

0000
 0000
1000011
111111122
   222222
   222222


Du must dann nur jedesmahl wenn du einen pixel zeichnest nachschauen ob der Wert im ZBuffer größer oder kleiner ist.

if zbuffer[pixel_pos] < fenster_hoehe then begin
 zbuffer[pixel_pos] := fenster_hoehe;
 pixel[pixel_pos] := farbe;
end;
db 0x55AA

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 10. May 2006, 22:49 »
Wenn dus nicht unbedingt auf Performance anlegst, kannst einfach alles Zeichnen... Hast an sich ne verkettete Liste mit Fensterelementen (so ein Element enthält vermutl. direkt irgendeine Grafik die direkt gezeichnet werden kann, Gadgetlisten die einzeln gezeichnet werden tuns natürlich auch -> allerdings wird dann frei zeichnen problematisch, kannst evtl. kombinieren). Es wird einfach die Liste von HINTEN NACH VORNE abgearbeitet und gezeichnet, das erste Element in der Liste ist das aktive Fenster (erstes Element wird zuletzt gezeichnet, ist also vorne...). Anderes Fenster aktivieren -> Element an erste Position verschieben. Wenn du Maus etc. abfragen willst (also zu welchem Fenster gehört), kannst einfach die Liste von vorne bis hinten durchgehen und da auf die jeweiligen Koordinaten prüfen... Wenn dus halt schneller haben willst, find nen weg verdeckte Flächen automatisch zu finden ;)

Edit: Grad den Beitrag mit den zbuffern gelesen, war da schon am tippen... das wär z.b. ne Möglichkeit um das Zeichnen zu optimieren ;) hab ich aber nicht implementiert
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #7 am: 11. May 2006, 07:44 »
@Osbios: Jo, so änlich hab ich mir das auch gedacht. Nur was meinst du mit Fensterhöhe?

danke!!!
In the Future everyone will need OS-64!!!

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 11. May 2006, 13:06 »
Einfach wie weit vorne das Fenster ist... z.b. müsste das Aktive Fenster das im VOrdergrund ist die Höhe 1 haben, das dahinter 2, ...
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #9 am: 11. May 2006, 13:53 »
Zitat von: N00B
Einfach wie weit vorne das Fenster ist... z.b. müsste das Aktive Fenster das im VOrdergrund ist die Höhe 1 haben, das dahinter 2, ...
Wieso muss das denn? Kann man denen nicht einfach irgendwelche Nummern zuweisen? Was wäre denn, wenn ein anderes Fenster in den Vordergrund kommt?

bitmaster
In the Future everyone will need OS-64!!!

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 11. May 2006, 14:02 »
dann schiebst du das neue aktive Fenster an POS 1... siehe die Listen wie ich sie verwende ;) 1. Element ist das aktuelle Fenster, und hat damit Index 1 -> den Listenindex kannst direkt verwenden (wenn bei 1 anfangend, ansonsten +1 ;) )
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #11 am: 11. May 2006, 21:33 »
@blueXseven: Cool, danke. Das mit dem Desktop als Fenster ohne Rahmen hab ich mir auch schon so gedacht.

Zitat
auserdem kopiere ich nur die zeilen, die tatsächlich verändert wurden.
Und wie weißt du - wenn du jetzt im Arbeitsspeicher alles so stehen hast, dass du es jetzt im Grafikspeicher kopieren kannst - was davon nur verändert wurde?

vielen dank!!!
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #12 am: 11. May 2006, 21:59 »
Zitat von: blueXseven
wenn ein objekt gezeichnet wird, werden die y position und die höhe gespeichert.
beim nächsten objekt wird geprüft ob es auch in diesem bereich ist.
wenn nicht wird der bereich nach oben oder unten vergrössert.
Kapier ich nicht. Und was ist mit X und Breite? Was wird vergrößert? hä?
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #13 am: 12. May 2006, 06:50 »
Zitat von: blueXseven
also der nullpunkt des bildschirms ist ja oben links.
nach rechts ist x und nach unten ist y.
wenn ich mir jetzt y merke, weiss ich ab welcher zeile ich aktualisieren muss.
und mit der höhe wieviele zeilen es sind.
die x position und die breite benutze ich nicht,
da immer nur ganze zeilen kopiert werden.
Ach so, jetzt habe ich verstanden. Mache ich aber anders. Ich werde warscheinlich nur das schreiben, was verändert wurde. danke!!!

bitmaster
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #14 am: 12. May 2006, 16:10 »
So, ich habe mir jetzt alles auf Papier geschrieben wie ich es machen werde (kann was dauern dies umzusetzen ;) ). Hoffe nur das, dass zwischenspeichern vor dem Zeichnen nicht all zu lange dauert und der User erst einmal lange warten muss bis überhaubt gezeichnet wird. Aber das Speichern im Arbeitsspeicher dürfte ja schneller sein als im Grafikspeicher, oder?

bitmaster
In the Future everyone will need OS-64!!!

Coffee

  • Beiträge: 470
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 12. May 2006, 18:17 »
ja is es..

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #16 am: 19. May 2006, 22:32 »
So, ich bin jetzt schon viel weiter. Habe aber noch eine Frage. Wie macht ihr das so mit Pixel zeichnen? Ich meine man muss ja auf die Maus rücksicht nehmen. Da wo die Maus ist darf man ja nicht zeichnen, aber es muss zwischengespeichert werden, wenn die Maus dann verschoben wird muss es ja zu sehen sein. Prüft ihr bei jedem setzen eines Pixel ob da die Maus ist etc. oder löscht ihr den Cursor und setzt den anschließend neu? Was ist schneller, besser, oder gibts noch was besseres?

danke!!!
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 19. May 2006, 22:42 »
cursor "löschen", alle(!) pixel zeichen, cursor zeichen. ist das schnellste.
Dieser Text wird unter jedem Beitrag angezeigt.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #18 am: 19. May 2006, 23:04 »
Zitat von: PorkChicken
cursor "löschen", alle(!) pixel zeichen, cursor zeichen. ist das schnellste.

Ich kann mir net vorstellen das es besonders schnell ist, den ganzen Bildschirm neu zu zeichnen, wenn man die Maus verschiebt. Ich hab zwar noch keine Erfahrung mit Gui, aber ich würd immer des was hinter dem zu zeichnenden Cursor ist speichern und wenn sich die Maus verschoben hat wieder an die Stelle zurückkopieren.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

thetrue

  • Beiträge: 216
    • Profil anzeigen
    • http://www.the-true.net
Gespeichert
« Antwort #19 am: 19. May 2006, 23:06 »
ja, aber wenn mans speicher muss es beim anzeigen wieder neu gezeichnet werden ;)
thetrue way is my way

 

Einloggen