Code
; Title: Frame3DGadget with custom text color / Theme Support / 64-Bit
;
; Author: Christian Kemna (Fluid Byte)
; Created: December 31, 2006
; Updated: June 29, 2010
; Version: PureBasic V4.XX
; Platform: Windows XP and higher
; Internet: http://www.codedreality.de/
; E-Mail: ckemna@t-online.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(187, 193, 201))
Frame3DGadgetEx(2,10,195,200,90,"Frame3DGadgetEx #3",#Blue)
While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend