Code: Select all
; Title:    Frame3DGadget with custom text color / Theme Support / 64-Bit
;
; Author:   Fluid Byte
; Version:  PureBasic V4.XX
; Platform: Windows XP and higher
; E-Mail:   fluidbyte@web.de
EnableExplicit
Structure FRAME3DEX
	lpPrevFunc.i
	clrText.l
	bThemeXP.b
EndStructure
Procedure Frame3DExProc(hWnd,uMsg,wParam,lParam)
	Protected *frmex.FRAME3DEX, hDC, ps.PAINTSTRUCT, Title.s, fts.SIZE, wrc.RECT, lpBuffer, hThemeButton
	
	*frmex = GetWindowLongPtr_(hwnd,#GWL_USERDATA)
	
	Select uMsg
		Case #WM_NCDESTROY
		FreeMemory(*frmex)
		ProcedureReturn 0
		
		Case #WM_PAINT     
		hdc = BeginPaint_(hwnd,ps)
		
		SelectObject_(hdc,SendMessage_(hwnd,#WM_GETFONT,0,0))
		
		Title = GetGadgetText(GetDlgCtrlID_(hwnd))   
		GetTextExtentPoint32_(hdc,Title,Len(Title),fts)   
		GetClientRect_(hWnd,wrc)
		SetRect_(wrc,wrc\left,wrc\top + fts\cy / 2,wrc\right,wrc\bottom)
		
		If OSVersion() >= #PB_OS_Windows_XP And IsThemeActive_() And IsAppThemed_() And *frmex\bThemeXP
			lpBuffer = AllocateMemory(14) : PokeS(lpBuffer,"Button",-1,#PB_Unicode)     
			
			hThemeButton = OpenThemeData_(WindowID(0),lpBuffer)
			DrawThemeBackground_(hThemeButton,hdc,4,1,wrc,0)
			CloseThemeData_(hThemeButton)
			
			FreeMemory(lpBuffer)
		Else
			DrawEdge_(hdc,wrc,#EDGE_ETCHED,#BF_RECT)
		EndIf
		
		If GetWindowColor(0) > -1
			SetBkColor_(hdc,GetWindowColor(0))
		Else
			SetBkColor_(hdc,GetSysColor_(#COLOR_3DFACE))
		EndIf
		
		SetTextColor_(hdc,*frmex\clrText)
		TextOut_(hdc,9,0,Title,Len(Title))   
		
		EndPaint_(hwnd,ps)
		
		ProcedureReturn 0
	EndSelect
	
	ProcedureReturn CallWindowProc_(*frmex\lpPrevFunc,hWnd,uMsg,wParam,lParam)  
EndProcedure
Procedure Frame3DGadgetEx(Gadget,X,Y,Width,Height,Text.s,Color.l=0)     
	Protected *frmex.FRAME3DEX, HINSTANCE, hResData, Length
	Protected dvi.DLLVERSIONINFO\cbsize = SizeOf(DLLVERSIONINFO)
	
	Frame3DGadget(Gadget,X,Y,Width,Height,Text)
	
	*frmex = AllocateMemory(SizeOf(FRAME3DEX))
	*frmex\lpPrevFunc = SetWindowLongPtr_(GadgetID(Gadget),#GWL_WNDPROC,@Frame3DExProc())
	*frmex\clrText = Color
	
	HINSTANCE = OpenLibrary(#PB_Any,"comctl32.dll")
	
	If HINSTANCE
		CallFunction(HINSTANCE,"DllGetVersion",@dvi)
		If dvi\dwMajorVersion = 6 : *frmex\bThemeXP = #True : EndIf
		CloseLibrary(HINSTANCE)
	EndIf
	SetWindowLongPtr_(GadgetID(Gadget),#GWL_USERDATA,*frmex)
	
	ProcedureReturn GadgetID(Gadget)
EndProcedure
SetGadgetFont(#PB_Default,LoadFont(0,"Arial",9))
OpenWindow(0,0,0,400,300,"Ownerdraw Frame3D Control",#WS_OVERLAPPEDWINDOW | 1)
Frame3DGadgetEx(0,10,5,200,90,"Frame3DGadgetEx #1",#Red)
Frame3DGadgetEx(1,10,100,200,90,"Frame3DGadgetEx #2",RGB(40,180,70))
Frame3DGadgetEx(2,10,195,200,90,"Frame3DGadgetEx #3",#Blue)
While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend




