Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 241200 (2636)
  Suchen
 Zurück zur Übersicht
 AutorThema: Fenster abrunden?
Sascha Willecke
Datum:10.12.01 13:48 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken  


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