Page 1 sur 1

DisableGadgetItem() ?

Publié : ven. 08/mai/2009 21:43
par Octavius
DisableGadgetItem(), cette fonction n'existe malheureusement pas. J'aimerai pouvoir désactiver un élément dans un gadget mais pas le gadget en entier, par exemple désactiver/griser seulement un des onglets d'un panel. Un peu comme DisableMenuItem() permet de désactiver un élément du menu sans désactiver tout le menu.

Y a-t-il un moyen de faire ceci d'une manière ou d'une autre ? Peut-être par une fonction API ? Mes recherches ne donnent rien pour l'instant.

Publié : sam. 09/mai/2009 17:20
par SpaceMan
Salut Octavius !
voici un code qui fonctionne:

Code : Tout sélectionner

Global Dim Panels.l(0) 

Procedure winproc(hwnd,msg,wParam,lParam) 
  Protected result, tch.TC_HITTESTINFO, *pNMHDR.NMHDR, newtab 
  result=#PB_ProcessPureBasicEvents 
  Select msg 
    Case #WM_DRAWITEM 
      textbuffer.s=Space(255) 
      *lpdis.DRAWITEMSTRUCT=lParam 
      tab.TC_ITEM 
      Select *lpdis\CtlType 
        Case #ODT_TAB 
          Select *lpdis\itemState 
            Case #ODS_SELECTED 
              tab\Mask=#TCIF_TEXT 
              tab\pszText=@textbuffer 
              tab\cchTextMax=255 
              SendMessage_(*lpdis\hwndItem,#TCM_GETITEM   ,*lpdis\itemID,@tab) 
              textcolor.l= #Black 
            Case #ODS_SELECTED | #ODS_FOCUS 
              drawfoc.l=#True        
            Case 0 
              tab\Mask=#TCIF_PARAM 
              SendMessage_(*lpdis\hwndItem,#TCM_GETITEM   ,*lpdis\itemID,@tab) 
              If Panels(*lpdis\itemID) 
                 tab\Mask=#TCIF_TEXT 
                 tab\pszText=@textbuffer 
                 tab\cchTextMax=255 
                 SendMessage_(*lpdis\hwndItem,#TCM_GETITEM,*lpdis\itemID,@tab) 
                 *lpdis\rcItem\left+5 
                 *lpdis\rcItem\top+3 
                 textcolor.l= #White 
                 SetTextColor_(*lpdis\hdc, textcolor)                  
                 DrawText_(*lpdis\hdc, textbuffer, Len(textbuffer), *lpdis\rcItem, dtFlags) 
                 textcolor.l= 5526100  ;RGB(84,82,84) 
                 *lpdis\rcItem\top -3 
                 *lpdis\rcItem\left-5 
              Else 
              tab\Mask=#TCIF_TEXT 
              tab\pszText=@textbuffer 
              tab\cchTextMax=255 
              SendMessage_(*lpdis\hwndItem,#TCM_GETITEM,*lpdis\itemID,@tab) 
              textcolor.l= #Black 
            EndIf 
          EndSelect 
          If drawfoc=#True 
            DrawFocusRect_(*lpdis\hdc, *lpdis\rcItem) 
          EndIf 
          SetBkMode_(*lpdis\hdc, #TRANSPARENT) 
          *lpdis\rcItem\left+4 
          *lpdis\rcItem\top+2 
          SetTextColor_(*lpdis\hdc, textcolor) 
          DrawText_(*lpdis\hdc, textbuffer, Len(textbuffer), *lpdis\rcItem, dtFlags) 
          ProcedureReturn 0 
      EndSelect 
        
    Case #WM_NOTIFY 
      *pNMHDR= lParam 
      Select *pNMHDR\code 
        Case #TCN_SELCHANGING 
            itm.TC_ITEM 
            itm\Mask=#TCIF_PARAM  
            If GetAsyncKeyState_(#VK_LBUTTON) & 32768 
               GetCursorPos_(tch\pt) 
               MapWindowPoints_(#Null,*pNMHDR\hwndFrom,tch\pt,1)            
               If Panels(SendMessage_(*pNMHDR\hwndFrom, #TCM_HITTEST,0, tch) ) 
                  result=1                  
               EndIf 
            ElseIf GetAsyncKeyState_(#VK_LEFT)& 32768 ; 
               panel = SendMessage_(*pNMHDR\hwndFrom,#TCM_GETCURSEL,0,0) - 1        
               If panel > 0 And Panels(panel) 
                  result=1              
               EndIf  
            ElseIf GetAsyncKeyState_(#VK_RIGHT)& 32768 ;Selection by right cursor. 
               panel = SendMessage_(*pNMHDR\hwndFrom,#TCM_GETCURSEL,0,0) + 1 
               ct = PeekL(@Panels()-8) -1 
               If panel < ct And Panels(panel) 
                  result=1            
               EndIf            
            EndIf 
      EndSelect 
  EndSelect 
  ProcedureReturn result 
EndProcedure 
  


If OpenWindow(0, 100, 200, 390, 350, "", #PB_Window_MinimizeGadget) 
  If CreateGadgetList(WindowID(0)) 
     For i=1 To 4 
        ButtonGadget(5+i,5+i*48,5,48,25,"D/E"+Str(i+1)) 
     Next i 
     PanelGadget(30,5,45,380,300) 
     SetWindowLong_(GadgetID(30),#GWL_STYLE,GetWindowLong_(GadgetID(30),#GWL_STYLE)   |#TCS_OWNERDRAWFIXED)    
     For a=1 To 5 
         ReDim Panels.l(a) 
         Panels.l(a)=#False          ; Enable the new Panel 
         AddGadgetItem(30,a,"Panel " + Str(a)) 
         StringGadget(a,a*15,a*10,100,20,"Panel " + Str(a)) 
     Next  
     CloseGadgetList() 
  EndIf 
  SetWindowCallback(@winproc()) 
  Repeat 
    EventID = WaitWindowEvent() 
    If EventID = #PB_Event_Gadget 
       eg=EventGadget() 
       Select eg 
          Case 6,7,8,9 
            Panels(eg-5)=1-Panels(eg-5) 
            RedrawWindow_(GadgetID(30),0,0,7) 
            ShowWindow_(GadgetID(30),#SW_SHOW)        
       EndSelect  
    EndIf 
  Until EventID = #PB_Event_CloseWindow 
EndIf 
End 

Publié : dim. 10/mai/2009 18:37
par Octavius
Merci bien SpaceMan !