freie Formen bei Fenstern 'windowless'

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Midimaster

Betreff: freie Formen bei Fenstern 'windowless'

BeitragFr, Mai 13, 2011 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
weil ich grad jemandem im engl. Forum geholfen habe, nun auch hier der Quellcode dazu...

Die Funktion erreicht, dass das GUI-Fenster die Umrisse eines PNG-Bildes annimmt, also nicht mehr rechteckig ist. In dieser Funktion wird eine 8bit-PNG-Bild als Vorlage verwendet. Das TestBild gibt es hier: https://www.blitzforum.de/upload/file.php?id=10593

Um es mit 32bitARGB-PNG-Bildern zu nutzen müßte wahrscheinlich die Zeile....BlitzMax: [AUSKLAPPEN]
If (argb <> NOTHING)
....umgeschrieben werden.

BlitzMax: [AUSKLAPPEN]
Strict

Import MaxGui.Drivers

Const HTCAPTION% = 2 , NOTHING=-1

Extern "Win32"
Function SetWindowRgn(hWnd, hRgn, bRedraw)
Function CreateRectRgn(nLeftRect, nTopRect, nRightRect, nBottomRect)
Function CombineRgn(hrgnDest, hrgnSrc1, hrgnSrc2, fnCombineMode)
End Extern

Local skinPmap:TPixmap = LoadPixmap("Background.png")
If skinPmap = Null Then RuntimeError "Oi...Where's me picture?"

Local window:TGadget = CreateWindow("", 100, 100, skinPmap.width, skinPmap.height, Null,0)
SkinWindowII(window, skinPmap)

ShowGadget(window)
Local canvas:TGadget = CreateCanvas(0, 0, ClientWidth(window), ClientHeight(window), window)
Local hWnd = QueryGadget(window, QUERY_HWND)
SetGraphics CanvasGraphics(canvas)
SetBlend ALPHABLEND
DrawPixmap skinPmap, 0, 0
Flip

Repeat
Select WaitEvent()
Case EVENT_MOUSEDOWN
ReleaseCapture()
SendMessageA(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, Null)

Case EVENT_KEYDOWN
If CurrentEvent.data = 27 Then End

Case EVENT_GADGETPAINT
SetGraphics CanvasGraphics(canvas)
DrawPixmap skinPmap, 0, 0

Flip
End Select
Forever

End



Function SkinWindowII(Window:TGadget , Skin:TPixmap)
Local RectRgn = CreateRectRgn(0, 0, 0,0)
Local hWnd = QueryGadget(Window , QUERY_HWND)
Local X% , Y% , StartX% , argb:Long

For Y=0 Until Skin.Height
For X=0 Until Skin.Width

argb = ReadPixel(skin, X, Y)
If (argb <> NOTHING)
If StartX = -1
StartX = X
EndIf
Else
If StartX > -1
Local MaskLine
MaskLine = CreateRectRgn( StartX , Y , X , Y+1 )
CombineRgn ( RectRgn , RectRgn, MaskLine , 2 )
DeleteObject MaskLine
StartX = -1
EndIf
EndIf
Next
If StartX > -1
Local MaskLine
MaskLine = CreateRectRgn( StartX , Y, X , Y+1 )
CombineRgn ( RectRgn , RectRgn , MaskLine, 2 )
DeleteObject MaskLine
StartX = -1
EndIf
Next
SetWindowRgn ( hWnd , RectRgn , True)
End Function

  • Zuletzt bearbeitet von Midimaster am Fr, Mai 13, 2011 19:32, insgesamt einmal bearbeitet

grafe

BeitragFr, Mai 13, 2011 12:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow, echt toll danke Very Happy
Ich hab mich schon lange gefragt wie man sowas macht.

mfg Grafe

das wurgel

BeitragFr, Mai 13, 2011 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Transparenz wäre noch eine nette Ergänzung dazu:

BlitzMax: [AUSKLAPPEN]
Const GWL_EXSTYLE = -20 
Const LWA_ALPHA = 2

Function SetWindowTrans(gadget:TGadget, Transparenz%=255)
?Win32
Local hwnd% = QueryGadget(gadget,QUERY_HWND)
Local crKey%, bAlpha%, dwFlags%

GetLayeredWindowAttributes(hwnd,crKey,bAlpha,dwFlags)
SetLayeredWindowAttributes(hwnd,crKey,Transparenz,dwFlags|LWA_ALPHA)

SetWindowLong hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED
?
End Function

Extern "Win32"
Function GetLayeredWindowAttributes(hwnd%, crKey% Var, bAlpha% Var, dwFlags% Var)
Function SetLayeredWindowAttributes(hwnd%, crKey%, bAlpha%, dwFlags%)
Function GetWindowLong(hwnd%, nIndex%) = "GetWindowLongA@8"
Function SetWindowLong(hwnd%, nIndex%, dwNewLong%) = "SetWindowLongA@12"
End Extern
1 ist ungefähr 3

Der Eisvogel

BeitragSo, Mai 15, 2011 14:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich find das klasse, was ich jetzt jedoch noch gerne machen würde, ist ein Bild mit Transparenzwerten nehmen. Da man ja die Region selbst nicht transparent am Rande machen kann würde ich den Bereich etwas größer machen wollen, dann den Desktop drauf malen und dann das Bild. Aber soweit ich weiß gibt es in BlitzMax keinen schnellen DesktopBuffer, oder?
Das wäre echt klasse wenn das möglich wäre. Hat jemand eine Idee? Manuel über GetDC und GetPixel ist das denke ich zu langsam.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Midimaster

BeitragSo, Mai 15, 2011 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
verwende statt...
BlitzMax: [AUSKLAPPEN]
If (argb <> NOTHING)

...diese Zeile...
BlitzMax: [AUSKLAPPEN]
If argb & $ff000000 = 0

...und du kannst 32bit.PNGs mit Alpha-Kanal verwenden.

Deine Idee verstehe ich nicht ganz... Es ist mit dem bestehenden Code ohnes weiteres Möglich auch "Löcher" in das Fenster zu integrieren.

Die Rectangle-Liste kennt allerdings keinen "Alpha-Wert" um z.b. 50% Durchsichtigkeit pro Pixel herzustellen. Der Code von Wurgel scheint auch nur so eine Art "Aero-Look" zu bilden, bei dem aber die Transparenz für das gesamte Fenster gleich stark wäre. Oder täusche ich mich da?

Der Eisvogel

BeitragSo, Mai 15, 2011 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja ich meine genau diese 50% Tranzparenz und jede andere Stufen. Aber das geht so leider nicht.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

The Shark

BeitragSo, Mai 15, 2011 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest ein rahmenloses Fenster subclassen und dann bei #wm_paint das fenster mit Transparenz zeichnen.

Der Eisvogel

BeitragSo, Mai 15, 2011 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Das bringt mir aber auch nich was ich wollte, da ich ja unterschiedlcihe Tranzparentwerte möchte um eine suabere Kante zu haben.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

The Shark

BeitragSo, Mai 15, 2011 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir mal diese beiden seiten an, daraus müsste sich was basteln lassen:

http://msdn.microsoft.com/en-u...85%29.aspx
http://msdn.microsoft.com/en-u...85%29.aspx

Wie genau du Vorgehen musst, kann ich dir icht sagen, aber du beißt dich ba bestimmt irgendwie durch Smile

Der Eisvogel

BeitragSo, Mai 15, 2011 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wird leider auch nicht funktionieren, da es somit entweder ein Transparentes Fenster wird, oder ein nicht transparentes Fenster mit einem Bild drauf. Das Fenster selbst müsste unterschiedliche Transparenz-Werte annehmen können, aber das geht leider nicht.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group