FrameRgn - Border um Region

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

FrameRgn - Border um Region

Beitrag von Delle »

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....
Benutzeravatar
Mischa
Beiträge: 152
Registriert: 29.08.2004 06:52
Wohnort: Hellhorst

Beitrag von Mischa »

Das IST die richtige Funktion. :wink:

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
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag von Delle »

Wie wendet man das konkret an?

So oder muss noch irgendwie SetWindowRgn_() benutzt werden:

Code: Alles auswählen

brush=CreateSolidBrush_(RGB(0,0,0)) 
FrameRgn_(0,handle,brush,100,150)
Momentan ist es so:

Es wird ein Fenster abgerundet:

Code: Alles auswählen

SetWindowRgn_(hWnd,CreateRoundRectRgn_(startx,starty,endx,endy,roundx,roundy),True)
HideWindow(0,0)
Und dieses abgerundete Fenster soll nun einen schwarzen Rahmen bekommen, an den runden Ecken soll der Rand natürlich nicht eckig sein.
Benutzeravatar
Mischa
Beiträge: 152
Registriert: 29.08.2004 06:52
Wohnort: Hellhorst

Beitrag von Mischa »

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? :oops:

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)
Gruß,
Mischa
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag von Delle »

It works! ;) Sollte aber langsam mal mein Win98 wegschmeißen weil zwar die Rundungen richtig sind, aber der schwarze Rahmen leicht verschoben ist. Das gleiche Prob hab ich bei der SkinWin-Lib von Danilo mit Hintergrundbildern auch schon ;)
Antworten