Code: Select all
Macro EnableEnumerate
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Import ""
CompilerElse
ImportC ""
CompilerEndIf
PB_Object_EnumerateStart( PB_Objects )
PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
PB_Object_EnumerateAbort( PB_Objects )
PB_Object_Count( PB_Objects )
PB_Window_Objects.i
PB_Gadget_Objects.i
EndImport
EndMacro : EnableEnumerate
;- ImageButton
DeclareModule ImageButton
EnableExplicit
Enumeration #PB_EventType_FirstCustomValue
#PB_EventType_Repaint
EndEnumeration
;
#PB_GadgetType_ImageButton = 34
#PB_Button_Top = #PB_Button_Left <<2
#PB_Button_Bottom = #PB_Button_Left <<3
;
Declare Repaint( Gadget )
Declare Free( Gadget )
Declare Gadget( Gadget, X,Y,Width,Height, Text.s, ImageID.i = #False, Flags.i = #False, ImgWidth.i = 16, ImgHeight.i = 16 )
EndDeclareModule
Module ImageButton
Macro EnableEnumerate
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Import ""
CompilerElse
ImportC ""
CompilerEndIf
PB_Object_EnumerateStart( PB_Objects )
PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
PB_Object_EnumerateAbort( PB_Objects )
PB_Object_Count( PB_Objects )
PB_Window_Objects.i
PB_Gadget_Objects.i
EndImport
EndMacro : EnableEnumerate
Structure ImageButton
Canvas.i
Flags.i
;
Img.i
Text.s
;
FontID.i
ColorFont.i
;
ColorIdleBorder.i
ColorIdleTop.i
ColorIdleBottom.i
;
ColorHoverBorder.i
ColorHoverTop.i
ColorHoverBottom.i
;
ColorPressBorder.i
ColorPressTop.i
ColorPressBottom.i
;
HoverItem.i
PressItem.i
EndStructure
Global NewMap *ImageButtonData()
Procedure _setImageButtonData(GadgetID, *data)
*ImageButtonData(Str(GadgetID)) = *data
EndProcedure
Procedure _getImageButtonData(GadgetID)
ProcedureReturn *ImageButtonData(Str(GadgetID))
EndProcedure
Procedure Img( ImageID, Width = 16, Height = 16 )
If IsImage(ImageID)
ImageID = ImageID(ImageID)
EndIf
If ImageID
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
Protected ImgID = CopyImage_(ImageID, #IMAGE_ICON, Width, Height, #LR_COPYRETURNORG)
If ImgID
ImageID = ImgID
Else
ImageID = CopyImage_(ImageID, #IMAGE_BITMAP, Width, Height, #LR_COPYRETURNORG)
EndIf
CompilerEndSelect
Protected Image = CreateImage(#PB_Any, Width, Height, 32)
If StartDrawing(ImageOutput(Image))
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0, 0, OutputWidth(), OutputHeight())
DrawImage(ImageID, 0, 0, Width, Height )
StopDrawing()
EndIf
ProcedureReturn Image
EndIf
EndProcedure
Procedure Repaint( GadgetID )
Protected *IMG.ImageButton = _getImageButtonData( GadgetID )
If GadgetID
Protected TopColor.i, BottomColor.i, BorderColor.i, DefaultColor.i, Width, Height
If (*IMG And IsGadget(*IMG\Canvas))
With *IMG
If (StartDrawing(CanvasOutput(\Canvas)))
Width = GadgetWidth(\Canvas)
Height = GadgetHeight(\Canvas)
; Width = OutputWidth()
; Height = OutputHeight()
; Debug GadgetWidth(\Canvas)
; Debug Width
;
If ((\PressItem = \HoverItem) And (\PressItem))
TopColor = \ColorPressTop
BottomColor = \ColorPressBottom
BorderColor = \ColorPressBorder
DefaultColor = \ColorPressBorder
ElseIf (\HoverItem)
TopColor = \ColorHoverTop
BottomColor = \ColorHoverBottom
BorderColor = \ColorHoverBorder
DefaultColor = \ColorHoverBorder
Else
TopColor = \ColorIdleTop
BottomColor = \ColorIdleBottom
BorderColor = \ColorIdleBorder
DefaultColor = \ColorHoverBorder
EndIf
;
DrawingMode(#PB_2DDrawing_Gradient)
BackColor(TopColor)
FrontColor(BottomColor)
LinearGradient(0, 0, 0, Height)
Box(0, 0, Width, Height)
;
DrawingMode(#PB_2DDrawing_Outlined)
If ((\Flags & #PB_Button_Default) = #PB_Button_Default)
Box(0, 0, Width, Height, DefaultColor)
Else
Box(0, 0, Width, Height, BorderColor)
EndIf
Protected X, ImageWidth, Y, ImageHeight
DrawingFont(\FontID)
DrawingMode(#PB_2DDrawing_AlphaBlend)
X = (Width-TextWidth(\Text))>>1
Y = (Height-TextHeight(\Text))>>1
If IsImage(\Img)
ImageWidth = ImageWidth(\Img)
ImageHeight = ImageHeight(\Img)
If (\Flags & #PB_Button_Left) = #PB_Button_Left
X = X+1-ImageWidth>>1
Y = (Height - ImageHeight)>>1
ElseIf (\Flags & #PB_Button_Top) = #PB_Button_Top
X = (Width - ImageWidth)>>1
Y = Y-2-ImageHeight>>1
ElseIf (\Flags & #PB_Button_Right) = #PB_Button_Right
X = (X+TextWidth(\Text)+1)-ImageWidth>>1
Y = (Height - ImageHeight)>>1
ElseIf (\Flags & #PB_Button_Bottom) = #PB_Button_Bottom
X = (Width - ImageWidth)>>1
Y = (Y+2+TextHeight(\Text))-ImageHeight>>1
Else
X = (Width - ImageWidth)>>1
Y = (Height - ImageHeight)>>1
EndIf
DrawImage(ImageID(\Img), X, Y) ; center
X = (Width-TextWidth(\Text))>>1
Y = (Height-TextHeight(\Text))>>1
If (\Flags & #PB_Button_Left) = #PB_Button_Left
X = X+2+ImageWidth>>1
ElseIf (\Flags & #PB_Button_Top) = #PB_Button_Top
Y = Y+2+ImageHeight>>1
ElseIf (\Flags & #PB_Button_Right) = #PB_Button_Right
X = X-2-ImageWidth>>1
ElseIf (\Flags & #PB_Button_Bottom) = #PB_Button_Bottom
Y = Y-2-TextHeight(\Text)
EndIf
Else
If (\Flags & #PB_Button_Left) = #PB_Button_Left
X = 2
ElseIf (\Flags & #PB_Button_Top) = #PB_Button_Top
Y = 2
ElseIf (\Flags & #PB_Button_Right) = #PB_Button_Right
X = Width-TextWidth(\Text)-2
ElseIf (\Flags & #PB_Button_Bottom) = #PB_Button_Bottom
Y = Height-TextHeight(\Text)-2
EndIf
EndIf
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(X, Y, \Text, \ColorFont)
StopDrawing()
EndIf
EndWith
EndIf
EndIf
EndProcedure
Procedure Callback( )
Static Redraw
Protected *IMG.ImageButton = _getImageButtonData(GadgetID(EventGadget()))
If (*IMG And IsGadget(*IMG\Canvas))
With *IMG
Select (EventType())
Case #PB_EventType_Repaint
Repaint(GadgetID(EventGadget()))
Case #PB_EventType_MouseEnter,
#PB_EventType_MouseMove,
#PB_EventType_LeftButtonDown
If (GetGadgetAttribute(\Canvas, #PB_Canvas_MouseX) >=0 And
GadgetWidth(\Canvas) >= GetGadgetAttribute(\Canvas, #PB_Canvas_MouseX)) And
(GetGadgetAttribute(\Canvas, #PB_Canvas_MouseY) >=0 And
GadgetHeight(\Canvas) >= GetGadgetAttribute(\Canvas, #PB_Canvas_MouseY))
\HoverItem = #True
Else
\HoverItem = #False
EndIf
If (EventType() = #PB_EventType_LeftButtonDown)
\PressItem = #True
EndIf
Redraw = #True
Case #PB_EventType_LeftButtonUp
\PressItem = #False
Redraw = #True
Case #PB_EventType_MouseLeave
\HoverItem = #False
Redraw = #True
EndSelect
If Redraw = #True
Repaint( GadgetID(EventGadget()) )
Redraw = #False
EndIf
EndWith
EndIf
EndProcedure
Procedure Free( Gadget )
If (IsGadget(Gadget))
SetGadgetData(Gadget, #Null)
UnbindGadgetEvent(Gadget, @Callback())
If (GetGadgetData(Gadget))
ClearStructure(GetGadgetData(Gadget), ImageButton)
FreeMemory(GetGadgetData(Gadget))
EndIf
FreeGadget(Gadget)
FreeMap(*ImageButtonData())
EndIf
ProcedureReturn (#Null)
EndProcedure
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
CompilerIf Defined(GdkEvent,#PB_Structure)=#False
Structure GdkEvent
Type.l
StructureUnion
any.GdkEventAny
expose.GdkEventExpose
no_expose.GdkEventNoExpose
visibility.GdkEventVisibility
motion.GdkEventMotion
button.GdkEventButton
scroll.GdkEventScroll
key.GdkEventKey
crossing.GdkEventCrossing
focus_change.GdkEventFocus
configure.GdkEventConfigure
property.GdkEventProperty
selection.GdkEventSelection
proximity.GdkEventProximity
client.GdkEventClient
dnd.GdkEventDND
window_state.GdkEventWindowState
setting.GdkEventSetting
EndStructureUnion
EndStructure
CompilerEndIf
Procedure GetDlgCtrlID_(*Widget.GtkWidget)
Protected Gadget
PB_Object_EnumerateStart( PB_Gadget_Objects )
If PB_Gadget_Objects
While PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget )
If GadgetID( Gadget ) = *Widget\name
ProcedureReturn Gadget
EndIf
Wend
PB_Object_EnumerateAbort( PB_Gadget_Objects )
EndIf
EndProcedure
ProcedureC OS_Callback(*Event.GdkEventAny, *UserData)
Protected Stat.S
Protected *Widget.GtkWidget
Select *Event\Type
Case #GDK_CONFIGURE
Case #GDK_EXPOSE
*Widget.gtkWidget = *Event\window
If *Widget\name
;Repaint(*Widget\name)
;Debug ""+Str(*Widget\name)+" "+PeekS(gtk_widget_get_name_(*Widget\name), -1, #PB_UTF8)
PostEvent( #PB_Event_Gadget, EventWindow(), GetDlgCtrlID_(*Widget), #PB_EventType_Repaint)
EndIf
Default
EndSelect
gtk_main_do_event_(*Event)
EndProcedure
Procedure Disable_Os_Event( Gadget )
Static run
If IsGadget( Gadget )
;If run = 0 :run = 1
gdk_event_handler_set_(@OS_Callback(), Gadget, 0)
;EndIf
EndIf
EndProcedure
CompilerElse
Procedure OS_CallBack(hWnd, Msg, wParam, lParam)
Protected *Func = GetProp_( hWnd, "PB_OS_CallBack")
Select Msg
;Case #WM_PAINT
;Repaint((hWnd))
;PostEvent( #PB_Event_Gadget, EventWindow(), GetDlgCtrlID_(hWnd), #PB_EventType_Repaint)
Case #WM_SIZE
; SendMessage_(hWnd,#WM_PAINT,0,0)
PostEvent( #PB_Event_Gadget, EventWindow(), GetDlgCtrlID_(hWnd), #PB_EventType_Repaint)
Case #WM_NCDESTROY
RemoveProp_(hwnd,"PB_OS_CallBack")
Default
EndSelect
ProcedureReturn CallWindowProc_(*Func, hWnd, Msg, wParam, lParam) ; #PB_ProcessPureBasicEvents ;
EndProcedure
Procedure Disable_Os_Event( Gadget )
Protected GadgetID1, GadgetID2, GadgetID3, GadgetID4, GadgetID5, GadgetID6
If IsGadget( Gadget )
If GetProp_( GadgetID( Gadget ), "PB_OS_CallBack") = #False
SetProp_( GadgetID( Gadget ), "PB_OS_CallBack", SetWindowLong_(GadgetID( Gadget ), #GWL_WNDPROC, @OS_CallBack()))
;SetWindowCallback( @OS_CallBack());
EndIf
EndIf
EndProcedure
CompilerEndIf
Procedure Gadget( Gadget, X.i, Y.i, Width.i, Height.i, Text.s, ImageID.i = #False, Flags.i = #False, ImgWidth.i = 16, ImgHeight.i = 16 )
Protected *IMG.ImageButton = #Null
Protected Canvas.i = CanvasGadget(Gadget, X, Y, Width, Height) :If Gadget ! -1 :Canvas = Gadget :EndIf
If IsGadget(Canvas)
*IMG = AllocateMemory(SizeOf(ImageButton))
If (*IMG)
InitializeStructure(*IMG, ImageButton)
With *IMG
\Canvas = Canvas
\ColorFont = RGB(0, 0, 0)
If ImageID And Text And Flags = #False
Flags = #PB_Button_Left
EndIf
\Flags = Flags
;
CompilerSelect (#PB_Compiler_OS)
CompilerCase (#PB_OS_Windows)
Protected Temp.i = TextGadget(#PB_Any, 0, 0, 25, 25, " ")
If (Temp)
\FontID = GetGadgetFont(Temp)
FreeGadget(Temp)
EndIf
: \FontID = GetGadgetFont(#PB_Default)
CompilerCase (#PB_OS_MacOS)
Protected Temp.i = TextGadget(#PB_Any, 0, 0, 25, 25, " ")
If (Temp)
\FontID = GetGadgetFont(Temp)
FreeGadget(Temp)
EndIf
CompilerDefault
Protected Temp.i = TextGadget(#PB_Any, 0, 0, 25, 25, " ")
If (Temp)
\FontID = GetGadgetFont(Temp)
FreeGadget(Temp)
EndIf
; CompilerError "Not tested on this OS yet"
CompilerEndSelect
; CompilerIf #PB_Compiler_OS = #PB_OS_Windows
; CanvasColor = GetSysColor_(#COLOR_3DFACE)
; CompilerEndIf
;
; Default colors (based on Windows 7)
\ColorIdleBorder = RGB(172, 172, 172)
\ColorIdleTop = RGB(240, 240, 240)
\ColorIdleBottom = RGB(229, 229, 229)
;\ColorHoverBorder = RGB(126, 180, 234)
\ColorHoverBorder = RGB(0, 160, 252)
\ColorHoverTop = RGB(236, 244, 252)
\ColorHoverBottom = RGB(220, 236, 252)
\ColorPressBorder = RGB(86, 157, 229)
\ColorPressTop = RGB(218, 236, 252)
\ColorPressBottom = RGB(196, 224, 252)
\Img = Img(ImageID,ImgWidth,ImgHeight)
\Text = " "+Text.s+" "
EndWith
;
_setImageButtonData(GadgetID(Canvas), *IMG)
Repaint( GadgetID(Canvas) )
BindGadgetEvent(Canvas, @Callback())
Disable_Os_Event( Canvas )
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
If GetWindowLongPtr_(GadgetID(Canvas), #GWL_STYLE) & #WS_CLIPSIBLINGS = #False
SetWindowLongPtr_( GadgetID(Canvas), #GWL_STYLE, GetWindowLongPtr_( GadgetID(Canvas), #GWL_STYLE )|#WS_CLIPSIBLINGS )
EndIf
CompilerEndIf
Else
FreeGadget(Canvas)
EndIf
EndIf
ProcedureReturn (Canvas)
EndProcedure
EndModule
UsePNGImageDecoder()
LoadImage(4, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Paste.png")
Procedure Resize()
Protected Gadget
PB_Object_EnumerateStart( PB_Gadget_Objects )
If PB_Gadget_Objects
While PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget )
If IsGadget( Gadget )
ResizeGadget(Gadget,#PB_Ignore,#PB_Ignore,WindowWidth(EventWindow())-20,#PB_Ignore)
EndIf
Wend
PB_Object_EnumerateAbort( PB_Gadget_Objects )
EndIf
EndProcedure
Procedure Repaint()
; Protected Gadget
; PB_Object_EnumerateStart( PB_Gadget_Objects )
;
; If PB_Gadget_Objects
; While PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget )
; If IsGadget( Gadget )
; ; ResizeGadget(Gadget,#PB_Ignore,#PB_Ignore,WindowWidth(EventWindow())-20,#PB_Ignore)
; ImageButton::Repaint(GadgetID(Gadget))
; ;Break
; EndIf
; Wend
;
; PB_Object_EnumerateAbort( PB_Gadget_Objects )
; EndIf
;
EndProcedure
If OpenWindow(0, 0, 0, 150, 515, "ImageButton", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
WindowBounds(0,150,515,#PB_Ignore,515)
ImageButton::Gadget(#PB_Any, 10,10,130,25,"image_left",ImageID(4),#PB_Button_Left)
ImageButton::Gadget(#PB_Any, 10,40,130,25,"image_right",ImageID(4),#PB_Button_Right)
ImageButton::Gadget(#PB_Any, 10,70,130,75,"image_top",ImageID(4),ImageButton::#PB_Button_Top,32,32)
ImageButton::Gadget(#PB_Any, 10,150,130,75,"image_bottom",ImageID(4),ImageButton::#PB_Button_Bottom,32,32)
ImageButton::Gadget(#PB_Any, 10,230,130,75,"",ImageID(4))
ImageButton::Gadget(#PB_Any, 10,310,130,35,"text_center",0,#PB_Button_Default)
ImageButton::Gadget(#PB_Any, 10,350,130,35,"text_left",0,#PB_Button_Left)
ImageButton::Gadget(#PB_Any, 10,390,130,35,"text_right",0,#PB_Button_Right)
ImageButton::Gadget(#PB_Any, 10,430,130,35,"text_top",0,ImageButton::#PB_Button_Top)
ImageButton::Gadget(#PB_Any, 10,470,130,35,"text_bottom",0,ImageButton::#PB_Button_Bottom)
BindEvent( #PB_Event_SizeWindow, @Resize())
;BindEvent( #PB_Event_Repaint, @Repaint())
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
; IDE Options = PureBasic 5.31 (Linux - x86)
; CursorPosition = 28
; Folding = O5-MAsP5FA9
; EnableUnicode
; EnableXP