J'ai trop codé aujourd'hui, plus les yeux en face des troues.
Désolé
ou- General
- Game
- Engine3D
A vous de jouer !- General
- Game&Medias
- Engine3D
Oui ça peut clairement dérouter le débutantDobro a écrit :Superbe boulot sur la Doc
ça parait peut etre trivial, mais ça va contribuer a la clarté de certains exemple
qui utilise une fenetre "0" et un Gadget "0"
As-tu essayé ça ?Denis a écrit :4) J'ai des soucis sur la compréhension (et l'utilisation) de l'alignement des structures sur le C (structures MS non connues de PB), quant faut-il l'utiliser ou non ?
C'est une vraie galère les structures MS non déclarées en PB (pour que cela fonctionne en 32-64 bits), s'il existe un outil que PB utilise, il serait bien que l'on puisse l'utiliser.
Ou alors nous expliquer clairement les règles pour que les structures MS non déclarées en PB fonctionnent en 32 / 64 bits en se basant sur les définitions des structures de MS.
Que faut-il faire pour qu'il y ait plus de structure MS définies en PB ?
Parce que la finalité c'est bien que PB connaisse un maximum de structures MS.
Code : Tout sélectionner
Structure MyTest Align #PB_Structure_AlignC
  a.b
  b.w
  c.l
  d.b
EndStructureCode : Tout sélectionner
;// les macros  MS en PB
Macro ListView_SetTileInfo(Hwnd, LVTILEINFO)
      SendMessage_(Hwnd, #LVM_SETTILEINFO, 0, LVTILEINFO)
EndMacro
Macro ListView_SetTileViewInfo(Hwnd, TILEVIEWINFO)
      SendMessage_(Hwnd, #LVM_SETTILEVIEWINFO, 0, TILEVIEWINFO)
EndMacro
;//  Structure LVTILEINFO site MS  (C++)
;//  http://msdn.microsoft.com/en-us/library/windows/desktop/bb774766%28v=vs.85%29.aspx
; typedef struct LVTILEINFO {
;   UINT  cbSize;
;   int   iItem;
;   UINT  cColumns;
;   PUINT puColumns;
; #if (_WIN32_WINNT >= 0x0600)
;   int   *piColFmt;
; #endif
; } LVTILEINFO, *PLVTILEINFO;
Structure LVTILEINFO Align #PB_Structure_AlignC
      cbSize.l
      iItem.l
      cColumns.l
      *puColumns
      *piColFmt
EndStructure
;//  Structure LVTILEVIEWINFO site MS  (C++)
;//  http://msdn.microsoft.com/en-us/library/windows/desktop/bb774768%28v=vs.85%29.aspx
; typedef struct LVTILEVIEWINFO {
;   UINT  cbSize;
;   DWORD dwMask;
;   DWORD dwFlags;
;   SIZE  sizeTile;
;   int   cLines;
;   RECT  rcLabelMargin;
;   } LVTILEVIEWINFO, *PLVTILEVIEWINFO
Structure LVTILEVIEWINFO ;Align #PB_Structure_AlignC
      cbSize.l
      dwMask.l
      dwFlags.l
      sizeTile.size
      cLines.l
      rcLabelMargin.rect
EndStructure
Define .i
Global GLB_event
;// mémorise les données pour afficher en mosaique le nombre de subitems voulus
Global GLB_tvi.LVTILEVIEWINFO
;//  morise les données pour indiquer à la listicon que l'on va utiliser les infos de subitems
Global GLB_ti.LVTILEINFO
;// variable mémorisant les différents champs du fichier courant
Global GLB_info.SHFILEINFO
Global  Path$ = "C:\"
;// l'ordre des colonnes de l'explorerlist
Enumeration 0
      #Colonne_Noms
      #Colonne_Attributs
      #Colonne_taille
      #Colonne_Type
      #Colonne_date
EndEnumeration
;// utilisé par les listicon pour le mode mosaique
#LVTVIF_AUTOSIZE = 0
#LVTVIM_COLUMNS = 2
#LVTVIM_LABELMARGIN = 4
#Listicon = 0
CoInitializeEx_(0, #COINIT_APARTMENTTHREADED|#COINIT_SPEED_OVER_MEMORY)
;// xp mini pour comctl32.dll version 6.00 mini
If OSVersion() < #PB_OS_Windows_XP
      MessageRequester("Erreur", "Windows XP minimum est nécessaire",  #PB_MessageRequester_Ok)
      CoUninitialize_()
      End
EndIf
;// les thèmes doivent être actifs
If OpenWindow(0, 0,0, 980, 670, "ListIconGadget", #PB_Window_MaximizeGadget| #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
      ListIconGadget(#Listicon, 0, 0, WindowWidth(0), WindowHeight(0)-30, "Noms", WindowWidth(0)/3)
      AddGadgetColumn(#Listicon, 1, "Attributs", GadgetWidth(#Listicon)/6*0.6)    ;// Attributs
      AddGadgetColumn(#Listicon, 2, "Taille", GadgetWidth(#Listicon)/6*0.9)       ;// Taille
      AddGadgetColumn(#Listicon, 3, "Type", GadgetWidth(#Listicon)/6)             ;// Type
      AddGadgetColumn(#Listicon, 4, "Date", 0)                                    ;// Date
      SendMessage_(GadgetID(#Listicon), #LVM_SETCOLUMNWIDTH, 4, #LVSCW_AUTOSIZE_USEHEADER)
      
      ;// active le mode d'affichage mosaïque (Tile) pour la listicon
      SendMessage_(GadgetID(#Listicon), #LVM_SETVIEW, #LV_VIEW_TILE, 0)
      
      ;// variables initialisées pour afficher les subitems en mode mosaique Explorerlist
      GLB_tvi\cbSize = SizeOf(LVTILEVIEWINFO)
      GLB_tvi\dwFlags = #LVTVIF_AUTOSIZE  ;// redimensionne automatiquement
      GLB_tvi\dwMask = #LVTVIM_COLUMNS ;| #LVTVIM_LABELMARGIN
      ;// nombre de ligne à  àjouter en fait que 3 mais ca permet d'augmenter la taille du rectangle
      GLB_tvi\cLines = 4
      
      GLB_ti\cbSize = SizeOf(LVTILEINFO)
      ;// Indique l'ordre des 3 colonnes à afficher, la 4eme à -1 pour que MS définisse de la place pour 4 colonne
      GLB_ti\cColumns = GLB_tvi\cLines
      GLB_ti\puColumns = ?OrdreColonneAfficher
      
      ListView_SETTILEVIEWINFO(GadgetID(#Listicon), @GLB_tvi)
      If ExamineDirectory(0, Path$, "*.*")
            While NextDirectoryEntry(0)
                  If DirectoryEntryType(0) = #PB_DirectoryEntry_File
                        FileNameOnly$ = DirectoryEntryName(0)
                        SHGetFileInfo = SHGetFileInfo_(Path$ + FileNameOnly$, 0, @info.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_LARGEICON|#SHGFI_TYPENAME|#SHGFI_ATTRIBUTES)
                        Attributs = DirectoryEntryAttributes(0)
                        
                        attributs$ = " "
                        
                        If  Attributs & (#PB_FileSystem_Archive|#PB_FileSystem_Compressed)
                              attributs$ = "A"
                        EndIf
                        
                        If  Attributs & #PB_FileSystem_Normal
                              attributs$ + "N"
                        EndIf
                        
                        If  Attributs & #PB_FileSystem_ReadOnly
                              attributs$ + "R"
                        EndIf
                        
                        If  Attributs & #PB_FileSystem_System
                              attributs$ + "S"
                        EndIf
                        
                        taille$ = Str((DirectoryEntrySize(0)>> 10)+ Bool(((DirectoryEntrySize(0)%1024)))) + " Ko"
                        
                        ;// FR
                        date$ = FormatDate("%dd/%mm/%yyyy  %hh:%ii:%ss", DirectoryEntryDate(0, #PB_Date_Modified))
                        
                        If SHGetFileInfo
                              GLB_ti\iItem = i
                              AddGadgetItem(#Listicon, -1, FileNameOnly$ + Chr(10) + attributs$ + Chr(10) + taille$ + Chr(10) + PeekS(@info\szTypeName[0]) + Chr(10) + date$+Times$, info\hIcon)
                              ListView_SetTileInfo(GadgetID(#Listicon), @GLB_ti)
                              DestroyIcon_(info\hIcon)
                        Else
                              type$ = "?"
                              GLB_ti\iItem = i
                              AddGadgetItem(#Listicon, -1, FileNameOnly$ + Chr(10) + attributs$ + Chr(10) + taille$ + Chr(10) + type$+ Chr(10) + date$+Times$)
                              ListView_SetTileInfo(GadgetID(#Listicon), @GLB_ti)
                        EndIf
                        i+1
                        
                  EndIf
            Wend
            FinishDirectory(0)
      EndIf
EndIf
Repeat
      GLB_event = WaitWindowEvent()
Until GLB_event = #PB_Event_CloseWindow
CoUninitialize_()
DataSection   ;// utilisé pour afficher l'ordre des colonne en mode mosaique
      OrdreColonneAfficher:
      Data.l #Colonne_Type, #Colonne_taille, #Colonne_date, -1
EndDataSection
End
Salut Nico,nico a écrit :J'obtiens le même résutat en compilant sous x64, quel résultat tu as?
Tu tournes sous quel OS?


Code : Tout sélectionner
;//  Code d'origine  SFSxOI
;//  www.purebasic.fr/english/viewtopic.php?f=12&t=30801
;//
;//  Modifié par Denis, en particulier les structures, mais pas que
;//
;//  A compiler en unicode
CompilerIf Not #PB_Compiler_Unicode
      MessageRequester("Erreur", "A compiler en mode unicode seulement", 16)
      End
CompilerEndIf
#IDOK = 1
#IDCANCEL = 2
#IDABORT = 3
#IDRETRY = 4
#IDIGNORE = 5
#IDYES = 6
#IDNO = 7
#IDCLOSE = 8
#TD_WARNING_ICON = -1
#TD_ERROR_ICON = -2
#TD_INFORMATION_ICON = -3
#TD_SHIELD_ICON = -4
#TD_ICON_BLANK = 100
#TD_ICON_WARNING = 101
#TD_ICON_QUESTION = 102
#TD_ICON_ERROR = 103
#TD_ICON_INFORMATION = 104
#TD_ICON_BLANK_AGAIN = 105
#TD_ICON_SHIELD = 106
;//   http://msdn.microsoft.com/en-us/library/windows/desktop/bb787475%28v=vs.85%29.aspx
Structure TASKDIALOG_BUTTON ;Align #PB_Structure_AlignC
      nButtonID.l
      *pszButtonText
EndStructure
;//   http://msdn.microsoft.com/en-us/library/windows/desktop/bb787473%28v=vs.85%29.aspx
Structure TASKDIALOGCONFIG ;Align #PB_Structure_AlignC
      cbSize.l
      hwndParent.i
      hInstance.i
      dwFlags.l
      dwCommonButtons.l
      *pszWindowTitle
      StructureUnion
            hMainIcon.i
            *pszMainIcon
      EndStructureUnion
      *pszMainInstruction
      *pszContent
      cButtons.l
      *pButtons.TASKDIALOG_BUTTON
      nDefaultButton.l
      cRadioButtons.l
      *pRadioButtons.TASKDIALOG_BUTTON
      nDefaultRadioButton.l
      *pszVerificationText
      *pszExpandedInformation
      *pszExpandedControlText
      *pszCollapsedControlText
      StructureUnion
            hFooterIcon.i
            *pszFooterIcon
      EndStructureUnion
      *pszFooter
      *pfCallback
      *lpCallbackData
      cxWidth.l
EndStructure
Prototype TaskDialogIndirect(*tdlgx.TASKDIALOGCONFIG, *ClickedButtonx, *SelRadiox, *fVerifyx)
Dim tbButtons.TASKDIALOG_BUTTON(2)
sBtn1 = @"Heck Yeah!"
sBtn2 = @"Nope!"
sBtn3 = @"Repeat The Question?"
tbButtons(0)\nButtonID = #IDYES
tbButtons(0)\pszButtonText = sBtn1
tbButtons(1)\nButtonID = #IDNO
tbButtons(1)\pszButtonText = sBtn2
tbButtons(2)\nButtonID = #IDCANCEL
tbButtons(2)\pszButtonText = sBtn3
#ID_RADIO_BUTTON_PURE = 1002
#ID_RADIO_BUTTON_BASIC = 1003
#ID_RADIO_BUTTON_IS_NEAT = 1004
Dim ID_RADIOButtons.TASKDIALOG_BUTTON(2)
IDsBtn1 = @"Pure"
IDsBtn2 = @"Basic"
IDsBtn3 = @"IS NEAT! radio button"
ID_RADIOButtons(0)\nButtonID = #ID_RADIO_BUTTON_PURE
ID_RADIOButtons(0)\pszButtonText = IDsBtn1
ID_RADIOButtons(1)\nButtonID = #ID_RADIO_BUTTON_BASIC
ID_RADIOButtons(1)\pszButtonText = IDsBtn2
ID_RADIOButtons(2)\nButtonID = #ID_RADIO_BUTTON_IS_NEAT
ID_RADIOButtons(2)\pszButtonText = IDsBtn3
sWindowTitle = @"A Larger Task Dialog"
sMainInstruction = @"Do you want to view the larger TaskDialog?"
sContent = @"Here it is now with custom buttons."
sVerify = @"Don't show this message again"
sExpanded = @"An example provided by SFSxOI for PureBasic Tips and Tricks."
sCollapsedControlText = @"Where the heck did this come from?"
sExpandedControlText = @"Ah, got it!"
tdlg.TASKDIALOGCONFIG
tdlg\cbSize = SizeOf(TASKDIALOGCONFIG)
tdlg\hwndParent = #Null
tdlg\hInstance = #Null
tdlg\dwFlags = #Null
tdlg\dwCommonButtons = #Null
tdlg\pszWindowTitle = sWindowTitle
tdlg\hMainIcon = #TD_ICON_SHIELD
tdlg\pszMainInstruction = sMainInstruction
tdlg\pszContent = sContent
tdlg\cButtons = 3
tdlg\pButtons = @tbButtons(0)\nButtonID
tdlg\cRadioButtons = 3
tdlg\pRadioButtons = @ID_RADIOButtons(0)\nButtonID
tdlg\nDefaultButton = #IDNO
tdlg\pszVerificationText = sVerify
tdlg\pszExpandedInformation = sExpanded
tdlg\pszExpandedControlText = sExpandedControlText
tdlg\pszCollapsedControlText = sCollapsedControlText
tdlg\hFooterIcon = #Null
tdlg\pszFooter = #Null
tdlg\pfCallback = #Null
Procedure Task_DialogIndirect(*tdlgx)
      Global fVerifyx, SelRadiox
      If OpenLibrary(0, "comctl32.dll")
            Libef = LibraryID(0)
            If Libef
                  *Task_Dialog_Func.TaskDialogIndirect = GetFunction(0, "TaskDialogIndirect")
                  If *Task_Dialog_Func
                        *Task_Dialog_Func(*tdlgx, @ClickedButtonx, @SelRadiox, @fVerifyx)
                  EndIf
            EndIf
            CloseLibrary(0)
      EndIf
      ProcedureReturn  ClickedButtonx
EndProcedure
ClickedButton = Task_DialogIndirect(@tdlg)
If fVerifyx = #True
      Debug "You checked the 'Do not prompt me again' box"
      ;set some registry To indicate so, so Next time the prompt is Not shown
Else
      ;clear the registry, so Next time the prompt is shown
EndIf
If SelRadiox = #ID_RADIO_BUTTON_PURE
      SelRadio$ = "PURE radio button"
Else
      If SelRadiox = #ID_RADIO_BUTTON_BASIC
            SelRadio$ = "BASIC radio button"
      Else
            If SelRadiox = #ID_RADIO_BUTTON_IS_NEAT
                  SelRadio$ = "IS NEAT! radio button"
            EndIf
      EndIf
EndIf
Select ClickedButton
            
      Case #IDOK
            Debug "You clicked the OK button"
            Debug "and you also clicked the " +SelRadio$
      Case #IDCANCEL
            Debug "You clicked the Repeat Question? button"
            Debug "and you also clicked the " +SelRadio$
      Case #IDABORT
            Debug "You clicked the Abort button"
            Debug "and you also clicked the " +SelRadio$
      Case #IDRETRY
            Debug "You clicked the Retry button" +Str(ClickedButton)
            Debug "and you also clicked the " +SelRadio$
      Case #IDIGNORE
            Debug "You clicked the Ignore button" +Str(ClickedButton)
            Debug "and you also clicked the " +SelRadio$
      Case #IDYES
            Debug "You clicked the Heck Yeah! button" +Str(ClickedButton)
            Debug "and you also clicked the " +SelRadio$
      Case #IDNO
            Debug "You clicked the Nope! button" +Str(ClickedButton)
            Debug "and you also clicked the " +SelRadio$
            
EndSelect