prob if is XP skin support activ
Posted: Sat Jan 12, 2008 1:39 am
Hello,
Why the follow code dont work with XP skin support is active?
The code is from the CodeArchiv.
Code works without XP Skin active:
This code works only with XP skin support is active but if you look into the Callback you see that the events (after CASE) are very crasy and not the right events for a button:
Wat dose the XP Skin support with the events?
Thanks
Nico
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