http://msdn.microsoft.com/library/en-us ... frame=true
Hat das schon mal jemand gemacht?
Ich will um eine abgerundete Region einen 1 Pixel Rand in schwarz haben.
Das scheint aber die falsche Funktion dafür zu sein oder? Laut Beschreibung kann man da nur ein Bild als Rand nehmen....
FrameRgn - Border um Region
Das IST die richtige Funktion.
Sie erwartet nicht ein Bild als Parameter, sondern einen BRUSH
und dieser kann sowohl Bild, Farbe, oder vordefiniertes, bzw auch
selbstgemachtes Muster sein.
In Deinem Fall:
brush=CreateSolidBrush_(RGB(0,0,0))
Dieser Brush sollte aber wenn er ausgedient hat, oder spätestens
am Programmende mit DeleteObject_(brush) wieder aus dem
Speicher geworfen werden.
Korrektur:
Du könntest in diesem Fall auch einen vorgefertigten Brush verwenden, den Du
anschließend nicht löschen mußt.
brush=GetStockObject_(#BLACK_BRUSH)
Gruß,
Mischa

Sie erwartet nicht ein Bild als Parameter, sondern einen BRUSH
und dieser kann sowohl Bild, Farbe, oder vordefiniertes, bzw auch
selbstgemachtes Muster sein.
In Deinem Fall:
brush=CreateSolidBrush_(RGB(0,0,0))
Dieser Brush sollte aber wenn er ausgedient hat, oder spätestens
am Programmende mit DeleteObject_(brush) wieder aus dem
Speicher geworfen werden.
Korrektur:
Du könntest in diesem Fall auch einen vorgefertigten Brush verwenden, den Du
anschließend nicht löschen mußt.
brush=GetStockObject_(#BLACK_BRUSH)
Gruß,
Mischa
Wie wendet man das konkret an?
So oder muss noch irgendwie SetWindowRgn_() benutzt werden:
Momentan ist es so:
Es wird ein Fenster abgerundet:
Und dieses abgerundete Fenster soll nun einen schwarzen Rahmen bekommen, an den runden Ecken soll der Rand natürlich nicht eckig sein.
So oder muss noch irgendwie SetWindowRgn_() benutzt werden:
Code: Alles auswählen
brush=CreateSolidBrush_(RGB(0,0,0))
FrameRgn_(0,handle,brush,100,150)
Es wird ein Fenster abgerundet:
Code: Alles auswählen
SetWindowRgn_(hWnd,CreateRoundRectRgn_(startx,starty,endx,endy,roundx,roundy),True)
HideWindow(0,0)
Hi!
Sorry, 'FrameRgn' ist dafür eigentlich doch ungeeignet, da der
Rahmen ja um die Region gezeichnet wird.
Das funktioniert zwar, aber sehen kannst Du natürlich nichts
davon, da Du exakt VOR dem Rahmen das Fenster ausschneidest.
Nimmst Du also lieber RoundRect, Ok?
Hier ein schnelles Beispiel...
Gruß,
Mischa
Sorry, 'FrameRgn' ist dafür eigentlich doch ungeeignet, da der
Rahmen ja um die Region gezeichnet wird.
Das funktioniert zwar, aber sehen kannst Du natürlich nichts
davon, da Du exakt VOR dem Rahmen das Fenster ausschneidest.

Nimmst Du also lieber RoundRect, Ok?

Hier ein schnelles Beispiel...
Code: Alles auswählen
#BS_FLAT = 32768
startx=0
starty=0
endx=400
endy=400
roundx=30
roundy=30
OpenWindow(0,0,0,endx,endy,#WS_POPUP|#PB_Window_ScreenCentered,"Test")
hWnd=WindowID()
HideWindow(0,1)
CreateGadgetList(hWnd)
ButtonGadget(0,270,355,80,25,"Beenden",#BS_FLAT)
region=CreateRoundRectRgn_(startx,starty,endx,endy,roundx,roundy)
SetWindowRgn_(hWnd,region,#True)
DeleteObject_(region)
brush=GetStockObject_(#HOLLOW_BRUSH)
pen=GetStockObject_(#BLACK_PEN)
CreateImage(0,endx,endy)
hDC=StartDrawing(ImageOutput())
Box(0,0,endx,endy,RGB(200,200,255))
SelectObject_(hDC,brush)
SelectObject_(hDC,pen)
RoundRect_(hDC,startx,starty,endx-1,endy-1,roundx,roundy)
StopDrawing()
imagebrush=CreatePatternBrush_(UseImage(0))
SetClassLong_(hWnd,#GCL_HBRBACKGROUND,imagebrush)
HideWindow(0,0)
Repeat
Event=WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadgetID()
Case 0
quit=1
EndSelect
Case #WM_LBUTTONDOWN
SendMessage_(WindowID(),#WM_SYSCOMMAND,#SC_MOVE + #HTCAPTION,0)
EndSelect
Until quit=1
DeleteObject_(imagebrush)
Mischa