Вывод фотографий на панель. Динамическое создание объектов в Gambas.

   

Продолжая тему работы с Изображениями в это статье я приведу пример, как можно вывести несколько изображений на панель по подобию работы таких программ, как ShotWell и DigiKam.

Для работы разместим на форме два элемента: ScrollView и ButtonBox. В ScrollView мы будем выводить изображения, а по кнопке ButtonBox откроем папку с фотографиями.
Для ScrollView1 нужно задать свойство Arrangement = Row — это чтобы наши изображения при выводе располагались рядами.

Вот что у нас получится в итоге:

Привожу полный код программы с комментариями:


Public Sub ButtonBoxOpenFile_Click()
Dim hImage As Image
Dim hArea As DrawingArea
Dim SizeArea As Integer = 100
Dim mFiles As String

Dim sFile As String

Dialog.Path = "/home" 'Задаем директорию в которой будет открыт диалог выбора
If Dialog.SelectDirectory() Then Return 'Инициируем диалог выбора директории
ButtonBoxOpenFile.Text = Dialog.Path

mFiles = Dir(Dialog.Path, "*.jpg", 1) 'Оператор Dir возвращает массив файлов из директории по заданому шаблону

For Each sFile In mFiles 'начинаем цикл по массиву файлов - наших изображений
hImage = Image.Load(Dialog.Path & "/" & sFile) 'Загружаем изображение в объект hImage
hImage = hImage.Stretch(SizeArea, SizeArea) 'Уменьшаем изображение до размера эскиза 100*100, чтобы вошло несколько изображений на панель

hArea = New DrawingArea(ScrollView1) 'Динамически создаем новый объект hArea
Object.Attach(hArea, FMain, "MyhArea") 'Ассоциируем имя "MyhArea" с новым объектом
hArea.Cached = True 'Задаем свойство кеширования
hArea.Border = 3 'Устанавливаем тип границы
hArea.Width = SizeArea 'Задаем размер облости вывода изображения
hArea.Height = SizeArea

Draw.Begin(hArea) 'Выводим изображение
Draw.Image(hImage, 0, 0)
Draw.End
Next
End

Тут стоит обратить внимание на следующие важные моменты.
hArea = New DrawingArea(ScrollView1) 'Динамически создаем новый объект hArea

Здесь мы с помощью оператора «New» создаём в цикле новый объект «DrawingArea». Програмно создавать и инициировать можно не только переменные и массивы, но и видимые элементы формы (хоть 100 кнопок вывести на форму в цикле можно). При желании можно вобще всю форму прописать программно, как это делается в языках в которых отсутствует графические средства разработки интерфейса IDE, например python, C++.
Object.Attach(hArea, FMain, "MyhArea") 'Ассоциируем имя "MyhArea" с новым объектом

Для данного примера это строка не важна, оно будет необходима, если мы заходим обращаться к какому-либо событию динамически созданного объекта.
Об этом я расскажу в следующей статье.

Draw.Begin(hArea) 'Выводим изображение
Draw.Image(hImage, 0, 0)
Draw.End

А этот момент описан в статье
Метод «Draw.Image» обеспечивает вывод изображения в контейнер hArea. Как бы рисует его.

Единственный недостаток этого примера и предыдущего, это то, что изменение размера изображения происходит непропорционально, а для фотографии это неприемлемо.
Но применив немного математических расчётов это легко можно исправить. Все что нужно это определить на сколько нужно изменить ширину изображения если длинна его будет задана. Ну и в дополнение я определю сдвиг изображения на центр hArea. Это парамерты dH и dW.

If hImage.Height > hImage.Width Then
K = SizeArea / hImage.Height
Width = Int(hImage.Width * K)
Height = Int(SizeArea)
dW = Int((SizeArea - Width) / 2)
dH = 0
Else
K = SizeArea / hImage.Width
Height = Int(hImage.Height * K)
Width = Int(SizeArea)
dH = Int((SizeArea - Height) / 2)
dW = 0
Endif

Вот таким кодом мы просто рассчитаем ширину и высоту изображения и сдвиг его относительно вертикали и горизонтали.

Весь код последнего варианта выглядит так:

Public Sub ButtonBoxOpenFile_Click()
Dim hImage As Image
Dim hArea As DrawingArea
Dim SizeArea As Integer = 100
Dim mFiles As String

Dim sFile As String

Dim K As Float
Dim Height, Width, dH, dW As Integer

Dialog.Path = "/home" 'Задаем директорию в которой будет открыт диалог выбора
If Dialog.SelectDirectory() Then Return 'Инициируем диалог выбора директории
ButtonBoxOpenFile.Text = Dialog.Path

mFiles = Dir(Dialog.Path, "*.jpg", 1) 'Оператор Dir возвращает массив файлов из директории по заданому шаблону

For Each sFile In mFiles 'начинаем цикл по массиву файлов - наших изображений
hImage = Image.Load(Dialog.Path & "/" & sFile) 'Загружаем изображение в объект hImage

If hImage.Height > hImage.Width Then
K = SizeArea / hImage.Height
Width = Int(hImage.Width * K)
Height = Int(SizeArea)
dW = Int((SizeArea - Width) / 2)
dH = 0
Else
K = SizeArea / hImage.Width
Height = Int(hImage.Height * K)
Width = Int(SizeArea)
dH = Int((SizeArea - Height) / 2)
dW = 0
Endif

hImage = hImage.Stretch(Width, Height) 'Уменьшаем изображение до размера эскиза 100*100, чтобы вошло несколько изображений на панель

hArea = New DrawingArea(ScrollView1) 'Динамически создаем новый объект hArea
Object.Attach(hArea, FMain, "MyhArea") 'Ассоциируем имя "MyhArea" с новым объектом
hArea.Cached = True 'Задаем свойство кеширования
hArea.Border = 3 'Устанавливаем тип границы
hArea.Width = SizeArea 'Задаем размер облости вывода изображения
hArea.Height = SizeArea

Draw.Begin(hArea) 'Выводим изображение
Draw.FillRect(0, 0, SizeArea, SizeArea, Color.Gray) 'Здесь мы просто заполним всю область серым цветом
Draw.Image(hImage, dW, dH, Width, Height) 'выведем со сдвигом
Draw.End
Next
End

Проект можно скачать отсюда: mArea

До новых встреч!

Также вас может заинтересовать:

  1. gb.image и вывод изображений на форму
  2. Gambas — ООП — создание своих классов и объектов в Бэйсике
  3. Gambas — файлы и папки, урок 3. функция Dir и вывод файлов и каталогов
  4. Gambas — создание многооконного mdi интерфейса с примером
  5. Производительность Gambas

Оставить комментарий ↓

  1. Комментарии
  2. ссылка на комментарий abbat81:
    25 Январь 2012 в 18:35

    посилання на файл не працює.
    Хотілося б спробувати

    • ссылка на комментарий FreeArcher:
      25 Январь 2012 в 18:47

      Если про ссылку, да не работает. Вобще на сайт не получается залить ни файл, ни картинку. Будем разбираться. Если нужен пример могу выслать на почту?