PureBasic

Руководство - Создание графического интерфейса пользователя (GUI)

В дополнение к консоли PureBasic также поддерживает создание графических интерфейсов пользователя (GUI). Поэтому давайте возьмём предыдущий пример с выводом свойств файлов на консоль и превратим его в приложение с графическим интерфейсом (GUI).

Обратите внимание на то, что PureBasic предоставляет гораздо более простой способ получить данные о файлах через ExplorerListGadget(), но поскольку этот пример предназначен для введения управляющих элементов графического интерфейса, использование этого Гаджета не сильно помогло бы.

; Структура для получения информации о файле.
Structure FILEITEM
    Name.s
    Attributes.i
    Size.q
    DateCreated.i
    DateAccessed.i
    DateModified.i
EndStructure

; Это - константа для идентификации окна.
Enumeration
    #WindowFiles
EndEnumeration

; Это - перечисление, для идентификации средств управления, которые появятся в окне.
Enumeration
    #Folder
    #Files
EndEnumeration

; Теперь мы определяем список файлов, используя ранее определенную структуру.
NewList Files.FILEITEM()

; И некоторые переменные, которые нам понадобятся.
Define.s Access, Attrib, Create, Folder, Modify, Msg, Num, Size
Define.l Result, Flags

; Эти переменные будут получать информацию о произошедших событиях графического интерфейса.
Define.l Event, EventWindow, EventGadget, EventType, EventMenu

; Эта функция получает корневой каталог вошедшего в систему пользователя.
Folder = GetHomeDirectory()

; Открывает каталог, чтобы перечислить все его содержимое.
Result = ExamineDirectory(0, Folder, "*.*")

; Если Result - истина (т.е. каталог открыть удалось), начинаем перечисление записей.
If Result
    ; Цикл пока NextDirectoryEntry(0) не станет нулем - что означает, что больше нет записей.
    While NextDirectoryEntry(0)
        ; Если запись каталога - файл, а не папка.
        If DirectoryEntryType(0) = #PB_DirectoryEntry_File

            ; Добавить новый элемент к списку.
            AddElement(Files())
            ; И заполнить его свойствами файла.
            Files()\Name = DirectoryEntryName(0)
            Files()\Size = DirectoryEntrySize(0)
            Files()\Attributes = DirectoryEntryAttributes(0)
            Files()\DateCreated = DirectoryEntryDate(0, #PB_Date_Created)
            Files()\DateAccessed = DirectoryEntryDate(0, #PB_Date_Accessed)
            Files()\DateModified = DirectoryEntryDate(0, #PB_Date_Modified)
        EndIf
    Wend
    ; Закрыть каталог.
    FinishDirectory(0)
EndIf

; Сортируем список, путём упорядочения имён файлов в возрастающем алфавитном порядке (A, B, C, D...).
SortStructuredList(Files(), #PB_Sort_Ascending, OffsetOf(FILEITEM\Name), #PB_String)

; Интересный материал начинается здесь...

; Эта строка определяет флаг для атрибутов окна, посредством объединения вместе через ИЛИ  желаемых констант атрибута.
Flags = #PB_Window_SystemMenu - #PB_Window_SizeGadget - #PB_Window_MinimizeGadget - #PB_Window_MaximizeGadget - #PB_Window_TitleBar

; Открыть окно GUI.
OpenWindow(#WindowFiles, 50, 50, 450, 400, "File Properties", Flags)
; Текстовый Гаджет для отображения имени папки
TextGadget(#Folder, 5, 40, 440, 25, Folder)
; Гаджет значка списка, для хранения списка файлов и свойств.
ListIconGadget(#Files, 5, 70, 440, 326, "#", 35)
; Добавить столбцы в ListIconGadget, для хранения каждого свойства..
AddGadgetColumn(#Files, 1, "Name", 200)
AddGadgetColumn(#Files, 2, "Created", 100)
AddGadgetColumn(#Files, 3, "Accessed", 100)
AddGadgetColumn(#Files, 4, "Modified", 100)
AddGadgetColumn(#Files, 5, "Attributes", 150)
AddGadgetColumn(#Files, 6, "Size", 100)

; Загрузить файлы в виде списка.
ForEach Files()
    ; Выведите на экран Номер пункта и Имя файла.
    Num = StrU(ListIndex(Files()) + 1)

    ; Эти строки преобразовывают значения дат создания и т.д. файла в привычный вид.
    Create = FormatDate("%dd/%mm/%yyyy", Files()\DateCreated)
    Access = FormatDate("%dd/%mm/%yyyy", Files()\DateAccessed)
    Modify = FormatDate("%dd/%mm/%yyyy", Files()\DateModified)

    ; Преобразуем размер файла в строку с дополнением пробелов, так же как с индексным значением выше,
    ; но зададим размер строки для размещения максимального размера значения типа quad.
    Size = StrU(Files()\Size)

    ; Преобразуем атрибуты в строку.
    Attrib = StrU(Files()\Attributes)

    ; Создайте строку для вывода.
    ; Символ перевода строки "Chr(10)" указывает Гаджету перейти к следующему столбцу
    Msg = Num + Chr(10) + Files()\Name + Chr(10) + Create + Chr(10) + Access + Chr(10) + Modify + Chr(10) + Attrib + Chr(10) + Size

    ; Добавьте строку к Гаджету представления списка.
    AddGadgetItem(#Files, -1, Msg)
Next Files()

; Это - цикл событий для окна.
; Он будет иметь дело со всеми событиями взаимодействия с пользователем, которые мы хотим использовать.

Repeat
    ; Ожидание, пока не произойдёт новое событие окна или Гаджета.
    Event = WaitWindowEvent()
    ; Используется в программах с более чем одной формой, выдаёт, в каком окне произошло событие.
    EventWindow = EventWindow()
    ; Какой Гаджет произвёл событие.
    EventGadget = EventGadget()
    ; Какое событие имело место.
    EventType = EventType()

    ; Принятие мер, в зависимости от события.
    Select Event

        Case #PB_Event_Gadget
            ; Имело место событие Гаджета.
            If EventGadget = #Folder
            ElseIf EventGadget = #Files
            EndIf

        Case #PB_Event_CloseWindow
            ; Закрыть окно.
            If EventWindow = #WindowFiles
                CloseWindow(#WindowFiles)
                Break
            EndIf

    EndSelect

    ; Возврат к началу цикла и повторение до бесконечности.
    ; На практике цикл не бесконечен, потому что его можно остановить, щелкнув кнопку Close окна.
ForEver

На этом этапе приложение уже имеет некоторые полезные функции. Однако есть также и некоторые проблемы:
1) Вы не можете выбрать папку для просмотра.
2) Вы не можете обновить содержание списка, не перезапуская программу.
3) Если Вы изменяете размеры окна, Гаджеты не адаптируются под новый размер.
4) Столбец атрибутов все еще не очень полезен.
Мы пересмотрим эту программу позже, чтобы устранить все эти проблемы.

Навигация Руководства

< Отображение в текстовом режиме (Консоль) - Обзор - Отображение графики & простых рисунков >