Quelltexte/ Codesnippets | | | | | 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
|
| | | | |
| | | 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 }
|
| | | | |
|
Zum QuelltextThemenoptionen | 3.744 Betrachtungen |
ThemeninformationenDieses Thema hat 1 Teilnehmer: |
|