Code: Select all
EnableExplicit
Enumeration
;{ ************** PB GADGETS **************
#Button_1
#Button_2
#Button_3
#Button_4
#Panel_1
#Panel_2
#Image_1
#CheckBox_1
#ListIcon_1
#ListView_1
#TrackBar_1
#Spin_1
#ComboBox_1
#__PB_GADGET_ENUM_LAST ; ******************
;}
;{ **************** TOOLBAR ***************
#__PB_TOOLBARS_START ; ********************
#MAIN_TOOLBAR
#__PB_TOOLBARS_END ; **********************
#__PB_TOOLBARITEMS_START ;*****************
#Toolbar_button1
#Toolbar_button2
#Toolbar_button3
#__PB_TOOLBARITEMS_END ;*******************
;}
;{ ********* MENU *************************
#__PB_MENU_START ; ************************
#WINDOW_MENU
#POPUPMENU_1
#POPUPMENU_2
#__PB_MENU_END ; **************************
#__PB_MENUITEMS_START ; *******************
#Menu_item1
#Menu_item2
#Menu_item3
#Menu_item4
#Popup_item1
#Popup_item2
#Popup_item3
#Popup_item4
#Popup_item5
#Popup2_item1
#Popup2_item2
#__PB_MENUITEMS_END ; *********************
;}
;{ ****** STATUSBAR ***********************
#__PB_STATUSBAR_START ;********************
#MAIN_STATUSBAR
#__PB_STATUSBAR_END ;**********************
;}
#__GADGET_ENUM_MAX
EndEnumeration
Structure WINDOWGADGETS
Gadgets.i[#__GADGET_ENUM_MAX*2]
EndStructure
Macro pGadgetID(gadget)
*gadgets\Gadgets[#__GADGET_ENUM_MAX+gadget]
EndMacro
Macro pGadget(gadget)
*gadgets\Gadgets[gadget]
EndMacro
Macro _GadgetID(gadget)
gadgets\Gadgets[#__GADGET_ENUM_MAX+gadget]
EndMacro
Macro Gadget(gadget)
gadgets\Gadgets[gadget]
EndMacro
#MAIN_WINDOW_CLASS_NAME="MAIN_WINDOW_CLASS"
#WM_USER_SET_GADGETS_POINTER = #WM_USER
Macro LoWord(value)
value & $FFFF
EndMacro
Macro HiWord(value)
value >> 16 & $FFFF
EndMacro
Procedure WinMainCallback(hWnd, msg, wParam, lParam)
Static *gadgets.WINDOWGADGETS
;{ ************ TODO LIST (DETECT:)**************
;[DONE] Menu & PopupMenu events
;[DONE] Toolbar events
;[DONE] Button click
;[DONE] ImageGadget mouse left button click
;[ ] ImageGadget mouse left button release
;[DONE] ComboBoxGadget change
;[DONE] CheckBoxGadget change
;[* ] ListIconGadget change (* NOTE: 3 events at once, need only one)
;[* ] ListViewGadget change (* NOTE: works with mouse clicks, but not when changing with keyboard)
;[DONE] SpinGadget change
;[* ] TrackbarGadget change (* NOTE: works with mouse clicks, but not when changing with keyboard)
;[DONE] PanelGadget change
;[ ] Right mouse click in listicon (to DisplayPopupMenu when mouse button is >released<)
;} **********************************************
Select msg
Case #WM_USER_SET_GADGETS_POINTER
*gadgets=wParam
Case #WM_CLOSE
;{ free gadgets/menu/toolbar/statusbar
Protected k
For k=0 To #__PB_GADGET_ENUM_LAST-1
If pGadget(k)<>0
FreeGadget(pGadget(k))
EndIf
Next
For k=#__PB_STATUSBAR_START+1 To #__PB_STATUSBAR_END-1
If pGadget(k)<>0
FreeStatusBar(pGadget(k))
EndIf
Next
For k=#__PB_TOOLBARS_START+1 To #__PB_TOOLBARS_END-1
If pGadget(k)<>0
FreeToolBar(pGadget(k))
EndIf
Next
For k=#__PB_MENU_START+1 To #__PB_MENU_END-1
If pGadget(k)<>0
FreeMenu(pGadget(k))
EndIf
Next
;}
DestroyWindow_(hWnd)
UnregisterClass_(#MAIN_WINDOW_CLASS_NAME, GetModuleHandle_(#Null))
Case #WM_DESTROY
PostQuitMessage_(0)
Case #WM_NOTIFY
Protected *pNMHDR.NMHDR = lParam
If wParam = pGadget(#Panel_1)
If *pNMHDR\code = #TCN_SELCHANGE
Debug "TAB Changed"
If GetGadgetState(pGadget(#Panel_1)) = 1
HideGadget(pGadget(#Panel_2),1)
ElseIf GetGadgetState(pGadget(#Panel_1)) = 0
HideGadget(pGadget(#Panel_2),0)
EndIf
EndIf
ElseIf wParam = pGadget(#ListIcon_1)
If *pNMHDR\code = #LVN_COLUMNCLICK
Debug "ListIcon Column Changed"
ElseIf *pNMHDR\code = #LVN_ITEMCHANGED
Debug "ListIcon Item Changed, lParam="+Str(lParam)
EndIf
ElseIf wParam = pGadget(#TrackBar_1)
If *pNMHDR\code = #NM_RELEASEDCAPTURE
Debug "TrackBar change"
EndIf
ElseIf wParam = pGadget(#Spin_1)
If *pNMHDR\code = #UDN_DELTAPOS
Debug "SpinGadget change"
EndIf
EndIf
Case #WM_COMMAND
Select HiWord(wParam)
Case #CBN_SELCHANGE
If lParam = pGadgetID(#ComboBox_1)
Debug "ComboBox Select Item Changed"
EndIf
Case #LBN_SELCANCEL
If lParam = pGadgetID(#ListView_1)
Debug "ListView Select Item Changed"
EndIf
Case #BN_CLICKED
Select lParam
Case pGadgetID(#Button_1)
Debug "clicked on button1"
AddGadgetItem(pGadget(#ListIcon_1),-1,Str(ElapsedMilliseconds()))
Case pGadgetID(#Button_2)
Debug "clicked on button2"
ClearGadgetItems(pGadget(#ListIcon_1))
DisplayPopupMenu(pgadget(#POPUPMENU_1),hWnd)
Case pGadgetID(#Image_1)
Debug "left mouse button Down on image1"
DisplayPopupMenu(pgadget(#POPUPMENU_2),hWnd)
Case pGadgetID(#CheckBox_1)
If GetGadgetState(pGadget(#CheckBox_1)) = 1
Debug "CheckBox Checked"
Else
Debug "CheckBox UnChecked"
EndIf
EndSelect
EndSelect
;{ MENU AND TOOLBAR EVENTS
Select lParam
Case 0 ; menu event
Select LoWord(wParam)
Case pGadget(#Menu_item1)
Debug "Menu item 1"
Case pGadget(#Menu_item2)
Debug "Menu item 2"
Case pGadget(#Menu_item3)
Debug "Menu item 3"
Case pGadget(#Menu_item4)
Debug "Menu item 4"
SendMessage_(hWnd,#WM_CLOSE,0,0)
Case pGadget(#Popup_item1)
Debug "PopupMenu item 1"
Case pGadget(#Popup_item2)
Debug "PopupMenu item 2"
Case pGadget(#Popup_item3)
Debug "PopupMenu item 3"
Case pGadget(#Popup_item4)
Debug "PopupMenu item 4"
Case pGadget(#Popup_item5)
Debug "PopupMenu item 5"
Case pGadget(#Popup2_item1)
Debug "PopupMenu2 item 1"
Case pGadget(#Popup2_item2)
Debug "PopupMenu2 item 2"
EndSelect
Case pGadgetID(#MAIN_TOOLBAR)
Select LoWord(wParam)
Case pGadget(#Toolbar_button1)
Debug "Toolbar button 1"
Case pGadget(#Toolbar_button2)
Debug "Toolbar button 2"
Case pGadget(#Toolbar_button3)
Debug "Toolbar button 3"
EndSelect
EndSelect
;}
Default
ProcedureReturn DefWindowProc_(hWnd, msg, wParam, lParam)
EndSelect
ProcedureReturn 0
EndProcedure
Macro __FailedToInitWindow()
SendMessage_(hWnd,#WM_CLOSE,0,0)
ProcedureReturn 0
EndMacro
Macro CreateMenuItem(menu_item,text)
Gadget(menu_item)=__menu_items_count : MenuItem(Gadget(menu_item), text)
__menu_items_count+1
EndMacro
Macro MyCreateStatusBar(statusbar_,hWnd)
Gadget(statusbar_)=CreateStatusBar(#PB_Any,hWnd)
If Gadget(statusbar_)=0
__FailedToInitWindow()
EndIf
EndMacro
Macro MyCreateToolBar(toolbar_,hWnd)
Gadget(toolbar_)=CreateToolBar(#PB_Any,hWnd)
If Gadget(toolbar_)=0
__FailedToInitWindow()
EndIf
EndMacro
Macro AddToolbarStandardButton(toolbar_item_,ButtonIcon)
Gadget(toolbar_item_)=__menu_items_count : ToolBarStandardButton(Gadget(toolbar_item_), ButtonIcon)
__menu_items_count+1
EndMacro
Macro MyCreatePopupMenu(item_)
Gadget(item_)=CreatePopupMenu(#PB_Any)
If Gadget(item_)=0
__FailedToInitWindow()
EndIf
EndMacro
Macro MyCreateMenu(menu_,hWnd)
Gadget(menu_)=CreateMenu(#PB_Any,hWnd)
If Gadget(menu_)=0
__FailedToInitWindow()
EndIf
EndMacro
Macro MyButtonGadget(gadget_,x_,y_,w_,h_,text_)
Gadget(gadget_)=ButtonGadget(#PB_Any,x_, y_, w_, h_,text_)
EndMacro
Macro MyPanelGadget(gadget_,x_,y_,w_,h_)
Gadget(gadget_)=PanelGadget(#PB_Any,x_, y_, w_, h_)
EndMacro
Macro MyImageGadget(gadget_,x_,y_,w_,h_,imageid_,flags_)
Gadget(gadget_)=ImageGadget(#PB_Any,x_,y_,w_,h_,imageid_,flags_)
EndMacro
Macro MyComboBoxGadget(gadget_,x_,y_,w_,h_,flags_)
Gadget(gadget_)=ComboBoxGadget(#PB_Any,x_,y_,w_,h_,flags_)
EndMacro
Macro MyCheckBoxGadget(gadget_,x_,y_,w_,h_,text_,flags_)
Gadget(gadget_)=CheckBoxGadget(#PB_Any,x_,y_,w_,h_,text_,flags_)
EndMacro
Macro MyListIconGadget(gadget_,x_,y_,w_,h_,title_,titlewidth_,flags_)
Gadget(gadget_)=ListIconGadget(#PB_Any,x_,y_,w_,h_,title_,titlewidth_,flags_)
EndMacro
Macro MyListViewGadget(gadget_,x_,y_,w_,h_,flags_)
Gadget(gadget_)=ListViewGadget(#PB_Any,x_,y_,w_,h_,flags_)
EndMacro
Macro MyTrackBarGadget(gadget_,x_,y_,w_,h_,min_,max_,flags_)
Gadget(gadget_)=TrackBarGadget(#PB_Any,x_,y_,w_,h_,min_,max_,flags_)
EndMacro
Macro MySpinGadget(gadget_,x_,y_,w_,h_,min_,max_,flags_)
Gadget(gadget_)=SpinGadget(#PB_Any,x_,y_,w_,h_,min_,max_,flags_)
EndMacro
Macro MyAddGadgetItem(gadget_,position_,text_,imageid_,flags_)
AddGadgetItem(Gadget(gadget_), position_,text_,imageid_,flags_)
EndMacro
Macro MyAddGadgetColumn(gadget_,position_,title_,width_)
AddGadgetColumn(Gadget(gadget_), position_,title_,width_)
EndMacro
Macro MySetGadgetState(gadget_,state_)
SetGadgetState(Gadget(gadget_),state_)
EndMacro
Procedure WinMain()
Protected wc.WNDCLASSEX
Protected g_szClassName.s = #MAIN_WINDOW_CLASS_NAME
Protected k
wc\cbSize = SizeOf(WNDCLASSEX)
;wc\style = 0
wc\lpfnWndProc = @WinMainCallback()
;wc\cbClsExtra = 0
;wc\cbWndExtra = 0
wc\hInstance = GetModuleHandle_(#Null)
wc\hIcon = LoadIcon_(#Null, #IDI_APPLICATION)
wc\hCursor = LoadCursor_(#Null, #IDC_ARROW)
wc\hbrBackground = #COLOR_WINDOW
;wc\lpszMenuName = #Null
wc\lpszClassName = @g_szClassName.s
wc\hIconSm = LoadIcon_(#Null, #IDI_APPLICATION)
If RegisterClassEx_(@wc) = 0
ProcedureReturn 0
EndIf
Protected x = GetSystemMetrics_(#SM_CXSCREEN)/2 - 215
Protected y = GetSystemMetrics_(#SM_CYSCREEN)/2 - 215
Protected hWnd = CreateWindowEx_(0,g_szClassName.s,"The title of my window",#WS_OVERLAPPEDWINDOW,x,y,430,430,#Null, #Null, wc\hInstance, #Null)
If hWnd = #Null
UnregisterClass_(g_szClassName.s, GetModuleHandle_(#Null))
ProcedureReturn 0
EndIf
Protected gadgets.WINDOWGADGETS
SendMessage_(hWnd,#WM_USER_SET_GADGETS_POINTER,@gadgets.WINDOWGADGETS,0)
;{ PureBasic gadget functions
UseGadgetList(hWnd)
MyButtonGadget(#Button_1, 5, 40, 50, 23,"add")
MyButtonGadget(#Button_2, 60, 40, 50, 23,"clear")
MyPanelGadget(#Panel_1, 135, 35, 210, 140)
MyAddGadgetItem(#panel_1, -1, "Panel 1",0,0)
MyPanelGadget(#Panel_2, 5, 5, 180, 100)
MyAddGadgetItem(#panel_2, -1, "Sub-Panel 1",0,0)
MyAddGadgetItem(#panel_2, -1, "Sub-Panel 2",0,0)
MyAddGadgetItem(#panel_2, -1, "Sub-Panel 3",0,0)
CloseGadgetList()
MyAddGadgetItem(#panel_1, -1,"Panel 2",0,0)
MyButtonGadget(#Button_3, 10, 15, 80, 24,"Button 3")
MyButtonGadget(#Button_4, 95, 15, 80, 24,"Button 4")
CloseGadgetList()
MyImageGadget(#Image_1,5, 115, 64, 64, 0,#PB_Image_Border)
MyComboBoxGadget(#ComboBox_1,5, 90, 110, 23, 0)
For k=1 To 5
MyAddGadgetItem(#Combobox_1, -1,"ComboBox item " + Str(k),0,0)
Next
MySetGadgetState(#Combobox_1,1)
MyCheckBoxGadget(#CheckBox_1,5, 65, 105, 20,"checkbox",0)
MyListIconGadget(#ListIcon_1, 140, 180, 210, 150, "list", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
MyAddGadgetColumn(#ListIcon_1, 1, "Address", 250)
For k = 1 To 5
MyAddGadgetItem(#ListIcon_1, -1, "Harry Rannit"+Chr(10)+"12 Parliament Way, Battle Street, By the Bay",0,0)
Next
MyListViewGadget(#ListView_1, 5, 225, 125, 90,0)
For k = 1 To 3
MyAddGadgetItem(#ListView_1, -1, "Item " + Str(k) + " of the Listview",0,0) ; define listview content
Next
MyTrackBarGadget(#TrackBar_1, 5, 190, 100, 20, 0, 10, #PB_TrackBar_Ticks)
MySetGadgetState(#TrackBar_1,5)
MySpinGadget(#Spin_1, 75, 160, 55, 20, 0, 100,#PB_Spin_Numeric)
MySetGadgetState(#Spin_1,10)
;{ menu
Protected __menu_items_count
MyCreateMenu(#WINDOW_MENU,hWnd)
MenuTitle("File")
CreateMenuItem(#Menu_item1,"Open")
CreateMenuItem(#Menu_item2,"2")
CreateMenuItem(#Menu_item3,"3")
CreateMenuItem(#Menu_item4,"Close")
MyCreatePopupMenu(#POPUPMENU_1)
CreateMenuItem(#Popup_item1,"option1")
CreateMenuItem(#Popup_item2,"option2")
CreateMenuItem(#Popup_item3,"option3")
CreateMenuItem(#Popup_item4,"option4")
CreateMenuItem(#Popup_item5,"option5")
MyCreatePopupMenu(#POPUPMENU_2)
CreateMenuItem(#Popup2_item1,"option1_2")
CreateMenuItem(#Popup2_item2,"option2_2")
;}
;{ statusbar
MyCreateStatusBar(#MAIN_STATUSBAR,hWnd)
AddStatusBarField(75)
StatusBarText(Gadget(#MAIN_STATUSBAR),0,Str(123))
;}
;{ toolbar
;__menu_items_count=0
MyCreateToolBar(#MAIN_TOOLBAR,hWnd)
AddToolbarStandardButton(#Toolbar_button1,#PB_ToolBarIcon_New)
AddToolbarStandardButton(#Toolbar_button2,#PB_ToolBarIcon_Open)
AddToolbarStandardButton(#Toolbar_button3,#PB_ToolBarIcon_Save)
;}
;}
;{ convert PB gadget ID's to system handles
For k=0 To #__PB_GADGET_ENUM_LAST-1
If Gadget(k)<>0
_GadgetID(k)=GadgetID(Gadget(k))
Else
__FailedToInitWindow()
EndIf
Next
For k=#__PB_STATUSBAR_START+1 To #__PB_STATUSBAR_END-1
If Gadget(k)<>0
_GadgetID(k)=StatusBarID(Gadget(k))
EndIf
Next
For k=#__PB_TOOLBARS_START+1 To #__PB_TOOLBARS_END-1
If Gadget(k)<>0
_GadgetID(k)=ToolBarID(Gadget(k))
EndIf
Next
For k=#__PB_MENU_START+1 To #__PB_MENU_END-1
If Gadget(k)<>0
_GadgetID(k)=MenuID(Gadget(k))
EndIf
Next
;}
ShowWindow_(hWnd, #True)
UpdateWindow_(hWnd)
Protected Msg.MSG
While (GetMessage_(@Msg, #Null, 0, 0) > 0)
TranslateMessage_(@Msg)
DispatchMessage_(@Msg)
Wend
ProcedureReturn Msg\wParam
EndProcedure
WinMain()
Thanks
Edit1: updated code