Code archives/Graphics/Skinnable App (dragable)

This code has been declared by its author to be Public Domain code.

Download source code

Skinnable App (dragable) by Red2003
- Thx to: MutteringGoblin & WickedRush
- Win32 Articles: win32skins
- [UPDATE] drag window code from DarkLordz
- [UPDATE] a bug fix for non-XP user

Below Userlib Files :

; -------------------------
; /userlibs/user32.decls
; -------------------------
.lib "user32.dll"
GetActiveWindow%():"GetActiveWindow"
ShowWindow%(hWnd%,nCmdShow%):"ShowWindow"
SetWindowRgn%(hWnd%,hRgn%,bRedraw%):"SetWindowRgn"
GetSystemMetrics%(nIndex%):"GetSystemMetrics"
ReleaseCapture%():"ReleaseCapture"
SendMessage%(hwnd%,Msg%,lParam%,wParam%):"SendMessageA"

; -------------------------
; /userlibs/gdi32.decls
; -------------------------
.lib "gdi32.dll"
CreateRectRgn%(X1%,Y1%,X2%,Y2%):"CreateRectRgn"
CombineRgn%(hDestRgn%,hSrcRgn1%,hSrcRgn2%,nCombineMode%):"CombineRgn"
DeleteObject%(hObject%)


Below BLitz code :
; ==============================
; Example 
; ==============================
skin=SkinApp("interface.png",$FF00FF)
Repeat
	;Drag Window... (Darklordz's addon)
	While MouseDown(1) 
		app=GetActiveWindow():ReleaseCapture%()
		SendMessage%(app,161,2,0):ReleaseCapture%()
		Exit
	Wend

	;Draw skin
	DrawBlock skin,0,0
	Flip
Until KeyHit(1)
End

; ==============================
; Function
; ==============================
Function SkinApp%(Image$,MaskColor%)
	Local app=GetActiveWindow()
	
	;size of client aera
	Local client=LoadImage(Image$)
	Graphics ImageWidth(client),ImageHeight(client),0,2	
	SetBuffer BackBuffer()

	ShowWindow app,2
	
	;remove all borders around the client aera
	Local bmp=LoadImage(Image$)
	Local x=GetSystemMetrics($07)
	Local y=GetSystemMetrics($08)+GetSystemMetrics($04)		
	Local region=CreateRectRgn(x,y,x+GraphicsWidth(),y+GraphicsHeight())	

	Local yoffset = -1-(GetSystemMetrics($4)+GetSystemMetrics($2E))
	Local xoffset = -1-GetSystemMetrics($2D)

	;fix visual problem on non-XP computer
	If Not Instr(SystemProperty("OS"),"XP",1)	
		x=x+xoffset
		y=y+yoffset
	EndIf 

	;remove all useless pixels 
	Local pixel,px,py,c
	For py=0 To ImageHeight(bmp)-1
		For px=0 To ImageWidth(bmp)-1
		
			c=ReadPixel(px,py,ImageBuffer(bmp))	And $00FFFFFF 		

			If c=MaskColor
				pixel=CreateRectRgn(x+px,y+py,x+px+1,y+py+1)
				CombineRgn region,region,pixel,3;RGN_XOR
				DeleteObject pixel
			EndIf 
			
		Next
	Next
		
	;set visible region
	SetWindowRgn(app,region,True)

	ShowWindow app,1

	Return bmp
End Function

Comments

Red2004
I found a bug.
This code does not work with non-XP computer.


Red2004
[code updated]
Ok I've fixed it.


Tracer2004
This still doesn't seem to work right in Win2K.

Tracer


Red2004
Is it a visual bug ?


Ked2006
Expecting End of File?

I'm not sure how to fix it....


Code Archives Forum