B+ Fenster skinnen bzw. mit Shape überlagern

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

EPS

Betreff: B+ Fenster skinnen bzw. mit Shape überlagern

BeitragSa, März 26, 2005 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, mein erster Beitrag, ich hoffe jemanden interessierts. Voraussetzung sind ein paar Deklarationen in der user32.decls und gdi32.decls (siehe Funktion). Los gehts:

Code: [AUSKLAPPEN]
img = CreateImage(300,200)
SetBuffer ImageBuffer(img)
Color $FF,$00,$FF: Rect 0,0,300,200,1
Color $FF,$00,$00: Oval 0,0,300,200,1

win = CreateWindow("hallo",300,200,300,200,Desktop(),0)

skin_window(win,img,$FF00FF)

Repeat
   If KeyHit(1) Then Exit
   Select WaitEvent()
      Case $803: Exit
   End Select
Forever
FreeImage img



Function skin_window(win, img, col)
;==============================================================================================================
; Fenster skinnen (Das Bild muß so groß sein wie das Fenster)
;
; win = Handle eines Fenster (ermittelt durch CreateWindow)
; img = Handle eines Bildes  (ermittelt durch LoadImage o.ä.)
; col = Maskierungsfarbe     (in der Form: RGB)
;
;==============================================================================================================
; Nutzt folgende API-Funktionen:
;
; User32.decls: SetWindowRgn%(hWnd%, hRgn%, bRedraw%)
;  Gdi32.decls: CreateRectRgn%(X1%, Y1%, X2%, Y2%)
;               CombineRgn%(hDestRgn%, hSrcRgn1%, hSrcRgn2%, nCombineMode%)
;               DeleteObject%(hObject%)
;
;==============================================================================================================
; Original: James Freeman (dan_upright); darth_pingu@yahoo.co.uk; http://oma.cultoftheinept.com
;    Found: http://www.blitzbasic.com; Code archives; Declared by its author to be Public Domain code.
; Modified: Thomas Tratz (EPS); webmaster@east-power-soft.de; http://www.east-power-soft.de
;==============================================================================================================
   w = ImageWidth(img)
   h = ImageHeight(img)

   cnv = CreateCanvas(0,0,w,h,win)
   SetBuffer CanvasBuffer(cnv)
   DrawBlock img,0,0

   hWnd = QueryObject(win, 1)
   hRgn = api_CreateRectRgn(0, 0, w, h)
   ibuf = ImageBuffer(img)
   col = col Or $FF000000
   
   LockBuffer ibuf
   For y = 0 To h - 1
      For x = 0 To w - 1
         pixel = ReadPixelFast(x, y, ibuf)
         If pixel = col Then
            hTempRgn = api_CreateRectRgn(x, y, x + 1, y + 1)
            api_CombineRgn(hRgn, hRgn, hTempRgn, 3)         ;--> Rgn_XOR
            api_DeleteObject(hTempRgn)
         End If
      Next
   Next
   UnlockBuffer ibuf
   
   api_SetWindowRgn(hWnd, hRgn, True)
   api_DeleteObject(hRgn)
End Function
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

Mr.Keks

BeitragSo, März 27, 2005 0:01
Antworten mit Zitat
Benutzer-Profile anzeigen
man kann das aber, glaube ich, auch ohne die userlib machen, indem man einfach mit dem desktopbuffer und einem canvas rumspielt. das geht zwar nicht als permanenter skin, aber zumindest für kurze logoeinblendungen reicht es.
MrKeks.net

Sebastian

BeitragMi, März 30, 2005 12:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte ich schrieb das mal schnell für B3d um :
BlitzBasic: [AUSKLAPPEN]

Graphics 300,200,16,0

SetBuffer ImageBuffer(img)
Color $FF,$00,$FF: Rect 0,0,300,200,1
Color $FF,$00,$00: Oval 0,0,300,200,1




win = api_GetActiveWindow()
skin_window(win,img,$FF00FF)

Repeat


Until KeyHit(1)





Function skin_window(win, img, col)
;==============================================================================================================
; Fenster skinnen (Das Bild muß so groß sein wie das Fenster)
;
; win = Handle eines Fenster (ermittelt durch CreateWindow)
; img = Handle eines Bildes (ermittelt durch LoadImage o.ä.)
; col = Maskierungsfarbe (in der Form: RGB)
;
;==============================================================================================================
; Nutzt folgende API-Funktionen:
;
; User32.decls: api_SetWindowRgn%(hWnd%, hRgn%, bRedraw%)
; api_GetActiveWindow%()
; Gdi32.decls: api_CreateRectRgn%(X1%, Y1%, X2%, Y2%)
; api_CombineRgn%(hDestRgn%, hSrcRgn1%, hSrcRgn2%, nCombineMode%)
; api_DeleteObject%(hObject%)
;
;==============================================================================================================
; Original: James Freeman (dan_upright); darth_pingu@yahoo.co.uk; http://oma.cultoftheinept.com
; Found: http://www.blitzbasic.com; Code archives; Declared by its author to be Public Domain code.
; Modified: Thomas Tratz (EPS); webmaster@east-power-soft.de; http://www.east-power-soft.de
; Modified for B3D: Sebastian
;==============================================================================================================
w = ImageWidth(img)
h = ImageHeight(img)


SetBuffer BackBuffer()
DrawBlock img,0,0

hWnd = win
hRgn = api_CreateRectRgn(0, 0, w, h)
ibuf = ImageBuffer(img)
col = col Or $FF000000

LockBuffer ibuf
For y = 0 To h - 1
For x = 0 To w - 1
pixel = ReadPixelFast(x, y, ibuf)
If pixel = col Then
hTempRgn = api_CreateRectRgn(x, y, x + 1, y + 1)
api_CombineRgn(hRgn, hRgn, hTempRgn, 3) ;--> Rgn_XOR
api_DeleteObject(hTempRgn)
End If
Next
Next
UnlockBuffer ibuf

api_SetWindowRgn(hWnd, hRgn, True)
api_DeleteObject(hRgn)
End Function


Der einzige Haken ist das die Fesnsterleiste und die Umrandung nicht überzeichenbar ist ....(wie im Beispiel)

Man könnte die maske anpassen oder mit weiteren GDI-befehlen ziechen ...

Ich werd mal die maske anpassen !
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf !

Sebastian

BeitragMi, März 30, 2005 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
So hier jetzt der Code mit der entsprechenden Maske :
BlitzBasic: [AUSKLAPPEN]

Graphics 300,200,16,2


img = CreateImage(303,222)
SetBuffer ImageBuffer(img)
Color 255,0,255
Rect 0,0,303,22,1
Rect 0,0,3,222,1


win = api_GetActiveWindow()
skin_window(win,img,$FF00FF)

SetBuffer BackBuffer()

Repeat


Rect 0,0,300,200,0

Flip()
Until KeyHit(1)





Function skin_window(win, img, col)
;==============================================================================================================
; Fenster skinnen (Das Bild muß so groß sein wie das Fenster)
;
; win = Handle eines Fenster (ermittelt durch CreateWindow)
; img = Handle eines Bildes (ermittelt durch LoadImage o.ä.)
; col = Maskierungsfarbe (in der Form: RGB)
;
;==============================================================================================================
; Nutzt folgende API-Funktionen:
;
; User32.decls: api_SetWindowRgn%(hWnd%, hRgn%, bRedraw%)
; Gdi32.decls: api_CreateRectRgn%(X1%, Y1%, X2%, Y2%)
; api_CombineRgn%(hDestRgn%, hSrcRgn1%, hSrcRgn2%, nCombineMode%)
; api_DeleteObject%(hObject%)
;
;==============================================================================================================
; Original: James Freeman (dan_upright); darth_pingu@yahoo.co.uk; http://oma.cultoftheinept.com
; Found: http://www.blitzbasic.com; Code archives; Declared by its author to be Public Domain code.
; Modified: Thomas Tratz (EPS); webmaster@east-power-soft.de; http://www.east-power-soft.de
;==============================================================================================================
w = ImageWidth(img)
h = ImageHeight(img)





hWnd = win
hRgn = api_CreateRectRgn(0, 0, w, h)
ibuf = ImageBuffer(img)
col = col Or $FF000000

LockBuffer ibuf
For y = 0 To h - 1
For x = 0 To w - 1
pixel = ReadPixelFast(x, y, ibuf)
If pixel = col Then
hTempRgn = api_CreateRectRgn(x, y, x + 1, y + 1)
api_CombineRgn(hRgn, hRgn, hTempRgn, 3) ;--> Rgn_XOR
api_DeleteObject(hTempRgn)
End If
Next
Next
UnlockBuffer ibuf

api_SetWindowRgn(hWnd, hRgn, True)
api_DeleteObject(hRgn)
End Function


Kurze erläuterung :
Der Rand um ein Fenster ist 3px stark die Titelleiste 22px.
Es ist daher besser sich eine Maske und eine Skinn zu erstellen.
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf !

Jan_

Ehemaliger Admin

BeitragMi, März 30, 2005 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
nettes system.
between angels and insects

Sebastian

BeitragDo, März 31, 2005 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist eine mittelschwere GAU (größte annehmbare Unfunktion) aufgetreten.

Wird während ein geshaptes Progg läuft eine Vollbilg Anwendung gestarted kann es nen Memory Acess geben oder auch nicht. Je nach dem ob das andre Progg GDI benutzt oder nicht .......
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf !

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group