Infoleiste (erweiterte StatusBar)
Verfasst: 01.04.2014 01:00
Infoleiste v1.0.0.1
Download:
https://dl.dropboxusercontent.com/s/khk ... iFOJmEWCmA
ähh...ja. Ich dachte ich gebe auch mal der Community etwas zurück, in der Hoffnung, dass es jemand gebrauchen kann.
Es nennt sich "Infoleiste", wobei dieser kreativlose Name hoffentlich niemanden abschreckt.
Genauer genommen handelt es sich um eine Statusleiste, die einen größeren Funktionsumfang aufweist. Da ich natürlich faul bin, habe ich einfach meine Beschreibung aus meinen Include herauskopiert und unten eingefügt. Dort gibt es genauere Informationen
Screenshots:




das Tooltip erscheint neben der Maus, aber die ist irgendwie nicht auf dem Bild gelandet. Aber ich weiß ja, dass ihr viel Phantasie habt und euch einfach den Mauszeiger vorstellen könnt

das selbe in Grün. Nur ist es hier das Kontextmenü der Infoleiste
viele Grüße,
Martin
Download:
https://dl.dropboxusercontent.com/s/khk ... iFOJmEWCmA
ähh...ja. Ich dachte ich gebe auch mal der Community etwas zurück, in der Hoffnung, dass es jemand gebrauchen kann.
Es nennt sich "Infoleiste", wobei dieser kreativlose Name hoffentlich niemanden abschreckt.
Genauer genommen handelt es sich um eine Statusleiste, die einen größeren Funktionsumfang aufweist. Da ich natürlich faul bin, habe ich einfach meine Beschreibung aus meinen Include herauskopiert und unten eingefügt. Dort gibt es genauere Informationen

Screenshots:




das Tooltip erscheint neben der Maus, aber die ist irgendwie nicht auf dem Bild gelandet. Aber ich weiß ja, dass ihr viel Phantasie habt und euch einfach den Mauszeiger vorstellen könnt


das selbe in Grün. Nur ist es hier das Kontextmenü der Infoleiste
Code: Alles auswählen
===========================================================================
MODUL-INFO
===========================================================================
Modulname..........: Infoleiste
Version............: 1.0.0.1
Sprache............: Deutsch
PureBasic-Version..: 5.22 LST
Copyright..........: Martin Langer (alias SBond)
Autor..............: SBond
Datum..............: 02.04.2014
E-Mail.............: SBond.Softwareinfo@gmail.com
Unterstütze OS.....: Windows (Linux und Mac nicht getestet)
Architekture.......: x86, x64
Zeichensatz........: ASCII, Unicode
Wichtige Hinweise..: Ja, siehe Hilfe ("Einschränkungen und Konflikte")
===========================================================================
Code: Alles auswählen
===========================================================================
VERSIONS-GESCHICHTE
===========================================================================
1.0.0.1 - 02.04.2014 - Repariert: fehlerhafte Größenanpassung des Fensters (durch die SizeBox)
- Repariert: Tooltips und Ballon-Tipps flackern
1.0.0.0 - 01.04.2014 - Fertigstellung der Version 1.0
0.0.0.0 - 12.02.2014 - Start der Programmierung
===========================================================================
Code: Alles auswählen
===========================================================================
STATISTIKEN
===========================================================================
Compile Count..................: 3855
Dateigröße.....................: 500,6 KB
Programmiert unter.............: Windows 7 Ultimate x64
Programmzeilen.................: 10484
Codezeilen.....................: 3786
Code mit Inline Kommentar......: 596
Kommentarzeilen................: 3127
Leerzeilen.....................: 2975
Kommentar/Code-Verhältnis......: 0,826
Anzahl der Prozeduren..........: 71
Public-Prozeduren..............: 55
Private-Prozeduren.............: 16
===========================================================================
Code: Alles auswählen
===========================================================================
HILFE UND HINWEISE
===========================================================================
Einleitung
---------------------------------------------------------------------------
Wer ein größeres Programm entwickelt und bestimmte Zustände anzeigen möchte, der greift höchstwahrscheinlich zu der StatusBar, die in PureBasic standardgemäß zur Verfügung steht. Diese bietet einige Grundfunktionen, um Texte, Symbole und Fortschrittsanzeigen darzustellen. Wer darüber hinaus mehr Funktionen nutzen möchte, steht vor einigen Problemen. Schon das Hinzufügen eines Buttons ist nicht so trivial wie es den anschein hat. Wurde dieser erfolgreich über SetParent_() eingebunden, so stellt man fest, dass von diesem Button keine Events über WindowEvent() empfangen werden. Auch das Ändern einer Feldbreite oder das Entfernen eines Feldes gestaltet sich als schwierig.
Aus diesem Grund wollte ich mir eine eigene Statusleiste programmieren, die ein wenig mehr Spielraum bietet. Herausgekommen ist allerdings die "Infoleiste", die wesentlich mehr Funktionen bietet, als eigentlich geplant war. Zugegeben.... der Name "Infoleiste" ist nicht sehr kreativ, aber sie eignet sich eben nicht nur als klassische Statusleiste. Welche Funktionen und Eigenschaften diese "Infoleiste" hat, werde ich in den Unterkapiteln näher erläutern.
Definition der Begriffe "Infoleiste, Elemente und Felder"
---------------------------------------------------------------------------
Zunächst möchte ich hier die Begriffe erläutern, die in der Hilfe und im Quellcode immer wieder erwähnt werden. Die wichtigsten drei Begriffe sind: "Elemente", "Felder" und "Infoleiste". Nun, die Infoleiste ist prinzipiell eine Leiste, wie die StatusBar in PureBasic. Sie unterteilt sich in Felder, auf denen verschiedene "Elemente" dargestellt werden können. Die Anzahl der Felder ist dabei frei definierbar und kann beliebig angepasst werden. Die Breite eines Feldes und sein Verhalten wird jedoch nicht direkt angegeben (so wie es in der StatusBar der Fall ist), sondern richtet sich nach den "Elementen" die darauf angezeigt werden. Ein Element ist in der Infoleiste eine Art Gadget, das in einem Feld der Infoleiste dargestellt werden kann. Die Anzahl der verwendeten Elemente ist dabei unbegrenzt. Jede Infoleiste kann zudem mehr Elemente verwalten, als angezeigt werden können. Ein Feld in der Infoleiste kann immer einem Element zugeordnet werden, wobei ein Element auch mehrfach dargestellt werden kann. Alle Elemente können ähnlich wie Gadgets erstellt, angepasst und entfernt werden. Dies ist unabhängig davon, ob diese in der Infoleiste angezeigt werden oder nicht. Die Element-Zuweisung eines Feldes in der Infoleiste geht allerdings nicht nur über explizite Prozeduraufrufe, sondern auch über das Kontextmenü.
....ja, jede Infoleiste besitzt ein Kontextmenü, mit dessen Hilfe die Felder leicht angepasst werden können ;)
Einsatzgebiet der Infoleiste und Funktionsumfang
---------------------------------------------------------------------------
Ich denke in diesem Bereich ist es sinnvoll die wichtigsten Funktionen der Infoleiste stichpunktartig zu erläutern:
- jede GUI kann beliebig viele Infoleisten besitzen
- es können mehrere Infoleisten auf mehreren Fenstern gleichzeitig verwaltet werden
- die Infoleiste kann frei plaziert werden und bietet verschiedene Optionen, sowie Autoresize-Einstellungen
- Infoleisten können ausgeblendet werden
- jede Infoleiste kann beliebig viele Felder verwalten
- jede Infoleiste kann beliebig viele Elemente verwalten
- die SizeBox der Infoleiste kann optional ein- und ausgeschaltet werden
- jede Infoleiste besitzt ihre eigenen Elemente
- die Infoleiste, die Elemente und die Felder werden automatisch synchronisiert
- das Aktualisierungsintervall kann angepasst werden (siehe Standard-Einstellungen im Modul)
- alle Elemente generieren Eventinformationen (auch Textfelder)
- jede Infoleiste verfügt über ein eigenes Kontextmenü, das optional auch deaktiviert werden kann
- das Kontextmenü wird alphabetisch sortiert und unterstützt Symbole, sowie Haupt- und Nebenkategorien
- jedes Element kann Tooltips und Ballon-Tipps anzeigen
- Tooltips und Ballon-Tipps können neben dem Text auch einen Titel und ein Symbol anzeigen
- Tooltips können "live" aktualisiert werden
- die Parameter und Einstellungen der Element-Typen sind vollkompatibel mit den Gadgets in PureBasic
- unterstützte Element-Typen in der Infoleiste:
------------------------------------------------
ButtonGadget
ButtonImageGadget
CanvasGadget
CheckBoxGadget
ComboBoxGadget
DateGadget
ExplorerComboGadget
HyperLinkGadget
IPAddressGadget
ProgressBarGadget
ScrollBarGadget
ShortcutGadget
SpinGadget
StringGadget
TextGadget
TrackBarGadget
Einschränkungen und Konflikte
---------------------------------------------------------------------------
Dieses Modul hat leider einige Konfliktpunkte, die ich hier noch erwähnen möchte.
1. Kontextmenü-Konflikt:
-------------------------
Sobald ein Rechtsklick auf der Infoleiste durchgeführt wird, erscheint ein Kontextmenü, das unmittelbar zuvor generiert wurde. Um anschließEnd die angeklickten Menüpunkte auswerten zu können, ist es nötig jedem Menüeintrag eine MenuID zu geben. Diese sind allerdings Global im ganzen Programm verfügbar und können im Konflikt mit anderen Menüleisten und Popup-Menüs stehen. Um dies zu verhindern, werden die MenuIDs in der Infoleiste >= 20000 sein. Für den unwahrscheinlichen Fall, dass dies zu einem Konflikt wird, kann der Wert in den Standard-Einstellungen des Moduls angepasst werden.
2. OS-Konflikt:
-------------------------
Diese Infoleiste wurde zur Zeit nur auf Windows getestet. Die Einschränkung auf Linux und Mac richtet sich nur bei den Tooltips (bzw. Ballon-Tipps), da die Prozedur "_Tooltip (...)" WinAPIs verwendet. Wird diese deaktiviert, so sollte der Rest auch auf anderen Betriebssystemen laufen
Programmierstruktur
---------------------------------------------------------------------------
Ich denke es wird vielen sofort auffallen, dass die Namen der Prozeduren und Variablen auf Deutsch sind und eine andere Form aufweisen als üblich. Ich habe also statt "MyNewProcedure()" folgende Bezeichnung angewendet: "Meine_neue_Prozedur ()". Der Grund dafür ist ganz einfach: neugier. Ich programmiere erst seit knapp 2 Jahren mit verschiedenen Sprachen, wobei ich PureBasic knapp 10 Monate kenne. Mit der deutsch Bezeichnung habe ich mir etwas mehr Übersicht erhofft. Naja, der Effekt ist zumindest kleiner als erwartet. Wem es stört, kann ja einfach mit suchen/ersetzen die Namen ändern ;)
Ich habe mir wirklich Mühe gegeben, den Quellcode so optimal wie möglich zu gestallten und zu dokumentieren. Ich denke es steckt noch Optimierungspotential drin, aber von meinem aktuellen Wissensstand sollte es ok sein. Die Dokumentation selber beläuft sich einmal als Inline-Kommentare und als Prozedur-Beschreibung. Letzteres findet man immer direkt über der jeweiligen Prozedur.
Variablen:
-------------------------
Alle Variablen sind nach außen hin gekapselt und können nicht verändert werden. Die Namen der Variablen habe ich immer mit einem Präfix versehen, um den Datentyp kenntlich zu machen:
iVariable.i -> Integer (verwendet für Ganzzahlen, handles und boolsche Ausdrücke)
fVariable.f -> Float
sVariable.s -> String
bVariable.b -> Byte
...achja für den Fall, dass die Darstellung verschoben sein sollte: meine Tab-Länge in der PureBasic IDE ist 4 (echter Tab)
Haftung / Lizenz
---------------------------------------------------------------------------
Dieser Quellcode wird in einem Zustand zu Verfügung gestellt, wie er ist. Die Fehlerfreiheit des Quellcodes wird nicht garantiert und ich übernehme keine Verantwortung für Schäden, die diesem Quellcode zugeschrieben werden. Die freie Verwendung, Anpassung und kostenlose Weitergabe, sowie die Anwendung im Kommerziellen Bereich sind gestattet, sofern der Bezug des Quellcodes zu dem Autor (SBond) nicht verloren geht.
===========================================================================
Code: Alles auswählen
===========================================================================
DANKE
===========================================================================
An dieser Stelle möchte ich mich bei jenen bedanken, die mich bei der Entwicklung unterstützt haben. Besonderen Dank gilt:
NicTheQuick
STARGÅTE
ts-soft
RSBasic
Danilo
Chimorin
Die oben genannten User (siehe PureBasic-Forum: http://www.purebasic.fr/german/) haben mir bei Fragen immer zur Seite gestanden und mir wertvolle Tipps gegeben. Natürlich bedanke ich mich auch an den Rest der PureBasic-Community und das PureBasic-Entwicklerteam. :)
Zuletzt bedanke ich mich bei meinem Asus-Laptop N70S, der trotz fehlerhafter Sektoren, Abstürze und seiner grotten-schlechten Leistung, mein programmier-gefriemel wohlwollend duldete und erstaunlich wenig kurrupte Dateien erzeugte. ...und das trotz des Bügeleisen-Unfalls xD
===========================================================================
Code: Alles auswählen
===========================================================================
PROZEDUREN - BESCHREIBUNG
===========================================================================
----PUBLIC----
Infoleiste allgemein
----------------------------------------
_erstelle_Infoleiste erzeugt eine Infoleiste, in der Elemente verwaltet werden können
_entferne_Infoleiste entfernt die angegebene Infoleiste und gibt die verwendeten Ressourcen wieder frei
_verstecke_Infoleiste blendet die Infoleiste aus oder zeigt diese wieder an
_setze_allgemeine_Optionen ändert allgemeine Einstellungen der Infoleiste
_setze_Autoresize_Optionen ermöglicht die automatische Größenanpassung der Infoleiste
_gebe_Element_Event ermittelt, ob das aktuelle Event von einem Element ausgelöst wurde
Verwalten von Elementen
----------------------------------------
_erstelle_ButtonGadget_Element erstellt ein neues ButtonGadget-Element in der Infoleiste
_erstelle_ButtonImageGadget_Element erstellt ein neues ButtonImageGadget-Element in der Infoleiste
_erstelle_CanvasGadget_Element erstellt ein neues CanvasGadget-Element in der Infoleiste
_erstelle_CheckBoxGadget_Element erstellt ein neues CheckBoxGadget-Element in der Infoleiste
_erstelle_ComboBoxGadget_Element erstellt ein neues ComboBoxGadget-Element in der Infoleiste
_erstelle_DateGadget_Element erstellt ein neues DateGadget-Element in der Infoleiste
_erstelle_ExplorerComboGadget_Element erstellt ein neues ExplorerComboGadget-Element in der Infoleiste
_erstelle_HyperLinkGadget_Element erstellt ein neues HyperLinkGadget-Element in der Infoleiste
_erstelle_IPAddressGadget_Element erstellt ein neues IPAddressGadget-Element in der Infoleiste
_erstelle_ProgressBarGadget_Element erstellt ein neues ProgressBarGadget-Element in der Infoleiste
_erstelle_ScrollBarGadget_Element erstellt ein neues ScrollBarGadget-Element in der Infoleiste
_erstelle_ShortcutGadget_Element erstellt ein neues ShortcutGadget-Element in der Infoleiste
_erstelle_SpinGadget_Element erstellt ein neues SpinGadget-Element in der Infoleiste
_erstelle_StringGadget_Element erstellt ein neues StringGadget-Element in der Infoleiste
_erstelle_TextGadget_Element erstellt ein neues TextGadget-Element in der Infoleiste
_erstelle_TrackBarGadget_Element erstellt ein neues TrackBarGadget-Element in der Infoleiste
_gebe_Element_Attribut gibt einen Attribut-Wert des angegebenen Elements zurück
_gebe_Element_Farbe gibt die Farbe des angegebenen Elements im RGB-Format zurück
_gebe_Element_Informationen gibt allgemeine Informationen über ein Element
_gebe_Element_Status gibt den aktuellen Status des angegebenen Elements zurück
_gebe_Element_Text gibt den Textinhalt des angegebenen Elements zurück
_setze_Element_Attribut ändert einen Attribut-Wert des angegebenen Elements
_setze_Element_Breite ändert die Abmessung der angegebenen Elemente
_setze_Element_Farbe ändert die Farbe des angegebenen Elements
_setze_Element_Schriftart weist dem angegebenen Element eine Schriftart zu
_setze_Element_Status ändert den aktuellen Status des angegebenen Elements
_setze_Element_Text ändert den Text-Inhalt des angegebenen Elements
_entferne_Element entfernt ein Element vollständig aus der Infoleiste
Verwalten von Element-Items
----------------------------------------
_erstelle_Element_Item fügt einem Element ein Item hinzu
_gebe_Element_Item_Anzahl gibt die Anzahl der Items eines Elements zurück
_gebe_Element_Item_Daten gibt den Wert zurück, welcher zuvor für diesen Element-Eintrag mittels _setze_Element_Item_Daten() gespeichert wurde. Dies ermöglicht das Verknüpfen eines individuellen Werts mit den Einträgen eines Element.
_gebe_Element_Item_Text gibt den Textinhalt des angegebenen Eintrags vom angegebenen Element zurück
_setze_Element_Item_Daten speichert den angegebenen Wert mit dem angegebenen Element-Eintrag. Dies ermöglicht das Verknüpfen eines individuellen Werts mit den Einträgen eines Element.
_setze_Element_Item_Image ändert das Bild des angegebenen Element-Eintrags
_setze_Element_Item_Text ändert den Text des angegebenen Element-Eintrags
_entferne_alle_Element_Items entfernt alle Items eines Elements
_entferne_Element_Item entfernt ein Item eines Elements
Felder der Informationsleiste
----------------------------------------
_setze_Feld weist einem Feld in der Infoleiste ein Element zu, erstellt neue Felder oder entfernt diese
_entferne_Feld entfernt das angegebene Feld aus der Infoleiste
Kontextmenü der Informationsleiste
----------------------------------------
_setze_Kontextmenue_Optionen ändert allgemeine Einstellungen des Kontextmenüs einer Infoleiste
_setze_Kontextmenue_Eintrag fügt einem Element ein Kontextmenü-Eintrag hinzu
_entferne_Kontextmenue_Eintrag entfernt den Kontextmenü-Eintrag eines Elements
Tooltip der Informationsleiste
----------------------------------------
_setze_Tooltip_Optionen ändert allgemeine Einstellungen der Tooltips
_setze_Tooltip fügt einem Element ein Tooltip hinzu, ändert dieses oder entfernt es
_entferne_Tooltip entfernt das Tooltip eines Elements
Ballon-Tipps der Informationsleiste
----------------------------------------
_setze_Ballon_Tipp fügt einem Element ein Ballon-Tipp hinzu, ändert dieses oder entfernt es
_zeige_Ballon_Tipp zeigt ein Ballon-Tipp in der Infoleiste an
_verstecke_Ballon_Tipp blendet ein aktuell angezeigtes Ballon-Tipp aus
_entferne_Ballon_Tipp entfernt das Ballon-Tipp eines Elements
---- PRIVATE ----
überprüfen der Mausparameter
----------------------------------------
_pruefe_Mausaktion gibt die Feldnummer zurück, über der sich die Maus befindet
_pruefe_Mausposition gibt die Feldnummer zurück, über der sich die Maus befindet
Größenanpassung der Infoleiste
----------------------------------------
_Infoleiste_groesse_automatisch_anpassen berechnet anhand der GUI-Abmessung und des gewählten Modus die neuen Maße der Infoleiste
_Infoleiste_groesse_anpassen ändert die Position und Abmessung der Infoleiste und passt die darauf enthaltenen Felder an
Verwaltung der Felder
----------------------------------------
_berechne_Element_Felder berechnet anhand der Abmessung der Infoleiste die Positionen und Abmessungen der einzelnen Felder
_Felder_aktualisieren aktualisiert alle Felder in der Infoleiste und synchonisiert so die Gadgets mit den Element-Einstellungen
_Felder_sortieren nummeriert die Felder in der Infoleiste neu
_gebe_Feld_des_Elements sucht das angegebene Element in den Feldern der Infoleiste und gibt dessen Position zurück
sonstige Prozeduren
----------------------------------------
_erneuere_Infoleiste erneuert die Felder in der Infoleiste und tauscht diese ggf. aus
_gebe_Anzahl_der_Elemente zählt die vorhandenen Elemente in der Infoleiste (nicht die Felder)
_Tooltip erzeugt ein Tooltip oder ein Ballon-Tipp
_zeige_Kontextmenue öffnet das Kontextmenü der Infoleiste
BindEvents
----------------------------------------
_Autoresize BindEvent: ermöglicht die automatische Anpassung der Infoleiste bei einer Größenveränderung der GUI
_Element_Aktualisierung BindEvent: prüft, ob ein Gadget im Feld der Infoleiste geändert wurde und synchronisiert anschließEnd die Elemente der Infoleiste
_Menue_Event BindEvent: prüft, ob ein Eintrag im Kontextmenü ausgewählt wurde und führt diesen anschließEnd aus
_Timer_Event BindEvent: aktualisiert periodisch die Tooltips und das Kontextmenü
===========================================================================
Code: Alles auswählen
===========================================================================
ZUKÜNFTIGE FUNKTIONEN
===========================================================================
- mehrere Infoleisten nutzen ein Element-Array
- Deaktivierung von Elementen (DisableGadget())
===========================================================================
viele Grüße,
Martin