CreateWindowEx_() + PB Gadgets, window callback events!?

Windows specific forum
cas
Enthusiast
Enthusiast
Posts: 597
Joined: Mon Nov 03, 2008 9:56 pm

CreateWindowEx_() + PB Gadgets, window callback events!?

Post by cas »

This is code snippet to show what i am looking for. Look at WinMainCallback(), i need only this procedure edited with added messages to detect these events, everything else is not important.

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()
Any help is appreciated.
Thanks

Edit1: updated code
Last edited by cas on Thu Nov 11, 2010 4:10 am, edited 1 time in total.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by RASHAD »

@cas
Nice code
Next is some progrss

New update

Code: Select all

;EnableExplicit
Global tnpos,topos,linpos,liopos,lirun

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
  ;[DONE] ListIconGadget change (* NOTE: 3 events at once, need only one) + keyboard events
  ;[DONE] ListViewGadget change (* NOTE: works with mouse clicks, but not when changing with keyboard)
  ;[DONE] SpinGadget change
  ;[DONE] TrackbarGadget change (* NOTE: works with mouse clicks, but not when changing with keyboard)
  ;[DONE] PanelGadget change
  ;[DONE] 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)
        Select  *pNMHDR\code
          Case #LVN_COLUMNCLICK
             Debug "ListIcon Column Changed"
          
          Case #NM_CLICK,#LVN_KEYDOWN
                Debug "ListIcon Item Changed "

          Case #NM_RCLICK
               Debug "Right Click"              
                     
        EndSelect

      ElseIf wParam = pGadget(#Spin_1)
        If *pNMHDR\code = #UDN_DELTAPOS
          Debug "SpinGadget change"
        EndIf
      EndIf
      
    
    Case #WM_HSCROLL
        If lParam = pGadgetID(#TrackBar_1)
            tnpos = GetGadgetState(pGadget(#TrackBar_1))
             If tnpos <> topos
                Debug "TrackBar change" 
             EndIf
            topos = tnpos            
        EndIf
          
    Case #WM_COMMAND
      Select HiWord(wParam)
         
        Case #CBN_SELCHANGE
          If lParam = pGadgetID(#ComboBox_1)
            Debug "ComboBox Select Item Changed"
          EndIf
         
        Case #LBN_SELCANCEL,#LBN_SELCHANGE
          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(#ListView_1)
          If HiWord(wParam) = #LBN_SELCHANGE
            Debug "ListView Select Item Changed"
          EndIf
        
        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,#LBS_WANTKEYBOARDINPUT|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()

Edit : Code Updated
Edit 2 : more versatile
Edit 3 :
Last edited by RASHAD on Fri Nov 12, 2010 5:06 pm, edited 3 times in total.
Egypt my love
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by Kwai chang caine »

MASTER RASHAD is better and faster than KCC, normal RASHAD is MASTER and Kcc student :oops:

But for a time i have better event for the combobox, because RASHAD code don't give the element changing :D
The code is of SROD, with it, you have the line selected 8)

So i give it when event, if you need it CAS 8)

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 *******
  #TOOLBAR
  #Toolbar_button1
  #Toolbar_button2
  #Toolbar_button3
  ;}
 
  ;{ ********* MENU *********
  #MENU
  #Menu_item1
  #Menu_item2
  ;}
 
  ;{ ****** STATUSBAR *******
  #STATUSBAR
  ;}
 
  #__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

#WM_USER_SET_GADGETS_POINTER = #WM_USER

Procedure WinMainCallback(hWnd, msg, wParam, lParam)
 Static *gadgets.WINDOWGADGETS
 Static selItem 
 
  ;{ ****** TODO LIST (DETECT:)********
  ;[    ] Menu events
  ;[    ] Toolbar events
  ;[DONE] Button click
  ;[DONE] ImageGadget left button click (done with #BN_CLICKED, maybe #WM_LBUTTONDOWN is right way to do this?)
  ;[    ] ImageGadget left button release (#WM_LBUTTONUP ?)
  ;[DONE] ComboBoxGadget change ; SROD code
  ;[    ] CheckBoxGadget change
  ;[    ] ListIconGadget change
  ;[    ] ListViewGadget change
  ;[    ] SpinGadget change
  ;[    ] TrackbarGadget change
  ;[    ] PanelGadget change
  ;} **********************************
 
  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
      If pGadget(#STATUSBAR)<>0 : FreeStatusBar(pGadget(#STATUSBAR)) : EndIf
      If pGadget(#TOOLBAR)<>0   : FreeToolBar(pGadget(#TOOLBAR))     : EndIf
      If pGadget(#MENU)<>0      : FreeMenu(pGadget(#MENU))           : EndIf
      ;}
      DestroyWindow_(hWnd)
    Case #WM_DESTROY
     PostQuitMessage_(0)
   
    Case #WM_COMMAND
     
     Select wParam>>16 & $FFFF
       
      Case #CBN_DROPDOWN 
       
          If lParam = pGadget(#ComboBox_1)
            selItem = GetGadgetState(pGadget(#ComboBox_1)) 
          EndIf 
      
        Case #CBN_CLOSEUP 
          If lParam = GadgetID(pGadget(#ComboBox_1)) And SelItem <> GetGadgetState(pGadget(#ComboBox_1)) 
            Debug "Selected item " + Str(GetGadgetState(pGadget(#ComboBox_1))) 
          EndIf 

        Case #CBN_SELENDOK    
          If lParam = GadgetID(pGadget(#ComboBox_1)) 
            If SendMessage_(lParam, #CB_GETDROPPEDSTATE, 0, 0) = 0 
              selItem = GetGadgetState(pGadget(#ComboBox_1)) 
              Debug "Selected item " + Str(selItem) 
            EndIf 
           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))
            Case pGadgetID(#Button_3)
              Debug "clicked on button3"
            Case pGadgetID(#Button_4)
              Debug "clicked on button4"
            Case pGadgetID(#Image_1)
              Debug "left mouse button pressed on image1"
          EndSelect
      EndSelect
    Default
      ProcedureReturn DefWindowProc_(hWnd, msg, wParam, lParam)
  EndSelect
 
  ProcedureReturn 0
EndProcedure



Macro __FailedToInitWindow()
  SendMessage_(hWnd,#WM_CLOSE,0,0)
  ProcedureReturn 0
EndMacro

Procedure WinMain(hInstance=0)
 
  Protected wc.WNDCLASSEX
  Protected g_szClassName.s = "MAIN_WINDOW_CLASS"
  Protected k
 
  wc\cbSize        = SizeOf(WNDCLASSEX)
  ;wc\style        = 0
  wc\lpfnWndProc   = @WinMainCallback()
  ;wc\cbClsExtra   = 0
  ;wc\cbWndExtra   = 0
  wc\hInstance     = hInstance
  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 hWnd = CreateWindowEx_(0,g_szClassName.s,"The title of my window",#WS_OVERLAPPEDWINDOW,#CW_USEDEFAULT, #CW_USEDEFAULT, 440, 420,#Null, #Null, hInstance, #Null)
 
  If hWnd = #Null
    ProcedureReturn 0
  EndIf
 
  Protected gadgets.WINDOWGADGETS
  SendMessage_(hWnd,#WM_USER_SET_GADGETS_POINTER,@gadgets.WINDOWGADGETS,0)
 
  ;{ PureBasic gadget functions
 
  UseGadgetList(hWnd)
 
  Gadget(#Button_1)=ButtonGadget(#PB_Any,5, 40, 50, 23,"add")
  Gadget(#Button_2)=ButtonGadget(#PB_Any,60, 40, 50, 23,"clear")
 
  Gadget(#Panel_1)=PanelGadget(#PB_Any,135, 35, 210, 180)
  AddGadgetItem(Gadget(#panel_1), -1, "Panel 1")
    Gadget(#Panel_2)=PanelGadget (#PB_Any, 5, 5, 180, 130)
      AddGadgetItem(Gadget(#panel_2), -1, "Sub-Panel 1")
      AddGadgetItem(Gadget(#panel_2), -1, "Sub-Panel 2")
      AddGadgetItem(Gadget(#panel_2), -1, "Sub-Panel 3")
    CloseGadgetList()
  AddGadgetItem(Gadget(#panel_1), -1,"Panel 2")
    Gadget(#Button_3)=ButtonGadget(#PB_Any, 10, 15, 80, 24,"Button 3")
    Gadget(#Button_4)=ButtonGadget(#PB_Any, 95, 15, 80, 24,"Button 4")
  CloseGadgetList()
 
  Gadget(#Image_1)=ImageGadget(#PB_Any,5, 115, 64, 64, 0,#PB_Image_Border)
 
  Gadget(#ComboBox_1)=ComboBoxGadget(#PB_Any,5, 90, 110, 23)
  
  For k=1 To 5
    AddGadgetItem(Gadget(#Combobox_1), -1,"ComboBox item " + Str(k))
   Next
   
  SetGadgetState(Gadget(#Combobox_1),1)
 
  Gadget(#CheckBox_1)=CheckBoxGadget(#PB_Any,5, 65, 105, 20,"checkbox")
 
  Gadget(#ListIcon_1)=ListIconGadget(#PB_Any, 140, 225, 210, 90, "list", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
 
  Gadget(#ListView_1)=ListViewGadget(#PB_Any, 5, 225, 125, 90)
 
  Gadget(#TrackBar_1)=TrackBarGadget(#PB_Any, 5, 190, 100, 20, 0, 10, #PB_TrackBar_Ticks)
  SetGadgetState(Gadget(#TrackBar_1),5)
 
  Gadget(#Spin_1)=SpinGadget(#PB_Any, 75, 160, 55, 20, 0, 100,#PB_Spin_Numeric)
  SetGadgetState(Gadget(#Spin_1),10)
 
 
  ;{ menu
  Gadget(#MENU)=CreateMenu(#PB_Any,hWnd)
  If Gadget(#MENU)<>0
    MenuTitle("File")
    Gadget(#Menu_item1)=1 : MenuItem(Gadget(#Menu_item1), "Open")
    Gadget(#Menu_item2)=2 : MenuItem(Gadget(#Menu_item2), "Close")
  Else
    __FailedToInitWindow()
  EndIf
  _GadgetID(#MENU)=MenuID(Gadget(#MENU))
  ;}
 
  ;{ statusbar
  Gadget(#STATUSBAR)=CreateStatusBar(#PB_Any,hWnd)
  If Gadget(#STATUSBAR)<>0
    AddStatusBarField(75)
    StatusBarText(Gadget(#STATUSBAR),0,Str(123))
  Else
    __FailedToInitWindow()
  EndIf
  _GadgetID(#STATUSBAR)=StatusBarID(Gadget(#STATUSBAR))
  ;}
 
  ;{ toolbar
  Gadget(#TOOLBAR)=CreateToolBar(#PB_Any,hWnd)
  If Gadget(#TOOLBAR)<>0
    Gadget(#Toolbar_button1)=0 : ToolBarStandardButton(Gadget(#Toolbar_button1), #PB_ToolBarIcon_New)
    Gadget(#Toolbar_button2)=1 : ToolBarStandardButton(Gadget(#Toolbar_button2), #PB_ToolBarIcon_Open)
    Gadget(#Toolbar_button3)=2 : ToolBarStandardButton(Gadget(#Toolbar_button3), #PB_ToolBarIcon_Save)
  Else
    __FailedToInitWindow()
  EndIf
  _GadgetID(#TOOLBAR)=ToolBarID(Gadget(#TOOLBAR))
  ;}
  ;}
 
  ;{ 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
  ;}
 
  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()
ImageThe happiness is a road...
Not a destination
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by RASHAD »

@KCC
I just coded the way that notify the ComboBox is checked the rest is for 'cas'
But nice one KCC
I am sure now that you will succeed in learning C
Good luck mate
Egypt my love
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by Kwai chang caine »

Master RASHAD wrote:I am sure now that you will succeed in learning C
Good luck mate
This sentence come of you, have really too much value for me MASTER 8)
Thanks you very much
ImageThe happiness is a road...
Not a destination
User avatar
hallodri
Enthusiast
Enthusiast
Posts: 208
Joined: Tue Nov 08, 2005 7:59 am
Location: Germany
Contact:

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by hallodri »

Code: Select all

;[DONE] ImageGadget left button click (done with #BN_CLICKED, maybe #WM_LBUTTONDOWN is right way to do this?)
#STN_CLICKED is correct, but is also 0, as #BN_CLICKED. This only works with the SS_NOTIFY flag.

here is a failed event handler from me
http://www.realsource.de/tmp/EventHandler.rar
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by RASHAD »

Code Updated
More progress
Egypt my love
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by Kwai chang caine »

Yahoo ...with MASTER RASHAD we are the DREAM TEAM :lol:
After the code of MASTER SROD for return combo element clicked (Don't forget CAS, if you need to have it :wink:)
http://www.purebasic.fr/english/viewtop ... 92#p338392
Addin management of TrackBar thanks to a code of MASTER NETMAESTRO 8)

I think a good cleanup is really necessary...it's really the mess this code :lol:
I hope comunity of LINUX are more coordinate :lol: :lol:

Code: Select all

;EnableExplicit

Global Run

#BN_ENABLE = 7
#TrackBar_MouseDown = #WM_APP+1 
#TrackBar_MouseUp   = #WM_APP+2 

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 *******
  #TOOLBAR
  #Toolbar_button1
  #Toolbar_button2
  #Toolbar_button3
  ;}

  ;{ ********* MENU *********
  #MENU
  #Menu_item1
  #Menu_item2
  ;}

  ;{ ****** STATUSBAR *******
  #STATUSBAR
  ;}

  #__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

#WM_USER_SET_GADGETS_POINTER = #WM_USER

Procedure TBProc(hwnd, msg, wparam, lparam) 
 
  oldproc = GetProp_(hwnd, "oldproc") 
  ctrlid  = GetProp_(hwnd, "PB_ID")
  Static MemCtrlid
    
  Select msg 
    
   Case #WM_LBUTTONDOWN 
    
     PostMessage_(GetWindow_(hwnd, #GW_OWNER), #TrackBar_MouseDown, ctrlid, GetGadgetState(ctrlid))
     
     If Not MemCtrlid
      MemCtrlid = GetGadgetState(ctrlid)
     Else
      If GetGadgetState(ctrlid) <> MemCtrlid
       Debug "TrackBar move of " + Str(MemCtrlid) + " to " + Str(GetGadgetState(ctrlid))
       MemCtrlid = GetGadgetState(ctrlid) 
      EndIf 
     EndIf 
     
       
    Case #WM_LBUTTONUP
     
     PostMessage_(GetWindow_(hwnd, #GW_OWNER), #TrackBar_MouseUp, ctrlid, GetGadgetState(ctrlid)) 
     
     If Not MemCtrlid
      MemCtrlid = GetGadgetState(ctrlid)
     Else
   
      If GetGadgetState(ctrlid) <> MemCtrlid
       Debug "TrackBar move of " + Str(MemCtrlid) + " to " + Str(GetGadgetState(ctrlid))
       MemCtrlid = GetGadgetState(ctrlid) 
      EndIf 
      
     EndIf
     
    EndSelect 
   
   ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wparam, lparam) 
   
 EndProcedure 
 
Procedure WinMainCallback(hWnd, msg, wParam, lParam)
 Static *gadgets.WINDOWGADGETS

  ;{ ****** TODO LIST (DETECT:)********
  ;[DONE] Menu events
  ;[DONE] Toolbar events
  ;[DONE] Button click
  ;[DONE] ImageGadget left button click (done with #BN_CLICKED, maybe #WM_LBUTTONDOWN is right way to do this?)
  ;[    ] ImageGadget left button release (#WM_LBUTTONUP ?)
  ;[DONE] ComboBoxGadget change
  ;[DONE] CheckBoxGadget change
  ;[DONE] ListIconGadget change
  ;[DONE] ListViewGadget change
  ;[DONE] SpinGadget change
  ;[DONE] TrackbarGadget change ; Code of MASTER NETMAESTRO
  ;[DONE] PanelGadget change
  ;} **********************************

  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
      If pGadget(#STATUSBAR)<>0 : FreeStatusBar(pGadget(#STATUSBAR)) : EndIf
      If pGadget(#TOOLBAR)<>0   : FreeToolBar(pGadget(#TOOLBAR))     : EndIf
      If pGadget(#MENU)<>0      : FreeMenu(pGadget(#MENU))           : EndIf
      ;}
      DestroyWindow_(hWnd)
    Case #WM_DESTROY
      PostQuitMessage_(0)
     
    Case #WM_NOTIFY
       *pNMHDR.NMHDR = lParam
            Select *pNMHDR\code
              Case #TCN_SELCHANGING
                  Debug "TAB Changed"
              Case #TCN_SELCHANGE
                  Debug "TAB Changed"
               
              Case #LVN_COLUMNCLICK
                  Debug "ListIcon Column Changed"
               
              Case #LVN_ITEMCHANGED
                Debug "ListIcon Item Changed"
               
              Case #UDN_DELTAPOS
                 Debug "SpinGadget change"
               
            EndSelect
     
     
    Case #WM_COMMAND
      Select wParam>>16 & $FFFF
         
        Case #BN_ENABLE
          Select lParam
              Case pGadgetID(#ComboBox_1)
                Debug "ComboBox Pressed"               

             EndSelect
           
        Case  #LBN_SETFOCUS
          Debug "ListView Pressed"         

         
        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))
            Case pGadgetID(#Button_3)
              Debug "clicked on button3"
            Case pGadgetID(#Button_4)
              Debug "clicked on button4"
            Case pGadgetID(#Image_1)
                 Debug "left mouse button Down on image1"     
            Case pGadgetID(#CheckBox_1)
              Run = Run ! 1
              If Run = 1
                Debug "CheckBox Checked"
              Else
                Debug "CheckBox UnChecked"
              EndIf 
          EndSelect
      EndSelect
     
          Select wParam & $FFFF
            Case 0
              Debug "New pressed"
            Case 1
              Debug "Load pressed"
            Case 2
              Debug "Save pressed"
            Case 4
              PostQuitMessage_(0)
          EndSelect
    Default
      ProcedureReturn DefWindowProc_(hWnd, msg, wParam, lParam)
  EndSelect

  ProcedureReturn 0
EndProcedure



Macro __FailedToInitWindow()
  SendMessage_(hWnd,#WM_CLOSE,0,0)
  ProcedureReturn 0
EndMacro

Procedure WinMain(hInstance=0)

  Protected wc.WNDCLASSEX
  Protected g_szClassName.s = "MAIN_WINDOW_CLASS"
  Protected k

  wc\cbSize        = SizeOf(WNDCLASSEX)
  ;wc\style        = 0
  wc\lpfnWndProc   = @WinMainCallback()
  ;wc\cbClsExtra   = 0
  ;wc\cbWndExtra   = 0
  wc\hInstance     = hInstance
  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 hWnd = CreateWindowEx_(0,g_szClassName.s,"The title of my window",#WS_OVERLAPPEDWINDOW,#CW_USEDEFAULT, #CW_USEDEFAULT, 440, 420,#Null, #Null, hInstance, #Null)

  If hWnd = #Null
    ProcedureReturn 0
  EndIf

  Protected gadgets.WINDOWGADGETS
  SendMessage_(hWnd,#WM_USER_SET_GADGETS_POINTER,@gadgets.WINDOWGADGETS,0)

  ;{ PureBasic gadget functions

  UseGadgetList(hWnd)

  Gadget(#Button_1)=ButtonGadget(#PB_Any,5, 40, 50, 23,"add")
  Gadget(#Button_2)=ButtonGadget(#PB_Any,60, 40, 50, 23,"clear")

  Gadget(#Panel_1)=PanelGadget(#PB_Any,135, 35, 210, 180)
  AddGadgetItem(Gadget(#panel_1), -1, "Panel 1")
    Gadget(#Panel_2)=PanelGadget (#PB_Any, 5, 5, 180, 130)
      AddGadgetItem(Gadget(#panel_2), -1, "Sub-Panel 1")
      AddGadgetItem(Gadget(#panel_2), -1, "Sub-Panel 2")
      AddGadgetItem(Gadget(#panel_2), -1, "Sub-Panel 3")
    CloseGadgetList()
  AddGadgetItem(Gadget(#panel_1), -1,"Panel 2")
    Gadget(#Button_3)=ButtonGadget(#PB_Any, 10, 15, 80, 24,"Button 3")
    Gadget(#Button_4)=ButtonGadget(#PB_Any, 95, 15, 80, 24,"Button 4")
  CloseGadgetList()

  Gadget(#Image_1)=ImageGadget(#PB_Any,5, 115, 64, 64, 0,#PB_Image_Border)

  Gadget(#ComboBox_1)=ComboBoxGadget(#PB_Any,5, 90, 110, 23)
  For k=1 To 5
    AddGadgetItem(Gadget(#Combobox_1), -1,"ComboBox item " + Str(k))
  Next
  SetGadgetState(Gadget(#Combobox_1),1)

  Gadget(#CheckBox_1)=CheckBoxGadget(#PB_Any,5, 65, 105, 20,"checkbox")

  Gadget(#ListIcon_1)=ListIconGadget(#PB_Any, 140, 225, 210, 90, "list", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
  AddGadgetColumn(Gadget(#ListIcon_1), 1, "Address", 250)
  
  For a = 1 To 3
    AddGadgetItem(Gadget(#ListIcon_1), -1, "Harry Rannit"+Chr(10)+"12 Parliament Way, Battle Street, By the Bay")
  Next

  Gadget(#ListView_1)=ListViewGadget(#PB_Any, 5, 225, 125, 90)

  Gadget(#TrackBar_1)=TrackBarGadget(#PB_Any, 5, 190, 100, 20, 0, 10, #PB_TrackBar_Ticks)
  SetGadgetState(Gadget(#TrackBar_1),5)

  Gadget(#Spin_1)=SpinGadget(#PB_Any, 75, 160, 55, 20, 0, 100,#PB_Spin_Numeric)
  SetGadgetState(Gadget(#Spin_1),10) 


  ;{ menu
  Gadget(#MENU)=CreateMenu(#PB_Any,hWnd)
  If Gadget(#MENU)<>0
    MenuTitle("File")
    Gadget(#Menu_item1)=1 : MenuItem(Gadget(#Menu_item1), "Open")
    Gadget(#Menu_item2)=4 : MenuItem(Gadget(#Menu_item2), "Close")
  Else
    __FailedToInitWindow()
  EndIf
  _GadgetID(#MENU)=MenuID(Gadget(#MENU))
  ;}

  ;{ statusbar
  Gadget(#STATUSBAR)=CreateStatusBar(#PB_Any,hWnd)
  If Gadget(#STATUSBAR)<>0
    AddStatusBarField(75)
    StatusBarText(Gadget(#STATUSBAR),0,Str(123))
  Else
    __FailedToInitWindow()
  EndIf
  _GadgetID(#STATUSBAR)=StatusBarID(Gadget(#STATUSBAR))
  ;}

  ;{ toolbar
  Gadget(#TOOLBAR)=CreateToolBar(#PB_Any,hWnd)
  If Gadget(#TOOLBAR)<>0
    Gadget(#Toolbar_button1)=0 : ToolBarStandardButton(Gadget(#Toolbar_button1), #PB_ToolBarIcon_New)
    Gadget(#Toolbar_button2)=1 : ToolBarStandardButton(Gadget(#Toolbar_button2), #PB_ToolBarIcon_Open)
    Gadget(#Toolbar_button3)=2 : ToolBarStandardButton(Gadget(#Toolbar_button3), #PB_ToolBarIcon_Save)
  Else
    __FailedToInitWindow()
  EndIf
  _GadgetID(#TOOLBAR)=ToolBarID(Gadget(#TOOLBAR))
  SetProp_(GadgetID(Gadget(#TrackBar_1)),"oldproc",SetWindowLong_(GadgetID(Gadget(#TrackBar_1)),#GWL_WNDPROC,@TBProc())) 
  ;}
  ;}

  ;{ 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
  ;}

  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()
Last edited by Kwai chang caine on Sun Nov 07, 2010 11:54 am, edited 1 time in total.
ImageThe happiness is a road...
Not a destination
cas
Enthusiast
Enthusiast
Posts: 597
Joined: Mon Nov 03, 2008 9:56 pm

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by cas »

Woow, RASHAD, Kwaï, hallodri - thanks for all your responses, i am really grateful to you. I will study this code and report back later if anything will be missing.
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by Kwai chang caine »

No problem CAS...the management of event justly interesting me a lot 8)
I need it for understanding and create my PBToC
http://www.purebasic.fr/english/viewtop ... 35#p338235

For a time i can help someone :oops:
And the real congratulation go to SROD and NETMAESTRO 8)
Me...i'm a lamer of their code :oops:
ImageThe happiness is a road...
Not a destination
cas
Enthusiast
Enthusiast
Posts: 597
Joined: Mon Nov 03, 2008 9:56 pm

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by cas »

Kwaï chang caïne wrote:Me...i'm a lamer of their code :oops:
That can't be true, you are really helpful to me. And thank you for that.
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by Kwai chang caine »

Thank you very much CAS 8)
I'm really happy to help a member of this forum, since all this time, that they helped me nearly all the day :D
It's not easy because, or i'm not enough quicker...because MASTERS have all in their heads, or more often i never have the answers :oops:

Hope you can finish your project....it's very interesting the event windows
I have not again all understood, but i works hard in C for understood at less the begining
Good luck :wink:
ImageThe happiness is a road...
Not a destination
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by RASHAD »

Silent update
Egypt my love
cas
Enthusiast
Enthusiast
Posts: 597
Joined: Mon Nov 03, 2008 9:56 pm

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by cas »

RASHAD wrote:Silent update
Thanks, i checked your code and edited first post, you are really helpful, now i have almost all events handled. Also, Hallodri posted really nice EventHandler code, i will study it more in detail when i get some free time.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: CreateWindowEx_() + PB Gadgets, window callback events!?

Post by RASHAD »

Hi cas

My post just updated
Egypt my love
Post Reply