Clic sur le nom d'une col ListIconGadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Clic sur le nom d'une col ListIconGadget

Message par omega »

Bonjour,

Y a t-il un moyen en Pb de savoir que l'utilisateur a cliqué sur le nom d'une colonne ListIconGadget (Je dis bien une COLONNE et non pas une ligne).
Merci
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Clic sur le nom d'une col ListIconGadget

Message par cage »

Bonjour omega,
Je répond vite fait, oui c'est possible.
Je te fais une copie de ce que j'utilise pour trier Ascendant/Descendant une ListIcon en cliquant sur le titre d'une colonne.

Code : Tout sélectionner

Procedure initSysTray()
  If FindWindow_("Progman", #NUL) <> 0
    AddSysTrayIcon(#WinApp, WindowID(#WinApp), IconApp1)
    SysTrayIconToolTip(#WinApp, #MyApp$)
  EndIf
EndProcedure

Global *msg.NMHDR
Global *pnmv.NM_LISTVIEW

Procedure windowCallback(win, msg, wParam, lParam)
  Protected Result = #PB_ProcessPureBasicEvents
  Select Msg
    Case #WM_NOTIFY
      *msg.NMHDR = lParam
      If IsGadget(#GadgetList)
      If *msg\hwndFrom = GadgetID(#GadgetList) And *msg\code = #LVN_COLUMNCLICK
        *pnmv.NM_LISTVIEW = lParam
        If lastcol<>*pnmv\iSubItem And updown=0
          updown = 1
        ElseIf lastcol<>*pnmv\iSubItem And updown=1
          updown = 0
        EndIf
        lastcol = *pnmv\iSubItem ; numéro de col 0->3
        Debug "lastcol="+Str(lastcol)
        sort(#GadgetList,lastcol)
      EndIf
      EndIf
    Case TB_Message ; explorer crash
      initSysTray()
  EndSelect
  ProcedureReturn Result
EndProcedure

SetWindowCallback(@windowCallback(),#WinApp)
Il faut remplacer sort(#GadgetList,lastcol) par ta propre procédure.
Il faut remplacer la constante #GadgetList par l'identifiant de ta ListIcon
SetWindowCallback(@windowCallback(),#WinApp) est a mettre après If OpenWindow(#WinApp,...

cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Clic sur le nom d'une col ListIconGadget

Message par Mesa »

En stock, et devrait être multiplateforme.

Code : Tout sélectionner

EnableExplicit

Structure CallbackEntry
  WindowID.I
  ListIconID.I
  DefaultCallback.I
EndStructure

NewList CallbackEntry.CallbackEntry()

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Linux ; ------------------------------------------------
    ProcedureC ColumnHeaderClickCallback(*Column, ListIconData.I)
      Shared CallbackEntry()

      ForEach CallbackEntry()
        If ListIconData >> 16 = CallbackEntry()\ListIconID
          Break
        EndIf
      Next

      PostEvent(#PB_Event_Gadget, CallbackEntry()\WindowID,
        CallbackEntry()\ListIconID, #PB_EventType_LeftClick,
        (ListIconData & $FFFF) + 1)
    EndProcedure

    Procedure SetGadgetCallback(WindowID.I, ListIconID.I)
      Shared CallbackEntry()

      Protected Column.I
      Protected ColumnCount.I
      Protected ColumnIndex.I
      Protected *ListStore.GtkListStore

      AddElement(CallbackEntry())
      CallbackEntry()\WindowID = WindowID
      CallbackEntry()\ListIconID = ListIconID
      gtk_tree_view_set_headers_clickable_(GadgetID(ListIconID), #True)
      *ListStore = gtk_tree_view_get_model_(GadgetID(ListIconID))
      ColumnCount = (*ListStore\n_columns - 3) / 3

      For ColumnIndex = 0 To ColumnCount - 1
        Column = gtk_tree_view_get_column_(GadgetID(CallbackEntry()\ListIconID),
          ColumnIndex)

        If Column
          g_signal_connect_data_(Column, "clicked",
            @ColumnHeaderClickCallback(), ListIconID << 16 | ColumnIndex, 0, 0)
        EndIf
      Next ColumnIndex
    EndProcedure
  CompilerCase #PB_OS_MacOS ; ------------------------------------------------
    ImportC ""
      sel_registerName(MethodName.S)
      class_addMethod(Class.I, Selector.I, Implementation.I, Types.S)
    EndImport

    Procedure.S ConvertToUTF8(String.S)
      Protected UTF8String.S = Space(StringByteLength(String))
      PokeS(@UTF8String, String, -1, #PB_UTF8)
      ProcedureReturn UTF8String
    EndProcedure
   
    ProcedureC ColumnHeaderClickCallback(Object.I, Selector.I, TableView.I,
      TableColumn.I)
      Shared CallbackEntry()

      Protected ClickedHeaderColumn.I
 
      ForEach CallbackEntry()
        If TableView = GadgetID(CallbackEntry()\ListIconID)
          Break
        EndIf
      Next
    
      ClickedHeaderColumn = Val(PeekS(CocoaMessage(0,
        CocoaMessage(0, TableColumn, "identifier"),
        "UTF8String"), -1, #PB_UTF8))
      PostEvent(#PB_Event_Gadget, CallbackEntry()\WindowID,
        CallbackEntry()\ListIconID, #PB_EventType_LeftClick,
        ClickedHeaderColumn + 1)
    EndProcedure
   
    Procedure SetGadgetCallback(WindowID.I, ListIconID.I)
      Shared CallbackEntry()
     
      Protected AppDelegate.I
      Protected DelegateClass.I
      Protected Selector.I = sel_registerName(ConvertToUTF8("tableView:didClickTableColumn:"))
      Protected Types.S = ConvertToUTF8("v@:@@")

      AddElement(CallbackEntry())
      CallbackEntry()\WindowID = WindowID
      CallbackEntry()\ListIconID = ListIconID
      AppDelegate = CocoaMessage(0,
        CocoaMessage(0, 0, "NSApplication sharedApplication"), "delegate")
      DelegateClass = CocoaMessage(0, AppDelegate, "class")
      class_addMethod(DelegateClass, Selector, @ColumnHeaderClickCallback(),
        Types)
      CocoaMessage(0, GadgetID(CallbackEntry()\ListIconID),
        "setDelegate:", AppDelegate)
    EndProcedure
  CompilerCase #PB_OS_Windows ; ----------------------------------------------
    Procedure ColumnHeaderClickCallback(WindowHandle.I, Msg.I, WParam.I,
      LParam.I)
      Shared CallbackEntry()

      Protected Result.I
      Protected *Header.HD_NOTIFY

      ForEach CallbackEntry()
        If WindowHandle = GadgetID(CallbackEntry()\ListIconID)
          Break
        EndIf
      Next

      Result = CallWindowProc_(CallbackEntry()\DefaultCallback, WindowHandle,
        Msg, WParam, LParam)

      If Msg = #WM_NOTIFY
        *Header = LParam

        If *Header\hdr\code = #HDN_ITEMCLICK
          PostEvent(#PB_Event_Gadget, CallbackEntry()\WindowID,
            CallbackEntry()\ListIconID, #PB_EventType_LeftClick,
            *Header\iItem + 1)
        EndIf
      EndIf

      ProcedureReturn Result
    EndProcedure

    Procedure SetGadgetCallback(WindowID.I, ListIconID.I)
      Shared CallbackEntry()

      AddElement(CallbackEntry())
      CallbackEntry()\WindowID = WindowID
      CallbackEntry()\ListIconID = ListIconID
      CallbackEntry()\DefaultCallback = SetWindowLongPtr_(GadgetID(CallbackEntry()\ListIconID),
        #GWL_WNDPROC, @ColumnHeaderClickCallback())
    EndProcedure ; -----------------------------------------------------------
CompilerEndSelect

OpenWindow(0, 200, 100, 450, 150, "Detect left click on header cell")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20, "Name",
  110, #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "Address", 300)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ +
  "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit"+ #LF$ +
  "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit"+ #LF$ +
  "321 Logo Drive, Mouse House, Downtown")

SetGadgetCallback(0, 0)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0 And EventType() = #PB_EventType_LeftClick
        If EventData()
          Debug "Left click on header of column " + Str(EventData() - 1)
        Else
          Debug "Left click on row " + Str(GetGadgetState(0))
        EndIf
      EndIf
  EndSelect
ForEver
M.
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Clic sur le nom d'une col ListIconGadget

Message par Marc56 »

Une version courte (dérivée d'un code du stock rsbasic)
Utilisation d'une API, donc PB enregistré.

Code : Tout sélectionner

; Basé sur https://www.rsbasic.de/winapi-library/
; https://www.rsbasic.de/aktualisierung/winapi_library_2011/Codes/ListIconGadget/Header%20auf%20Mausklick%20abfragen.pb

EnableExplicit

Global MyOldList

Procedure ListCB(hWnd, Message, wParam, lParam)
    Protected *Header.HD_NOTIFY
    Protected Result=CallWindowProc_(MyOldList, hWnd, Message, wParam, lParam)
    
    If Message = #WM_NOTIFY
        *Header = lParam
        If *Header\hdr\code = #HDN_ITEMCLICK
            Debug GetGadgetItemText(1, -1, *Header\iItem)
        EndIf
    EndIf
    
    ProcedureReturn Result
EndProcedure

OpenWindow(0, 0, 0, 500, 250, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(1, 10, 10, 480, 230, "AAA", 100, 0)
AddGadgetColumn(1, 1, "BBB", 100)
AddGadgetColumn(1, 2, "CCC", 100)

MyOldList = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @ListCB())
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Si tu veux juste le numéro de colonne: *Header\iItem

:wink:
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Clic sur le nom d'une col ListIconGadget

Message par omega »

Merci à tous!

ça marche mais je ne sais plus quoi choisir comme code il me semble que le dernier code me va parfaitement car il est court et plus simple. Merci encore à vous tous et bonne continuation
*
Win7 (x64) 64 bits Pb 5.72
Répondre