|
|
|
XProfan ohne Grenzen Auch wenn man die folgende Änderung auf dem ersten Blick nicht "sieht", so ist sie doch die bislang aufwändigste Erweiterung der neuen Version:
Diese "Grenzenlosigkeit" wurde durch eine dynamischere Speicherverwaltung erzielt und hat zur Folge, dass die meisten Programme in Zukunft mit deutlich weniger Hauptspeicher auskommen werden. |
| Komfortableres Importieren externer Funktionen + CDECL-Aufrufe a& = importFunc(hDLL&, Func$, Alias$) Mit dieser Funktion wird eine externe Funktion importiert. h& = importDLL(DLL$, Name$) Mit dieser Funktion werden alle Funktionen einer DLL importiert. CDECL-Aufrufe Der Aufrufmodus für externe Funktionen kann nun auch vom unter Windows üblichen STDCALL auf CDECL umgestellt werden: Set("CallConv", Modus$) Modus$: Aufrufkonvention - "STDCALL" oder "CDECL" |
| Array-Zuweisungen und Matrix-Befehle A&[] = B&[] Ein Array kann einem anderen zugewiesen werden, wenn es den gleichen Typ und die gleichen Dimensionen hat, bzw. beide dynamisch sind. A$[] = Explode(text$, d$) Der Inhalt von text$ wird in Einzelstrings zerlegt, die durch den Delimiter d$ getrennt sind. A$[] enthält die Einzelstrings. Explode liefert ein dynamisches Stringarray zurück. A$[] muß daher ein dynamisches Stringarray sein. Parameters A&[] Einer Prozedur kann über Parameters ein Array übergeben werden. PType() um Arrays ergänzt Ist der Parameter ein dynamisches Array, ist das Ergebnis der Parametertyp gefolt von leeren eckigen Klammern, z.B. "$[]". Ist der Parameter ein Array mit definierter Größe, stehen in den eckigen Klammern die Dimensionsgrößen, etwa "%[8,8,2]". Return A&[] Eine Prozedur kann ein Array zurückgeben. Das Ergebnis muß einem Array gleichen Typs zugewiesen werden. A&[] = <Ausdruck> / &Index Allen Elementen das Arrays wird <Ausdruck> zugewiesen. Im Ausdruck darf die Systemvariable &Index vorkommen, die den jeweiligen Indexwert hat. MAT A&[] = <Ausdruck> Allen Elementen des Arrays A& wird der Wert <Ausdruck> zugewiesen. MAT A&[] + <Ausdruck> Zu allen Elementen des Arrays A& wird <Ausdruck> addiert. Im Falle von Stringarrays wird der String <Ausdruck> angehängt. MAT A&[] - <Ausdruck> Von allen Elementen des Arrays A& wird <Ausdruck> subtrahiert. Für Stringarrays ist das nicht möglich. MAT A&[] / <Ausdruck> Alle Elemente des Arrays A& werden durch <Ausdruck> dividiert. Für Stringarrays ist das nicht möglich. <Ausdruck> darf nicht den Wert 0 haben. MAT A&[] * <Ausdruck> Alle Elemente des Arrays A& werden mit <Ausdruck> multipliziert. Für Stringarrays ist das nicht möglich. MAT A&[] = B&[] Allen Elementen des Arrays A& wird der entsprechende Wert des Arrays B& zugewiesen. MAT A&[] + B&[] Zu allen Elementen des Arrays A& wird der entsprechende Wert des Arrays B& addiert. Im Falle von Stringarrays wird er angehängt. MAT A&[] - B&[] Von allen Elementen des Arrays A& wird der entsprechende Wert des Arrays B& subtrahiert. Für Stringarrays ist das nicht möglich. MAT A&[] / B&[] Alle Elemente des Arrays A& werden durch den entsprechenden Wert des Arrays B& dividiert. Für Stringarrays ist das nicht möglich. Im Array B& darf kein Wert 0 vorkommen! MAT A&[] * B&[] Alle Elemente des Arrays A& werden mit dem entsprechenden Wert des Arrays B& multipliziert. Für Stringarrays ist das nicht möglich. |
| Dynamische Arrays (Open Arrays) Bei eindimensionale Arrays kann man nun auf die Angabe einer festen Größe verzichten, um ein Dynamisches Array zu erzeugen. Ein so erzeugtes Array hat zunächst eine Größe von 0. Sobald jedoch ein Element zugewiesen wird, wird das Array auf die entsprechende Größe erweitert. Immer, wenn ein Element zugewiesen wird, dass die Größe des bisherigen Arrays überschreitet, wird es auf diese Weise erweitert. Um das Array wieder auf 0 zu verkleinern, ist der Clear-Befehl zu verwenden. Um die Größe des Arrays beliebig einzustellen, ist der neue Befehl SetSize zu verwenden. Einschränkungen gegenüber "normalen" Arrays: - Es ist nur eine Dimension möglich - der MAT-Befehl funktioniert nicht mit dynamischen Arrays - Arrays von Bereichsvariablen (auch Strukturen, Objekte) können nicht dynamisch sein |
| Übernahme von Strukturen in Klassen und Strukturen Es können zusätzlich zur Vererbung Strukturen unter einem frei zu wählenden Namen eingefügt werden. Der Name der Struktur in der Struktur wird von einem Ausrufezeichen getrennt vor dem Strukturnamen angegeben. Ein Beispiel: STRUCT Punkt = X%, Y%Die Struktur Punkt wird hier zwei mal mit verschiedenen Namen hinzugefügt. Beim Zugriff auf die Elemente ist dieser Name mit zu verwenden: LINE von!x%, von!y% - bis!x%, bis!y%Auch Klassen können auf diese Weise mehrere Strukturen hinzugefügt werden. Es können sogar die Eigenschaften weiterer Klassen so hinzugefügt werden. |
| Prozess-IDs und Exit-Codes END [exitcode%] Hinter dem END kann ein Exitcode angegeben werden. Dieser kann z.B. vom aufrufenden Programm abgefragt werden. pid% = WinExec(programm&, mode%) Diese Funktion liefert jetzt die Prozeß-ID des gestarteten Programmes zurück, wie es im Taskmanager angezeigt wird. Im Fehlerfall ist es wie bisher der Wert 0. getExitcode(pid%) Der Exitcode des Prozesses pid% wird ermittelt. Ist das Ergebinis 259 (= STILL_ALIVE) ist das Programm noch nicht beendet. &pid Prozess-ID des laufenden XProfan-Programmes %ExitCode Der Exitcode des zuletzt mit WinExecWait gestarten Programmes |
| Bitmaps set("PicBackCol", farbe%) farbe% = get("PicBackCol") Das Bitmapformat von Windows kennt von Hause aus keine Transparenz, daher legt XProfan bei create("hPic",..), create("hSizedPic",...), DrawPic und MLoadBMP intern für transparente Bitmaps der Formate *.gif, *.ico, *cur, *.emf und *.wmf eine Hintergrundfarbe fest. Bislang wurde hier immer reines Weiß genommen. Das erschwert aber die transparente Darstellung, wenn das Motiv selber Weiß enthält und auf einem nicht weißen Hintergrund gezeichnet werden soll. Mit dieser Set-Funktion kann nun eine beliebige interne Hintergrundfarbe angegeben werden, die im Motiv nicht vorkommt sollte. Nutzt man diese beim transparenen zeichnen, z.B. mit DrawPic, als Transparenzfarbe, wird das Motiv komplett wiedergegeben. bitmaphandle& = create("hNewPic", dx%, dy%, farbe%) Es wird eine neue Bitmap erzeugt mit der gewählten Hintergrundfarbe erzeugt. Die Bitmap wird im Speicher ezeugt. StartPaint / EndPaint erweitert Bisher konnte als StartPaint nur das Handle eines Fensters angegeben werden oder -1 für die mit MCLS erstellte Speicherbitmap bzw. die mit MLoadBmp in den Speicher geladene Bitmap. Zusätzlich kann nun ein Bitmap-Handle, Devicekontext oder Metafile-Devicekontext angegeben werden: Die Transparenzfarbe bei transparenter Darstellung kann beliebig eingestellt werden Alle Befehle, die die Modusangabe -1 für Transparenz erlauben, erlauben nun einen weiteren Parameter, der die transparente erscheinende Farbe angibt. Wird dieser weggelassen, wird wie bisher die Farbe des untersten linkesten Punktes genommen. bitmaphandle& = create("hPicCopy", hPic&[, x%, y%, dx%, dy%]) Es wird eine Kopie einer Bitmap erzeugt. Wenn die Parameter x%, y%, dx% und dy% angegeben sind besteht die Kopie lediglich aus dem so bezeichnerten Ausschnitt der Originalbitmap. SavePic Name$, bitmaphandle& [,qualitaet%] Das zum Bitmaphandle gehörige Bild wird als BMP, PNG oder JPG-Datei unter dem angegebenen Namen (ggf. mit Pfad) gespeichert: Wenn die Dateiendung ".PNG" ist, wird das Bild als PNG-Datei gespeichert, wenn der dritte Parameter angegeben ist, wird das Bild als JPG-Datei in entsprechender Qualität (1 - 100) gespeichert. Je geringer die Qualität, desto geringer die Bildgröße. Ein guter Wert ist zwischen 75 und 80. bitmaphandle& = create("hPic", 0, name$) (erweitert) Neben dem internen Ressourcennamen "&MEMBMP" gibt es drei weitere vorbelegte Namen: "&OGLBMP" - Es wird eine Bitmap des aktuellen OpenGL-Bildschirms erstellt. "&SCRBMP" - Es wird eine Bitmap des aktuellen Hauptfensters erstellt. "&DSKBMP" - Es wird eine Bitmap des aktuellen Desktops erstellt. "&CLPBMP" - Es wird eine Bitmapkopie der aktuellen Zwischenablage erstellt, wenn diese eine Bitmap enthält. bitmaphandle& = create("hPic", -1, dateiname$) (erweitert) Es können jetzt auch Bilder im PNG-Format geladen werden. Die Dateiendung muß ".PNG" sein. DrawIcon erweitert Da die Befehle DrawIcon, DrawSysIcon, DrawLibIcon und DrawExtIcon letztlich nichts anderes machen als der Befehl DrawIcon, nämlich ein Icon auf den Bildschirm zu zeichen, habe ich sie alle zu DrawIcon zusammengefasst und bei der Gelegenheit gleich erweitert, um ein Icon aufgrund des Handles zu zeichnen oder ein Bild aus einer ImageList. DrawPic und DrawSizedPic erweitert Da die Befehle DrawPic, LoadsBmp und LoadExtBmp auf der einen und DrawSizedPic, LoadSizedBmp und LoadSizedExtBmp auf der anderen Seite letztlich das Gleiche machen, nämlich eine Bitmap in Originalgröße ider scaliert anzeigen, habe ich sie zu DrawPic bzw. DrawSizedPic zusammengefasst. |
| TrayIcons TrayIcon("Add", hWnd&, ID%, hIcon&, Text$) Es wird ein TrayIcon erzeugt. Da das TrayIcon wissen muß, welches Fenster bei einem Klicken zu benachrichtigen ist, muß diese angegeben werden. TrayIcon("SetIcon", hWnd&, ID%, hIcon&) Das Icon des TrayIcons wird ersetzt. TrayIcon("SetTip", hWnd&, ID%, Text$) Das Text des TrayIcons wird ersetzt. TrayIcon("Delete", hWnd&, ID%) Das TrayIcon wird gelöscht. TrayMsg% = TrayIcon("Msg", ID%) Nach WaitInput kann mit dieser Funktion abgefragt werden, ob ein Klick auf das Trayicon mit der Nummer ID% das Verlassen des WaitInput ausgelöst hat. In diesem Fall ist das Ergebnis der Funktion größer als 0. |
| Kollisionen und Überschneidungen In vielen Spielenm ist die Kollisionskontrolle sehr wichtig. Es wird überprüft, ob sich zwei Spielelemente überschneiden. Auch wenn sich das in ein paar Programmzeilen schon jetzt programmieren läßt, bietet XProfan 11 einige Funktionen, die das Ganze noch erheblich beschleuinigen: between(x!, vonx!, bisx!) Das Ergebnis ist 1, wenn sich der Wert von x! nicht kleiner als vonx und nicht größer als bisx! ist. between(x!, vonx!, bisx!, y!, vony!, bisy!) Das Ergebnis ist 1, wenn sich der Punkt x!/y! innerhalb der rechtwinkligen Fläche befindet, die durch die Koordinaten vonx!/vony! und bisx!/bisy! beschrieben wird. between(x!, vonx!, bisx!, y!, vony!, bisy!, z!, vonz!, bisz!) Das Ergebnis ist 1, wenn sich der Punkt x!/y!/z! innerhalb des rechtwinkligen Raumes (Quader) befindet, der durch die Koordinaten vonx!/vony!/vonz! und bisx!/bisy!/bisz! beschrieben wird. range(wert!, von!, bis!) Das Ergebnis ist der Wert in den angegebenen Grenzen. Ist der Wert also kleiner als von, wird er auf von gesetzt, ist er größer als bis, wird er auf bis gesetzt. So wird sichergestellt, dass sich der Wert vor der Weiterverarbeitung innerhalb der angegebenen Grenzen bewegt. Oftmals reicht es jedoch nicht aus, einen bestimmten Punkt zu überprüfen, sondern man möchte wissen, ob ein Objekt ein anderes berührt oder überschneidet. Auch hierfür gibt es eine neue Funktion: intersect(typ$, objekt1#, objekt2#) Das Ergebnis ist 1, wenn sich die Objekte berühren oder überschneiden. Beide Objekte müssen vom angegebenen Objektyp sein oder abgeleitet sein. |
| TREEVIEW Ein TreeView ist eine Baumansicht von Texten und/oder Bildern, wobei die einzelnen Zweige dieser Ansicht auf- und zugeklappt werden können. Wie üblich, wird auch dieses Dialogelement mit einer Create-Funktion erstellt: hTV& = Create("TreeView", hWnd&, hIL&, X%, Y%, DX%, DY%) Folgende Funktionen gibt es, um das TreeView zu füllen und zu bearbeiten: Item% = TreeView("InsertItem", hTV&, Parent%, Image%, Text$) Diese Funktion fügt dem TreeView einen Eintrag hinzu. TreeView("SetItemImage", hTV&, Item%, Image%) Das Bild des Eintrages wird verändert TreeView("SetChildren", hTV&, Item%, Wert%) Es wird bestimmt, ob ein Eintrag untergeordnete Einträge (Kinder) hat. TreeView("Expand", hTV&, Item%, 2) Wenn der Eintrag Kinder hat, kann er auf- oder zugeklappt werden. Item% = TreeView("GetSelected", hTV&) Mit dieser Funktion wird ermittelt, welcher Eintrag augenblicklich selektiert ist. TreeView("DeleteItem", hTV&, Item%) Der Eintrag Item% wird aus dem Treeview entfernt. Hat der Eintrag Kinder, werden auch diese entfernt. TreeView("Select", hTV&, item&) Mit dieser Funktion wird ein Eintrag selektiert unf gegebenenfalls in den sichtbaren Bereich gescrollt. SetText hTV&, Item%, Text$ Der Text des Eintrags wird mit Text$ überschrieben. Text$ = GetText$(hTV&, item&) Mit dieser Funktion wird der Text des Eintrags ermittelt. Die Gesamtzahl aller Einträge eines TreeView lässt sich mit GetCount(hTV&) ermitteln. IMAGELIST Um Bilder im TreeView anzuzeigen, benötigt man eine ImageList (Bilderliste). Diese wird mit folgender Create-Funktion erzeugt: hIL& = Create("ImageList", DX%, DY%[, hBmp&[, tCol%]]) Folgende Funktionen gibt es, um das TreeView zu füllen und zu bearbeiten: ImageList("Add", hIL&, hBmp&[, tCol%]) Die Bitmap hBmp& wird der ImageList hinzugefügt. Sollen die Bilder transparent dargestellt werden, ist mit tCol% die Farbe anzugeben, die transparent sein soll. ImageList("AddIcon", hIL&, hIcon&) Das Icon oder der Cursor mit dem Handle hIcon& wird der ImageList hinzugefügt. hIcon& = ImageList("GetIcon", hIL&, Image%) Das Bild Image% aus der Imagelist wird zu einem Icon bzw. Cursor. Es gibt auch eine neue Variante des Befehls DrawIcon, um ein einzelnes Bild einer ImageList anzuzeigen: DrawIcon hIL&, Image%, X%, Y% |
| Browser: HTMLWin Das WebControl "HTMLWin" dient zum Anzeigen von HTML-Seiten, egal ob lokal auf der Platte oder im Internet. Es nutzt das gleiche Control wie der Internet-Explorer. Wie üblich, wird auch dieses Dialogelement mit einer Create-Funktion erstellt: hWC& = Create("HTMLWin", hWnd&, Ziel$, modus%, X%, Y%, DX%, DY%) HTMLWin("GoBack", hWC&) Diese Funktion entspricht dem Zurück-Button des Explorers: Es wird die vorherige HTML-Seite angezeigt. HTMLWin("GoForward", hWC&) Nach einem "GoBack" kann man mit dieser Funktion wieder vorwärts blättern. HTMLWin("GoHome", hWC&) Es wird die in den Internetoptionen des Betriebssystems eingestellte Startseite aufgerufen. HTMLWin("GoSearch", hWC&) Es wird die in den Internetoptionen des Betriebssystems eingestellte Suchseite aufgerufen. HTMLWin("Stop", hWC&) Das Laden der aktuellen Seite wird abgebrochen. HTMLWin("Refresh", hWC&) Die aktuelle Seite wird erneut geladen. HTMLWin("Navigate", hWC&, Ziel$) Es wird neues Tiel gewählt und angezeigt. busy% = HTMLWin("GetBusy", hWC&) Mit dieser Funktion kann überprüft werden, ob das Control mit dem Laden und Darstellen einer Seite fertig ist. |
| Subclassing mit XProfan Was ist Subclassing? Jedes Fenster oder Dialogelement in Windows hat eine Fensterprozedur, die die Messages verarbeitet, die an dieses Fenster geschickt werden. Diese Fensterprozedur reagiert entweder selbst auf diese Messages oder reicht sie direkt an Windows zur Verarbeitung weiter. Mit dem SubClassing können wir die Messages für ein (oder mehrere) Fenster ersteinmal zu einer eigenen Prozedur umleiten, in dem wir der Fensterklasse unsere eigene Prozedur als Fensterprozedur unterschieben. Darin können wir dann Messages, die uns interessieren abfangen und entsprechend reagieren. Und damit Windows nicht aus dem Takt kommt, leiten wir die Messages, die wir nicht oder nur teilweise bearbeiten zum Schluß an die Original Windowsprozedur weiter, so dass Windows diese wie üblich behandeln kann. Um die Messages eines Fensters oder Dialogelementes umzuleiten, gibt es den Befehl SubClass: SubClass hWnd&, n% Sobald das Subclassing eingeschaltet ist, werden alle Messages zu unserer Subclassing-Prozedur umgeleitet. In XProfan gibt es eine spezielle Prozedur für das das Bearbeiten der umgeleiteten Messages: SubClassProc. Wie alle Prozeduren wird auch diese mit EndProc beendet. Ganz wichtig hier der Befehl SetWinProc, denn dieser legt fest, ob anschließend die ursprüngliche Windowsprozedur noch aufgerufen wird oder nicht: Set("WinProc", n%) Normalerweise muß die Windowsprozedur für alle Fälle aufgerufen werden, die unsere Subclassing-Prozedur nicht abdeckt. Da "WinProc" defaultmäßig auf 1 gesetzt ist, sieht eine minimalistische SubclassingProzedur also so aus: Damit man auf die umgeleiteten Messages reagieren kann, gibt es vier neue Systemvariablen, die nur innerhalb der SubClassProc gültig sind: &sWnd: Handle des Fensters, an das die Message gerichtet ist. Das ist wichtig, wenn wir mehrere Fenster/Dialogelemente Subclassen. %sMessage: Umgeleitete Message &sWParam: Der WParam-Wert der Message &sLParam: Der LParam-Wert der Message Und damit das Abfragen etwas einfacher wird gibt es eine neue Funktion: n% = SubClassMessage(hWnd&, MsgNr%) Diese Funktion gibt 1 zurück, wenn die umgeleitete Message die Nummer MsgNr% hat und für das Fenster/Dialogelement mit dem Handle hWnd% bestimmt ist. Der Vollständigkeit halber: n% = Get("WinProc") Hiermit ermitteln wir der aktuellen Wert von WinProc (entweder 0 oder 1) |
Sonstige Erweiterungen
|
Erweiterung bekannter
Funktionalitäten
|
|
Mehr Infos: Eine ausführliche Hilfedatei mit allen Neuerungen, Verbessserungen und Listings befindet sich hier: XProfan11.chm |