Source/ Codesnippets | | | |  | Wiedermal dank Sebastian König peux avec diesem Snipped qui forme de Windows beliebig modifié volonté:
+----------------------------------------------------------+
| combrgn.prf |
| Autor: Sebastian König |
| email: feedback@sekoenig.de |
| Page d'accueil: http://www.sekoenig.de |
| Spielereien avec CombineRgn() |
+----------------------------------------------------------+
+===================================================+
# cette Voir le texte source baut sur Code aus PRFellow 99 #
# de Thomas Bois sur. à cette Stelle encore #
# la fois vielen Dank et un grosses Lob à den #
# Autor! #
# #
# plus trop PRFellow gibt`s sous: #
# 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& pour CombineRgn()
---Neues la fenêtre erstellen
style de fenêtre 16
window 0,0-400,400
windowtitle ...
maintenant allez`s à l'attaque...
---la fenêtre avec eckigem Loch
SetWindowPos %hwnd=0,0-400,400 la fenêtre anpassen
windowtitle Eckiges Loch
cls 0 avec cela cela Ergebnis besser
sichtbar wird
Couleur du texte @RGB(31,31,31),-1
DrawText 1,1,Mausklick = Weiter
let DEST& = CreateRectRgn(0,0,0,0) qui neue région avec 0 initialisiern
let SOURCE1& = CreateRectRgn(0,0,400,400) qui 1. qui beiden trop kombinierenden
Regionen
let SOURCE2& = CreateRectRgn(100,100,300,300) ...et qui 2.
CombineRgn(DEST&,SOURCE1&,SOURCE2&,3) qui beiden Regionen volonté kombiniert
et cela Ergebnis wird dans
DEST& gespeichert
SetWindowRgn(%hwnd,DEST&,1) eh bien ändern wir seulement encore qui région
des Fensters...
waitinput attendre...
---la fenêtre avec rundem Loch
SetWindowPos %hwnd=%winLeft,%winTop-400,400
windowtitle Rundes Loch
cls 0
Couleur du texte @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 dessus...
CombineRgn(DEST&,SOURCE1&,SOURCE2&,3) |
|
SetWindowRgn(%hwnd,DEST&,1) /
waitinput et wieder attendre...
---la fenêtre, cela dans 2 Hälften geteilt ist
SetWindowPos %hwnd=%winLeft,%winTop-400,400
windowtitle Geteiltes Fenêtre
cls 0
Couleur du texte @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 dessus...
CombineRgn(DEST&,SOURCE1&,SOURCE2&,3) |
|
SetWindowRgn(%hwnd,DEST&,1) /
waitinput cela übliche...
---aussi geteilt, seulement anders....
SetWindowPos %hwnd=%winLeft,%winTop-400,400
windowtitle Geteiltes Fenêtre, qui 2.
cls 0
Couleur du texte @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 dessus...
CombineRgn(DEST&,SOURCE1&,SOURCE2&,3) |
|
SetWindowRgn(%hwnd,DEST&,1) /
waitinput et wieder...
---Schlüsselloch-la fenêtre
SetWindowPos %hwnd=%winLeft,%winTop-200,300
windowtitle ... Sieht on eh´ pas entier...
cls 0
Couleur du texte @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 dessus...
CombineRgn(DEST&,SOURCE1&,SOURCE2&,2) |
|
SetWindowRgn(%hwnd,DEST&,1) /
waitinput quoi aussi sonst?
---4-geteiltes-la fenêtre
SetWindowPos %hwnd=%winLeft,%winTop-400,400
windowtitle 4-geteiltes-la fenêtre
cls 0
Couleur du texte @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 dessus...
|
CombineRgn(DEST&,SOURCE1&,SOURCE2&,2) /
maintenant wird es anders:
let SOURCE1& = DEST& wir Sauver DEST dans SOURCE1,
let SOURCE2& = CreateRectRgn(0,170,400,230) erstellen encore une région...
CombineRgn(DEST&,SOURCE1&,SOURCE2&,4) ...et kombinieren un 2. la fois
SetWindowRgn(%hwnd,DEST&,1) ab maintenant wieder alles comment dessus...
waitinput aussi cela bleibt juste...
---et cela était`s...
DeleteObject(DEST&) wir donner qui erstellten Regionen
DeleteObject(SOURCE1&) wieder libre
DeleteObject(SOURCE2&) (Dank à Christian Zietz)
end
|
| | | | |
| |  | qui Dank pour cette Code allez à Herrn Dieter Zornow Stand 06/04, source: [...] 
Fenêtre Regionen
Autor: Dieter Zornow
pas alle Def´s sommes benutzt
Code ist libre
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 qui région, 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
paramètre %hdc, handle qui région, 1 ou bien 2 pour brushauswahl,Rahmenbreite,Rahmenhöhe,brushstyle,color
parameters hdc&,rgn&,brush&,x%,y%,style&,col&
Déclarer sb&
cas Brush& = 1:sb& = CreateHatchBrush(style&,col&)
cas Brush& = 2:sb& = CreateSolidBrush(col&)
FrameRgn(hdc&,rgn&,sb&,x%,y%)
DeleteObject(sb&)
endproc
Proc InvertRgn XOR, beim zweiten Aufruf wieder normal
paramètre %hdc, handle qui région
parameters hdc&,hndl&
InvertRgn(hdc&,hndl&)
InvertRgn(%hdc2,hndl&) Sicherungskopie
endproc
Proc CreateRechteck
paramètre xecke, yecke, länge, höhe
parameters x%,y%,xl%,yh%
Déclarer Hndl&
xl% = x%+xl%
yh% = y%+yh%
hndl& = CreateRectRgn(x%,y%,xl%,yh%)
return hndl&
endproc
Proc CreateKreis
paramètre xecke, yecke, Durchmesser, Durchmesser - > chez Kreis, / chez Elipse Werte je pour Taille
parameters x%,y%,xl%,yh%
Déclarer Hndl&
xl% = x%+xl%
yh% = y%+yh%
hndl& = CreateEllipticRgn(x%,y%,xl%,yh%)
return hndl&
endproc
Proc CreateRundEck
paramètre xecke, yecke, länge, höhe abrunden, weite abrunden
parameters x%,y%,xl%,yh%,h%,w%
Déclarer Hndl&
xl% = x%+xl%
yh% = y%+yh%
hndl& = CreateRoundRectRgn(x%,y%,xl%,yh%,h%,w%)
return hndl&
endproc
Proc CreateVieleck Anzahl paramètre muss toujours un vielfaches de 2 son.
Variable Anzahl de Parametern, je pour Eckenzahl, chacun coin nécessaire 2 Werte, x et Y
Déclarer ecken%,hndl&,point#,offset%,point1#
ecken% = %PCount
offset% = 0
Faible point#,ecken% * 4
whileloop ecken% ab Profan 7 au-dessous dans une normale tandis que - Boucle transformer et jusqu'à ecken% aufzählen
long point#,offset% = @%(&loop)
offset% = offset% + 4
endwhile
hndl& = CreatePolygonRgn(point#,(ecken% / 2),2)
Dispose point#
return hndl&
endproc
proc Sfillregn
paramètre %hdc, handle qui région, Color
parameters hdc&,hndl&,col&
Déclarer sb&
sb& = CreateSolidBrush(col&)
FillRgn(hdc&,hndl&,sb&)
FillRgn(%hdc2,hndl&,sb&)
DeleteObject(sb&)
endproc
proc Hfillregn
paramètre %hdc, handle qui région, brush style, Color
parameters hdc&,hndl&,style&,col&
Déclarer sb&
sb& = CreateHatchBrush(style&,col&)
FillRgn(hdc&,hndl&,sb&)
FillRgn(%hdc2,hndl&,sb&)
DeleteObject(sb&)
endproc
proc compregn
paramètre Handle qui Zielregion, Handle qui 1. trop integrierenden région, Handle qui 2. trop integrierenden région, Integrierungsmodus
parameters HdDes&,Hdsour1&,Hdsour2&,mode&
CombineRgn(HdDes&,Hdsour1&,Hdsour2&,mode&)
endproc
Beispiel
cls
Déclarer 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 et combin2 volonté trop einer région Handle = kr2& RGN_OR
DeleteObject(rk2&) existiert déjà pas plus
CreateVieleck 10,400,50,300,100,400 Dreieck
ve& = @&(0)
Sfillregn %hdc,ve&,255
Localiser 30,30
cas PtInRegion(ve&,30,380) = 1:Imprimer cet Koordinate liegt im Dreieck Abfrage si Koordinate im Dreieck liegt
waitinput
InvertRgn(%hdc,rk&) qui Regionen volonté beim ersten la fois invertiert
InvertRgn(%hdc,kr&)
InvertRgn(%hdc,re&)
InvertRgn(%hdc,kr2&)
InvertRgn(%hdc,rk3&)
InvertRgn(%hdc,ve&)
InvertRgn(%hdc,el&)
waitinput
InvertRgn(%hdc,rk&) qui Regionen volonté beim zweiten la fois 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) Fenêtre wird seulement encore dans diesem Bereich angezeigt, 1 = neuzeichnen, 0 = non
paramètre Fenêtre handle, région 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
-----------------------------------------------------------------------
Pour Vieleck
ALTERNATE = 1 Alternative entre pleine et ungefüllt
WINDING = 2 cela dreieck normal pleine
fnCombineMode
Specifies a mode indicating how le two regions veux être combined. This paramètre can être one of le following values:
Value Description
RGN_AND Creates le intersection of le two combined regions.
RGN_COPY Creates a copy of le région identified by hrgnSrc1.
RGN_DIFF Combines le parts of hrgnSrc1 that sont not part of hrgnSrc2.
RGN_OR Creates le union of two combined regions.
RGN_XOR Creates le 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 QuelltextOptions du sujet | 4.085 Views |
Themeninformationencet Thema hat 1 participant: |
|