Why the follow code dont work with XP skin support is active?
The code is from the CodeArchiv.
Code works without XP Skin active:
Code: Select all
#ODA_DRAWENTIRE = 1
#ODA_FOCUS = 4
#ODA_SELECT = 2
#TME_CANCEL = $80000000
#TME_HOVER = 1
#TME_LEAVE = 2
#TME_NONCLIENT = $10
#TME_QUERY = $40000000
#DFCS_HOT = $1000
;#DFCS_TRANSPARENT = 4800
#ODS_INACTIVE = $80
#ODS_HOTLIGHT = $40
#ODS_NOFOCUSRECT = $200
#WM_MOUSEHOVER = $2A1
#WM_MOUSELEAVE = $2A3
#MyWindow = 0
Enumeration
#MyButton1 = 100
#MyButton2
#MyButton3
EndEnumeration
#DoHover = 1
#DoLeave = 2
; --> Declare Globals
Global doWhat, oldCallback, buttonBrushLeave, buttonBrushClick, buttonBrushHover, buttonBrushDisable
; --> For tracking mouse
Structure myTRACKMOUSEEVENT
cbSize.l
dwFlags.l
hwndTrack.l
dwHoverTime.l
EndStructure
Global mte.myTRACKMOUSEEVENT
mte\cbSize = SizeOf(myTRACKMOUSEEVENT)
; --> Create button background brushes
buttonBrushLeave = CreateSolidBrush_(GetSysColor_(#COLOR_BTNFACE))
buttonBrushClick = CreateSolidBrush_(RGB(207, 203, 147))
buttonBrushHover = CreateSolidBrush_(RGB($D9,$DA,$BA))
buttonBrushDisable = CreateSolidBrush_(GetSysColor_(#COLOR_GRAYTEXT))
Global hFont
hFont = LoadFont(1,"Verdana",10,#PB_Font_HighQuality|#PB_Font_Bold)
Macro LOWORD(Value)
Value & $FFFF
EndMacro
Macro HIWORD(Value)
(Value >> 16) & $FFFF
EndMacro
; --> Main WindowCallback
Procedure myWindowCallback(hwnd, msg, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select msg
Case #WM_DRAWITEM
*dis.DRAWITEMSTRUCT = lParam
If *dis\CtlType = #ODT_BUTTON
buttonNum = *dis\CtlID
; --> Default button attributes
SetBkMode_(*dis\hdc, #TRANSPARENT)
doWhatBrush = buttonBrushLeave
doFlags = #DFCS_FLAT | #DFCS_BUTTONPUSH | #DFCS_MONO | #DFCS_ADJUSTRECT
Select *dis\itemState
Case #ODS_DISABLED
hOldFont = SelectObject_(*dis\hdc,hFont)
SetTextColor_(*dis\hdc,GetSysColor_(#COLOR_GRAYTEXT))
Case 0
; --> DoHover or DoLeave
If *dis\itemAction = 1 And doWhat = #DoHover
; --> DoHover
doWhatBrush = buttonBrushHover
hOldFont = SelectObject_(*dis\hdc,hFont)
SetTextColor_(*dis\hdc,RGB($A,$24,$50))
doFlags = #DFCS_BUTTONPUSH | #DFCS_MONO | #DFCS_ADJUSTRECT
ElseIf *dis\itemAction = 1 And doWhat = #DoLeave
; --> DoLeave
doWhatBrush = buttonBrushLeave
doFlags = #DFCS_FLAT | #DFCS_BUTTONPUSH | #DFCS_MONO | #DFCS_ADJUSTRECT
EndIf
Case #ODS_FOCUS
; --> ClickDown
doWhatBrush = buttonBrushClick
hOldFont = SelectObject_(*dis\hdc,hFont)
SetTextColor_(*dis\hdc,RGB($35,$87,$3))
doFlags = #DFCS_BUTTONPUSH | #DFCS_PUSHED | #DFCS_ADJUSTRECT
Case #ODS_FOCUS | #ODS_SELECTED
; --> ClickUp
doWhatBrush = buttonBrushClick
hOldFont = SelectObject_(*dis\hdc,hFont)
SetTextColor_(*dis\hdc,RGB($7A,$58,$10))
doFlags = #DFCS_BUTTONPUSH | #DFCS_PUSHED | #DFCS_ADJUSTRECT
EndSelect
EndIf
DrawFrameControl_(*dis\hdc, *dis\rcItem, #DFCS_BUTTON3STATE, doFlags)
FillRect_(*dis\hdc, *dis\rcItem, doWhatBrush)
DrawText_(*dis\hdc, GetGadgetText(buttonNum), Len(GetGadgetText(buttonNum)), *dis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER)
EndSelect
ProcedureReturn Result
EndProcedure
; --> ButtonCallback
Procedure myButtonCallback(hwnd, msg, wParam, lParam)
Shared mouseLeave, hover, hot
Result = CallWindowProc_(oldCallback, hwnd, msg, wParam, lParam)
buttonID = GetDlgCtrlID_(hwnd)
Select msg
Case #WM_MOUSEMOVE
If wParam <> #MK_LBUTTON And mouseLeave = 0
mouseLeave = 1
doWhat = #DoHover
; --> Force #WM_DRAWITEM
InvalidateRect_(GadgetID(buttonID), 0, 0)
; Track mouse leaving button
mte\dwFlags = #TME_LEAVE
mte\hwndTrack = GadgetID(buttonID)
TrackMouseEvent_(mte)
EndIf
Case #WM_MOUSELEAVE
mouseLeave = 0
doWhat = #DoLeave
; --> Force #WM_DRAWITEM
InvalidateRect_(GadgetID(buttonID), 0, 0)
Case #WM_LBUTTONDOWN
; --> Set flag to reset previous down botton
doWhat = #DoLeave
EndSelect
ProcedureReturn Result
EndProcedure
If OpenWindow(#MyWindow, 100, 100, 250, 200, "Custom Hover Buttons", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#MyWindow))
SetWindowCallback(@myWindowCallback())
CreateStatusBar(0, WindowID(#MyWindow))
StringGadget(0, 75, 10, 100, 20, "Ownerdraw Buttons", #PB_String_BorderLess | #PB_String_ReadOnly)
ButtonGadget(#MyButton1, 75, 50, 100, 20, "Testing",#PB_Button_Toggle)
ButtonGadget(#MyButton2, 75, 80, 100, 20, "Customized",#PB_Button_Toggle)
ButtonGadget(#MyButton3, 75, 110, 100, 20, "Buttons")
; --> Remove #BS_PUSHBUTTON and add #BS_OWNERDRAW to buttons
For B = #MyButton1 To #MyButton3
bStyle = GetWindowLong_(GadgetID(B), #GWL_STYLE)
SetWindowLong_(GadgetID(B), #GWL_STYLE, bStyle &~#BS_PUSHBUTTON | #BS_OWNERDRAW)
oldCallback = SetWindowLong_(GadgetID(B), #GWL_WNDPROC, @myButtonCallback())
Next B
SendMessage_(GadgetID(#MyButton2),#BM_CLICK,0,0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 0
StatusBarText(0, 0, "No Button seelcted")
Case #MyButton1
StatusBarText(0, 0, "Selected button ID# " + Str(#MyButton1) + " text is: Testing")
Case #MyButton2
StatusBarText(0, 0, "Selected button ID# " + Str(#MyButton2) + " text is: Customized")
Case #MyButton3
StatusBarText(0, 0, "Selected button ID# " + Str(#MyButton3) + " text is: Buttons")
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
DeleteObject_(buttonBrushLeave)
DeleteObject_(buttonBrushClick)
DeleteObject_(buttonBrushHover)
End
Code: Select all
#ODA_DRAWENTIRE = 1
#ODA_FOCUS = 4
#ODA_SELECT = 2
#TME_CANCEL = $80000000
#TME_HOVER = 1
#TME_LEAVE = 2
#TME_NONCLIENT = $10
#TME_QUERY = $40000000
#DFCS_HOT = $1000
;#DFCS_TRANSPARENT = 4800
#ODS_INACTIVE = $80
#ODS_HOTLIGHT = $40
#ODS_NOFOCUSRECT = $200
#WM_MOUSEHOVER = $2A1
#WM_MOUSELEAVE = $2A3
#MyWindow = 0
Enumeration
#MyButton1 = 100
#MyButton2
#MyButton3
EndEnumeration
#DoHover = 1
#DoLeave = 2
; --> Declare Globals
Global doWhat, oldCallback, buttonBrushLeave, buttonBrushClick, buttonBrushHover, buttonBrushDisable
; --> For tracking mouse
Structure myTRACKMOUSEEVENT
cbSize.l
dwFlags.l
hwndTrack.l
dwHoverTime.l
EndStructure
Global mte.myTRACKMOUSEEVENT
mte\cbSize = SizeOf(myTRACKMOUSEEVENT)
; --> Create button background brushes
buttonBrushLeave = CreateSolidBrush_(GetSysColor_(#COLOR_BTNFACE))
buttonBrushClick = CreateSolidBrush_(RGB(207, 203, 147))
buttonBrushHover = CreateSolidBrush_(RGB($D9,$DA,$BA))
buttonBrushDisable = CreateSolidBrush_(GetSysColor_(#COLOR_GRAYTEXT))
Global hFont
hFont = LoadFont(1,"Verdana",10,#PB_Font_HighQuality|#PB_Font_Bold)
Macro LOWORD(Value)
Value & $FFFF
EndMacro
Macro HIWORD(Value)
(Value >> 16) & $FFFF
EndMacro
; --> Main WindowCallback
Procedure myWindowCallback(hwnd, msg, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select msg
Case #WM_DRAWITEM
*dis.DRAWITEMSTRUCT = lParam
If *dis\CtlType = #ODT_BUTTON
buttonNum = *dis\CtlID
; --> Default button attributes
SetBkMode_(*dis\hdc, #TRANSPARENT)
doWhatBrush = buttonBrushLeave
doFlags = #DFCS_FLAT | #DFCS_BUTTONPUSH | #DFCS_MONO | #DFCS_ADJUSTRECT
Select *dis\itemState
Case 772
hOldFont = SelectObject_(*dis\hdc,hFont)
SetTextColor_(*dis\hdc,GetSysColor_(#COLOR_GRAYTEXT))
Case #EN_CHANGE
; --> DoHover or DoLeave
If *dis\itemAction = 1 And doWhat = #DoHover
; --> DoHover
doWhatBrush = buttonBrushHover
hOldFont = SelectObject_(*dis\hdc,hFont)
SetTextColor_(*dis\hdc,RGB($A,$24,$50))
doFlags = #DFCS_BUTTONPUSH | #DFCS_MONO | #DFCS_ADJUSTRECT
ElseIf *dis\itemAction = 1 And doWhat = #DoLeave
; --> DoLeave
doWhatBrush = buttonBrushLeave
doFlags = #DFCS_FLAT | #DFCS_BUTTONPUSH | #DFCS_MONO | #DFCS_ADJUSTRECT
EndIf
Case #WM_PALETTEISCHANGING
; --> ClickDown
doWhatBrush = buttonBrushClick
hOldFont = SelectObject_(*dis\hdc,hFont)
SetTextColor_(*dis\hdc,RGB($35,$87,$3))
doFlags = #DFCS_BUTTONPUSH | #DFCS_PUSHED | #DFCS_ADJUSTRECT
Case #WM_PALETTECHANGED
; --> ClickUp
doWhatBrush = buttonBrushClick
hOldFont = SelectObject_(*dis\hdc,hFont)
SetTextColor_(*dis\hdc,RGB($7A,$58,$10))
doFlags = #DFCS_BUTTONPUSH | #DFCS_PUSHED | #DFCS_ADJUSTRECT
EndSelect
EndIf
DrawFrameControl_(*dis\hdc, *dis\rcItem, #DFCS_BUTTON3STATE, doFlags)
FillRect_(*dis\hdc, *dis\rcItem, doWhatBrush)
DrawText_(*dis\hdc, GetGadgetText(buttonNum), Len(GetGadgetText(buttonNum)), *dis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER)
EndSelect
ProcedureReturn Result
EndProcedure
; --> ButtonCallback
Procedure myButtonCallback(hwnd, msg, wParam, lParam)
Shared mouseLeave, hover, hot
Result = CallWindowProc_(oldCallback, hwnd, msg, wParam, lParam)
buttonID = GetDlgCtrlID_(hwnd)
Select msg
Case #WM_MOUSEMOVE
If wParam <> #MK_LBUTTON And mouseLeave = 0
mouseLeave = 1
doWhat = #DoHover
; --> Force #WM_DRAWITEM
InvalidateRect_(GadgetID(buttonID), 0, 0)
; Track mouse leaving button
mte\dwFlags = #TME_LEAVE
mte\hwndTrack = GadgetID(buttonID)
TrackMouseEvent_(mte)
EndIf
Case #WM_MOUSELEAVE
mouseLeave = 0
doWhat = #DoLeave
; --> Force #WM_DRAWITEM
InvalidateRect_(GadgetID(buttonID), 0, 0)
Case #WM_LBUTTONDOWN
; --> Set flag to reset previous down botton
doWhat = #DoLeave
EndSelect
ProcedureReturn Result
EndProcedure
If OpenWindow(#MyWindow, 100, 100, 250, 200, "Custom Hover Buttons", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#MyWindow))
SetWindowCallback(@myWindowCallback())
CreateStatusBar(0, WindowID(#MyWindow))
StringGadget(0, 75, 10, 100, 20, "Ownerdraw Buttons", #PB_String_BorderLess | #PB_String_ReadOnly)
ButtonGadget(#MyButton1, 75, 50, 100, 20, "Testing",#PB_Button_Toggle)
ButtonGadget(#MyButton2, 75, 80, 100, 20, "Customized",#PB_Button_Toggle)
ButtonGadget(#MyButton3, 75, 110, 100, 20, "Buttons")
; --> Remove #BS_PUSHBUTTON and add #BS_OWNERDRAW to buttons
For B = #MyButton1 To #MyButton3
bStyle = GetWindowLong_(GadgetID(B), #GWL_STYLE)
SetWindowLong_(GadgetID(B), #GWL_STYLE, bStyle &~#BS_PUSHBUTTON | #BS_OWNERDRAW)
oldCallback = SetWindowLong_(GadgetID(B), #GWL_WNDPROC, @myButtonCallback())
Next B
SendMessage_(GadgetID(#MyButton2),#BM_CLICK,0,0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 0
StatusBarText(0, 0, "No Button seelcted")
Case #MyButton1
StatusBarText(0, 0, "Selected button ID# " + Str(#MyButton1) + " text is: Testing")
Case #MyButton2
StatusBarText(0, 0, "Selected button ID# " + Str(#MyButton2) + " text is: Customized")
Case #MyButton3
StatusBarText(0, 0, "Selected button ID# " + Str(#MyButton3) + " text is: Buttons")
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
DeleteObject_(buttonBrushLeave)
DeleteObject_(buttonBrushClick)
DeleteObject_(buttonBrushHover)
End
Thanks
Nico