Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 243031 (4467)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Fenster abrunden?
Sascha Willecke
| Datum:10.12.01 13:48 (sascha@willecke-net.de) |
Hallo, ich möchte ein fenster machen das abgerundete ecken hat! Es ist dabei nicht wichtig ob es wirklich angerundet ist oder ob es nur rundegrafiken anzeigt! Allerdings muss die grafik ja irgendwie transparent oder so angezeigt werden? Wer kann mir hier helfen? Gruß Sascha
Moritz Kersten
| Datum:10.12.01 16:36 (IsNoGood2000@aol.com) |
Nochmal Hallo, auch dazu gibt es eine Vorlage in PRFellow, da du dieses anscheinend nicht hast (warum nicht?), ist das natürlich etwas schwierig weil es nicht mehr zum Download gibt und vorlagen ja nicht veröffentlicht werden dürfen. Anscheinend hat TH aber eine letzte Version als Weinachtsgeschenk geplant. Ansonsten kannst du ja mal mit Windowstyle 32 ein bisschen rumprobieren. Moritz
Sascha
| Datum:10.12.01 17:27 (sascha@willecke-net.de) |
Hallo, es gibt doch da so eine funktion womit man kuriose fensterformen verwirklichen kann! Damit müsste es doch gehen oder? Wer weiß welche funktion das ist und kann vielleicht nen link bzw. demo sagen! Gruß Sascha
Jörg Sellmeyer
| Datum:10.12.01 19:15 (joerse@gmx.de) |
Hallo Sascha, Hier ist was aus meiner Sammelkiste. Sebastian Meyer hat das mal veröffentlicht:
      HRGN CreatePolygonRgn(
        CONST POINT  *lppt, // address of array of points
        int  cPoints, // number of points in array
        int  fnPolyFillMode  // polygon-filling mode
       );

    Der erste Parameter ist ein Array des Datentyps POINT. Diese ist wie folgt deklariert:

     typedef struct tagPOINT { // pt
        LONG x;
        LONG y;
    } POINT;

    In PROFAN² setzt man ihn in eine Bereichsvariable um:

     Declare Point#
    Dim Point#,8
    Long Point#,0=x
    Long Point#,4=y
    Dispose Point

    Wenn man nun ein Array darausmacht, dann packt man in eine Bereichsvariable mehrere Werte. das sieht dann so aus:

     Declare Point#
    Dim Point#,24
    Long Point#,0=x1
    Long Point#,4=y1
    Long Point#,8=x2
    Long Point#,12=y2
    Long Point#,16=y3
    Long Point#,20=y3
    Dispose Point#

    Der zweite Parameter ist ein int. Hier kann man also direkt eine Zahl übergeben. Man muß an diese Stellen angeben, wie viele Einträge im Array (in unserer Bereichsvariable) sind.
    Der dritte Parameter ist wieder ein int. Hier gibt man den Füllmodus für das Polygon an. Dies ist nur von Bedeutung wenn man sehr komplexe Polygone benutzt. Dies ist bei den meisten Fensterformen aber nicht der Fall. Deswegen geben wir hier der Einfachheit halber 0 an.
    Als Rückgabewert erhalten wir das Handle auf die erstellte Region. Das können wir der Einfachheit halber als Longint abspeichern.
    Um die Region hinterher auf das Fenster zu legen, benötigen wir die Funktion SetWindowRgn aus der GDI32:

     int SetWindowRgn(
        HWND  hWnd, // handle to window whose window region is to be set
        HRGN  hRgn, // handle to region
        BOOL  bRedraw // window redraw flag
       );

    Hier übergibt man als ersten Parameter das Handle des Fensters, auf das sie Region angewandt werden soll, als zweiten Parameter das Handle der Region und als dritten Parameter 1, um das Fenster neu zeichenen zu lassen.

    Zum Schluß muß natürlich auch wieder der Speicher freigegeben werden. Dazu benutzen wir wieder aus der GDI32 die Funktion DeleteObject:

     BOOL DeleteObject(
        HGDIOBJ  hObject  // handle of graphic object
       );

    Als einziger Parameter wird das Handel der zu löschenen Region übergeben.

    Mit diesem Wissen können wir uns nun also an die erstellung eines unregelmäßigen Fensters machen:

     DEF CreatePolyRgn(3) !"GDI32Q","CreatePolygonRgn"
    DEF SetWindowRgn(3) !"USER32","SetWindowRgn"
    DEF DeleteObject(1) !"GDI32","DeleteObject"
    Declare rgn&
    Declare pt#

    Dim pt#,24
    Long pt#,0=0
    Long pt#,4=0
    Long pt#,8=100
    Long pt#,12=100
    Long pt#,16=200
    Long pt#,20=50

    Let rgn&=CreatePolyRgn(pt#,3,0)

    Windowstyle 80
    Cls 1524

    SetWindowRgn(%Hwnd,rgn&,0)

    Waitinput

    Dispose pt#
    DeleteObject(rgn&)

    Und voila: schon haben wir eine unregelmäßeige Fensterform mit PROFAN²! Vielen Dank für Ihr Interesse.

    --------------------------------------------------------------------------------

    Copyright © 28.05.2000 Sebastian Meyer
    Eventuell verwendete fremde Produktbezeichnungen sind eingetragene Warenzeichen der jeweiligen Hersteller oder stehen unter dessen Urheberrechtschutz.
Hallo Sascha
| Datum:11.12.01 15:04 (andreas@andreas-miethe.de) |
Hier ein Tool fuer solche Sachen. http://www.ampsoft.de/daten/rgntest.zip Gruss Andreas
Sven Bader
| Datum:14.04.02 15:31 (sven@v-world.de) |
hallo andreas, bei mir funktioniert dein beispiel leider nicht, es wird das ganze bild als rechteck angezeigt, also mit dem roten huntergrund. ich benutze profan 7.5 mit windows xp. von dir stammte doch auch die profan-lösung "BitmapRgn.prf" ? die ist leider viel zu langsam. selbst wenn man diesen vorgang beschleunigen könnte, indem man horizontale streifen anstatt pixel definiert (dürfen natürlich dann keine "löcher" im fenster sein), würde es scheinbar trotzdem nicht gehen weil das fenster bei mir nachdem es fertig erstellt wurde auf nichts mehr reagiert oder war das mein fehler? ich wäre sehr an freien fensterformen interessiert und wäre froh, wenn sich da in profan etwas machen lassen würde. gruß, sven
Andreas Miethe
| Datum:15.04.02 15:04 (andreas@andreas-miethe.de) |
Hallo Sven, es gibt schon ein Update fuer XP. http://www.ampsoft.de/daten/rgntest1.zip Gruss Andreas
Sven Bader
| Datum:14.04.02 22:20 (sven@v-world.de) |
so... der fehler war nur weil sich der quelltext nicht mit set fastmode vertragen hat. das erstellen des nikolausfensters hatte bei mir 17,3 sekunden gedauert, das konnte ich auf 4,7 sekunden herunter optimieren! das ist jetzt schon fast zumutbar für einen programmstart. was ich verändert habe? anstatt das jeder pixel als rechteck als fensterteil definiert wird suche ich jetzt nach zusammenhängenden streifen und spare mir somit einen großteil der CombineRgn(). dabei sind weiterhin alle fensterformen möglich, egal wieviele "löcher" sie enthalten. desweiteren beziehe ich die nicht mehr aus der bunten fenstergrafik sondern aus einer schwarz weiß maske, die ich zuvor in einen bereich lade. ich bin noch dabei, einen allgemeinen quelltext zu erstellen, denn beim einlesen der bitmaps gibt es teilweise noch probleme. mir ist noch eine sache eingefallen um alles weiter zu beschleunigen: man kann die rechtecks-informationen, in diesem fall die der streifen in einer datei ablegen. dann müssen diese werte beim programmstart nicht mehr selbst ermittelt werden, womit man sich das einlesen des masken-bitmaps erspart. ich schätze, dass die ganze prozedur dann nur noch 2-3 sekudnen dauert!
Mischa Brandt
| Datum: 19.04.02 20:23 |
Hi Sven! Meiner Erfahrung nach ist es sogar noch schneller, als 2 Sek. Ich habe da mal einen ähnliches Tool gemacht, daß eine Maske von einer Bitmap erstellt (allerdings auf Polygonal-Basis und die 'Löcher' muß man per hand und 'Digital-Cutter' selbst ausschneiden) und die Daten mitsamt der dank Nviewlib als Jpg konvertierten Bitmap in eine Datei schreibt. Das laden (mit Frank Abbings ReadFileFast) und zwischenspeichern der JPG-Datei geht so schnell, daß ich sogar ein Fenster durch mehrere Masken und Bilder relativ flüssig animieren konnte! Aber wozu der Aufwand, die Rgntest.dll von Andreas Miethe ist doch klasse! ;-) Gruß, Mischa

| Zurück zur Übersicht