Deutsch
Quelltexte/ Codesnippets

Bestimmen Combinergn Fensterformen

 
Wiedermal dank Sebastian König kann mit diesem Snipped die Form von Fenstern beliebig verändert werden:
+----------------------------------------------------------+
| combrgn.prf                                              |
| Autor: Sebastian König                                   |
| email: feedback@sekoenig.de                              |
| Homepage: http://www.sekoenig.de                         |
| Spielereien mit CombineRgn()                             |
+----------------------------------------------------------+
+===================================================+
# Dieser Quelltext baut auf Code aus PRFellow 99    #
# von Thomas Hölzer auf. An dieser Stelle noch      #
# mal vielen Dank und ein grosses Lob an den        #
# Autor!                                            #
#                                                   #
# Mehr zu PRFellow gibt`s unter:                    #
# http://prfellow.home.pages.de                   #
+===================================================+
--Benötigte Funktionen
DEF SetWindowRgn(3) !USER32,SetWindowRgn
DEF CreateEllipticRgn(4) !GDI32,CreateEllipticRgn
DEF CreateRectRgn(4) !GDI32,CreateRectRgn
DEF CreatePolyRgn(3) !GDI32,CreatePolygonRgn
DEF CombineRgn(4) !GDI32,CombineRgn
DEF DeleteObject(1) !GDI32,DeleteObject
--Deklarationen
declare DEST&,SOURCE1&,SOURCE2&                für CombineRgn()
---Neues Fenster erstellen
windowstyle 16
window 0,0-400,400
windowtitle ...
Jetzt geht`s los...
---Fenster mit eckigem Loch
SetWindowPos %hwnd=0,0-400,400                   Fenster anpassen
windowtitle Eckiges Loch
cls 0                                            Damit das Ergebnis besser
sichtbar wird
TextColor @RGB(31,31,31),-1
DrawText 1,1,Mausklick = Weiter
let DEST&    = CreateRectRgn(0,0,0,0)            Die neue Region mit 0 initialisiern
let SOURCE1& = CreateRectRgn(0,0,400,400)        Die 1. der beiden zu kombinierenden
Regionen
let SOURCE2& = CreateRectRgn(100,100,300,300)    ...und die 2.
CombineRgn(DEST&,SOURCE1&,SOURCE2&,3)            Die beiden Regionen werden kombiniert
und das Ergebnis wird in
DEST& gespeichert
SetWindowRgn(%hwnd,DEST&,1)                      Nun ändern wir nur noch die Region
des Fensters...
waitinput   warten...
---Fenster mit rundem Loch
SetWindowPos %hwnd=%winLeft,%winTop-400,400
windowtitle Rundes Loch
cls 0
TextColor @RGB(31,31,31),-1
DrawText 1,1,Mausklick = Weiter
let DEST&    = CreateRectRgn(0,0,0,0)
let SOURCE1& = CreateRectRgn(0,0,400,400)             |
let SOURCE2& = CreateEllipticRgn(100,100,300,300)     |
>  siehe oben...
CombineRgn(DEST&,SOURCE1&,SOURCE2&,3)                 |
|
SetWindowRgn(%hwnd,DEST&,1)                          /
waitinput   und wieder warten...
---Fenster, das in 2 Hälften geteilt ist
SetWindowPos %hwnd=%winLeft,%winTop-400,400
windowtitle Geteiltes Window
cls 0
TextColor @RGB(31,31,31),-1
DrawText 1,1,Mausklick = Weiter
let DEST&    = CreateRectRgn(0,0,0,0)
let SOURCE1& = CreateRectRgn(0,0,170,400)             |
let SOURCE2& = CreateRectRgn(230,0,400,400)           |
>  siehe oben...
CombineRgn(DEST&,SOURCE1&,SOURCE2&,3)                 |
|
SetWindowRgn(%hwnd,DEST&,1)                          /
waitinput   das übliche...
---Auch geteilt, nur anders....
SetWindowPos %hwnd=%winLeft,%winTop-400,400
windowtitle Geteiltes Window, die 2.
cls 0
TextColor @RGB(31,31,31),-1
DrawText 1,1,Mausklick = Weiter
let DEST&    = CreateRectRgn(0,0,0,0)
let SOURCE1& = CreateRectRgn(0,0,200,200)             |
let SOURCE2& = CreateEllipticRgn(200,200,400,400)     |
>  siehe oben...
CombineRgn(DEST&,SOURCE1&,SOURCE2&,3)                 |
|
SetWindowRgn(%hwnd,DEST&,1)                          /
waitinput   und wieder...
---Schlüsselloch-Fenster
SetWindowPos %hwnd=%winLeft,%winTop-200,300
windowtitle ...     Sieht man eh´ nicht ganz...
cls 0
TextColor @RGB(31,31,31),-1
DrawText 33,1,Mausklick = Weiter
let DEST&    = CreateRectRgn(0,0,0,0)
let SOURCE1& = CreateEllipticRgn(0,0,200,200)         |
let SOURCE2& = CreateRectRgn(50,100,150,400)          |
>  siehe oben...
CombineRgn(DEST&,SOURCE1&,SOURCE2&,2)                 |
|
SetWindowRgn(%hwnd,DEST&,1)                          /
waitinput   was auch sonst?
---4-geteiltes-Fenster
SetWindowPos %hwnd=%winLeft,%winTop-400,400
windowtitle 4-geteiltes-Fenster
cls 0
TextColor @RGB(31,31,31),-1
DrawText 1,1,Mausklick = Ende
let DEST&    = CreateRectRgn(0,0,0,0)
let SOURCE1& = CreateRectRgn(0,0,170,400)        |
let SOURCE2& = CreateRectRgn(230,0,400,400)       > siehe oben...
|
CombineRgn(DEST&,SOURCE1&,SOURCE2&,2)            /
jetzt wird es anders:
let SOURCE1& = DEST&                            wir speichern DEST in SOURCE1,
let SOURCE2& = CreateRectRgn(0,170,400,230)     erstellen noch eine Region...
CombineRgn(DEST&,SOURCE1&,SOURCE2&,4)           ...und kombinieren ein 2. Mal
SetWindowRgn(%hwnd,DEST&,1)                     ab jetzt wieder alles wie oben...
waitinput   auch das bleibt gleich...
---Und das war`s...
DeleteObject(DEST&)                             wir geben die erstellten Regionen
DeleteObject(SOURCE1&)                          wieder frei
DeleteObject(SOURCE2&)                          (Dank an Christian Zietz)
end
 
20.04.2004  
 



Der Dank für diesen Code geht an Herrn Dieter Zornow
Stand 06/04, Quelle:  [...] 

Window Regionen
Autor: Dieter Zornow
Nicht alle Def´s sind benutzt
Code ist frei
Def WindowFromDC(1) ! user32,WindowFromDC
Def GetDC(1) ! user32,GetDC
Def GetWindowDC(1) ! user32,GetWindowDC
Def ReleaseDC(2) ! user32,ReleaseDC
Def SaveDC(1) ! gdi32,SaveDC
Def RestoreDC(2) ! gdi32,RestoreDC
Def GetCurrentObject(2) ! gdi32,GetCurrentObject
Def GetWindowRgn(2) ! user32,GetWindowRgn hndl&,reg-hndl&
Def SetWindowRgn(3) ! user32,SetWindowRgn hndl&,reghndl&,redrawflag
Def DeleteObject(1) ! gdi32,DeleteObject hndl&
Def SelectObject(2) ! gdi32,SelectObject hdc,hndl&
Def InvertRgn(2) ! gdi32,InvertRgn hdc&,hdnl&
Def FillRgn(3) ! gdi32,FillRgn hdc, handl,brush
Def PaintRgn(2) ! gdi32,PaintRgn hdc,handl
Def FrameRgn(5) ! gdi32,FrameRgn
Def GetRgnBox(2) ! gdi32,GetRgnBox  hdnl,rect
Def CombineRgn(4) ! gdi32,CombineRgn
Def Moverect(3) ! gdi32,OffsetRgn
Def PtInRegion(3) ! gdi32,PtInRegion hndl der Region, x, y
Def PtVisible(3) ! gdi32,PtVisible
Def RectVisible(2) ! gdi32,RectVisible hdc,rect#
Def RectInRegion(2) ! gdi32,RectInRegion
Def SetRectRgn(5) ! gdi32,SetRectRgn
Def CreateRectRgn(4) ! gdi32,CreateRectRgn
Def CreateEllipticRgn(4) ! gdi32,CreateEllipticRgn
Def CreateRoundRectRgn(6) ! gdi32,CreateRoundRectRgn x%,y%,x1%,y2%,height%,width%
Def CreatePolygonRgn(3) ! gdi32,CreatePolygonRgn
Def CreateSolidBrush(1) ! GDI32,CreateSolidBrush
Def CreateHatchBrush(2) ! GDI32,CreateHatchBrush
Def CreatePen(3) ! gdi32,Def CreatePen
Def CreatePenIndirect(3) ! gdi32,CreatePenIndirect

proc Rahmenrec

    Parameter %hdc, handle der region, 1 oder 2 für brushauswahl,Rahmenbreite,Rahmenhöhe,brushstyle,color
    parameters hdc&,rgn&,brush&,x%,y%,style&,col&
    Declare sb&
    case Brush& = 1:sb& = CreateHatchBrush(style&,col&)
    case Brush& = 2:sb& = CreateSolidBrush(col&)
    FrameRgn(hdc&,rgn&,sb&,x%,y%)
    DeleteObject(sb&)

endproc

Proc InvertRgn XOR, beim zweiten Aufruf wieder normal

    parameter %hdc, handle der Region
    parameters hdc&,hndl&
    InvertRgn(hdc&,hndl&)
    InvertRgn(%hdc2,hndl&) Sicherungskopie

endproc

Proc CreateRechteck

    Parameter xecke, yecke, länge, höhe
    parameters x%,y%,xl%,yh%
    Declare Hndl&
    xl% = x%+xl%
    yh% = y%+yh%
    hndl& = CreateRectRgn(x%,y%,xl%,yh%)
    return hndl&

endproc

Proc CreateKreis

    Parameter xecke, yecke, Durchmesser, Durchmesser - > bei Kreis,  / bei Elipse Werte je nach Größe
    parameters x%,y%,xl%,yh%
    Declare Hndl&
    xl% = x%+xl%
    yh% = y%+yh%
    hndl& = CreateEllipticRgn(x%,y%,xl%,yh%)
    return hndl&

endproc

Proc CreateRundEck

    Parameter xecke, yecke, länge, höhe abrunden, weite abrunden
    parameters x%,y%,xl%,yh%,h%,w%
    Declare Hndl&
    xl% = x%+xl%
    yh% = y%+yh%
    hndl& = CreateRoundRectRgn(x%,y%,xl%,yh%,h%,w%)
    return hndl&

endproc

Proc CreateVieleck Anzahl Parameter muss immer ein vielfaches von 2 sein.

    Variable Anzahl von Parametern, je nach Eckenzahl, jede Ecke benötigt 2 Werte, x und Y
    Declare ecken%,hndl&,point#,offset%,point1#
    ecken% = %PCount
    offset% = 0
    Dim point#,ecken% * 4

    whileloop ecken% ab Profan 7 darunter in eine normale while - Schleife umwandeln und bis ecken% aufzählen

        long point#,offset% = @%(&loop)
        offset% = offset% + 4

    endwhile

    hndl& = CreatePolygonRgn(point#,(ecken% / 2),2)
    Dispose point#
    return hndl&

endproc

proc Sfillregn

    Parameter %hdc, handle der Region, Color
    parameters hdc&,hndl&,col&
    Declare sb&
    sb& = CreateSolidBrush(col&)
    FillRgn(hdc&,hndl&,sb&)
    FillRgn(%hdc2,hndl&,sb&)
    DeleteObject(sb&)

endproc

proc Hfillregn

    Parameter %hdc, handle der Region, brush style, Color
    parameters hdc&,hndl&,style&,col&
    Declare sb&
    sb& = CreateHatchBrush(style&,col&)
    FillRgn(hdc&,hndl&,sb&)
    FillRgn(%hdc2,hndl&,sb&)
    DeleteObject(sb&)

endproc

proc compregn

    Parameter Handle der Zielregion, Handle der 1. zu integrierenden Region, Handle der 2. zu integrierenden Region, Integrierungsmodus
    parameters HdDes&,Hdsour1&,Hdsour2&,mode&
    CombineRgn(HdDes&,Hdsour1&,Hdsour2&,mode&)

endproc

Beispiel
cls
Declare rk&,kr&,re&,ve&,kr2&,rk2&,rk3&,el&
CreateRechteck 10,10,50,20 1 Rechteck
rk& = @&(0)
sfillregn %hdc,rk&,255
CreateKreis 10,35,50,50  Kreis
kr& = @&(0)
sfillregn %hdc,kr&,16740608
CreateKreis 100,35,25,50  Elipse
el& = @&(0)
sfillregn %hdc,el&,16740608
CreateRundEck 10,90,50,30,20,30
re& = @&(0)
sfillregn %hdc,re&,65280
CreateKreis 10,130,50,50 combin 1
kr2& = @&(0)
Hfillregn %hdc,kr2&,5,65535
CreateRechteck 58,145,50,20 Combin 2
rk2& = @&(0)
Hfillregn %hdc,rk2&,5,65535
CreateRechteck 10,185,50,20 umrahmtes Rechteck
rk3& = @&(0)
Rahmenrec %hdc,rk3&,2,2,2,0,255
compregn kr2&,kr2&,rk2&,2 combin1 und combin2 werden zu einer Region Handle = kr2& RGN_OR
DeleteObject(rk2&) existiert schon nicht mehr
CreateVieleck 10,400,50,300,100,400 Dreieck
ve& = @&(0)
Sfillregn %hdc,ve&,255
Locate 30,30
case PtInRegion(ve&,30,380) = 1:Print Diese Koordinate liegt im Dreieck Abfrage ob Koordinate im Dreieck liegt
waitinput
InvertRgn(%hdc,rk&) Die Regionen werden beim ersten mal invertiert
InvertRgn(%hdc,kr&)
InvertRgn(%hdc,re&)
InvertRgn(%hdc,kr2&)
InvertRgn(%hdc,rk3&)
InvertRgn(%hdc,ve&)
InvertRgn(%hdc,el&)
waitinput
InvertRgn(%hdc,rk&) Die Regionen werden beim zweiten mal wieder normal angezeigt
InvertRgn(%hdc,kr&)
InvertRgn(%hdc,re&)
InvertRgn(%hdc,kr2&)
InvertRgn(%hdc,rk3&)
InvertRgn(%hdc,ve&)
InvertRgn(%hdc,el&)
waitinput
SetWindowRgn(%Hwnd,ve&,1) Window wird nur noch in diesem Bereich angezeigt, 1 = neuzeichnen, 0 = nein
Parameter Window handle, Region handle, neuzeichen
waitinput
DeleteObject(rk&) alles wieder freigeben, ist notwendig
DeleteObject(kr&)
DeleteObject(re&)
DeleteObject(kr2&)
DeleteObject(rk2&)
DeleteObject(rk3&)
DeleteObject(ve&)
DeleteObject(el&)
end
-----------------------------------------------------------------------
Für Vieleck
ALTERNATE = 1 Alternative zwischen Gefüllt und ungefüllt
WINDING = 2 Das dreieck normal gefüllt
fnCombineMode
Specifies a mode indicating how the two regions will be combined. This parameter can be one of the following values:
Value	Description
RGN_AND	Creates the intersection of the two combined regions.
RGN_COPY	Creates a copy of the region identified by hrgnSrc1.
RGN_DIFF	Combines the parts of hrgnSrc1 that are not part of hrgnSrc2.
RGN_OR	        Creates the union of two combined regions.
RGN_XOR	Creates the union of two combined regions except for any overlapping areas.
{ CombineRgn() Styles }
RGN_AND = 1;
RGN_OR = 2;
RGN_XOR = 3;
RGN_DIFF = 4;
RGN_COPY = 5;
RGN_MIN = ~RGN_AND;
RGN_MAX = ~RGN_COPY;
Hatch-brush-werte
HS_HORIZONTAL = 0;       { ----- }
HS_VERTICAL   = 1;       { ||||| }

HS_FDIAGONAL  = 2;       {///// }

    HS_BDIAGONAL  = 3;       { \\ }
    HS_CROSS      = 4;       { +++++ }
    HS_DIAGCROSS  = 5;       { xxxxx }
 
02.06.2004  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.744 Betrachtungen

Unbenanntvor 0 min.
p.specht14.07.2018
Paul Glatz27.09.2014
Manfred Barei27.12.2013
Julian Schmidt24.10.2012
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

unbekannt (2x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie