Визуал Бейсик 6. Опыт программирования

  Имея опыт программирования в среде VB6, я хочу обсудить возможности этой среды, поделиться опытом, и дать некоторые рекомендации. В качестве примера мы будем обсуждать редактор для художественного рисования DM_Paint.
  Мы обсудим его интерфейс, приёмы для создания такого интерфейса, а также дополнительные возможности, включающие анимацию и векторную графику.

  Большую часть экрана монитора занимают 5 окон. Это окно Form1, демонстрирующее визуальный интерфейс, окно Form1 с текстом поддерживающих интерфейс программ, и окно основного модуля «Модуль 1» - в этом модуле задаются глобальные переменные, находятся подпрограммы общего назначения, подпрограммы копирование и преобразования, а также подпрограммы рисования кистями.
  Имеется окно с текстами раздела Help, и окно Anim_D – в этом окне находятся тексты подпрограмм, создающих анимацию, и тексты подпрограмм векторной графики. Векторная графика тесно связана с анимацией, поэтому естественно было поместить соответствующие подпрограммы в один общий модуль. Этим же уменьшается и количество модулей. Окна модулей расположены лесенкой, и поэтому очень удобно переходить с одного модуля на другой, кликая по углам их окон.

  Что касается внутренней структуры модулей, то она проста.
1. Тексты подпрограмм не намного длиннее того места, которое непосредственно обозревается в окне, и поэтому с подпрограммами легко работать. Если же подпрограмма имеет большой размер, то она членится на более мелкие и удобные для обозрения части оператором «Select Case».
2. Подпрограммы попросту следуют одна за другой, придерживаясь тематического порядка. Например, подпрограммы, обеспечивающие чтение или сохранение в файлах векторной графики, находятся в самом конце модуля Anim_D.

Программу DM_Paint вместе с её исходниками можно скачать тут - http://disk.yandex.ru/d/WJ5xN76xQrReYQ
Поговорим об отдельных её модулях.



   ВИЗУАЛЬНЫЙ ИНТЕРФЕЙС

  Интерфейс программы DM_Paint создан исключительно из кнопок «CommandButton» и полей «PictureBox». Причём поле Picture1 служит контейнером для трёх других полей Picture, находящихся внутри него и перемещающихся вместе с ним. 
  Остальные поля и все кнопки находятся на форме, тесно примыкая друг к другу. Эти элементы выглядят как две панели – левая и верхняя, собранные в общую панель-уголок.

  Поле Picture1 не ограничено в своих размерах. Оно может быть увеличено в своей правой и нижней части, также как и уменьшено в этих направлениях.
  Поле Picture1 может перемещаться по форме с помощью кликов по кнопочкам с графическим рисунком стрелочек (на иллюстрации не видны), которые находятся в нижней части левой панели.
  В своём движении вверх или влево поле Picture1 подныривает под панель-уголок. Таким образом, панели как бы плавают поверх рисунка. Клики по кнопкам со стрелочками правой кнопкой мыши не передвигают поле, а изменяют его размеры.
  Изменение размера полей типа «PictureBox» имеет свою специфику, которая описана тут - http://proza.ru/2020/04/22/1178

  Кнопки не являются контейнерами для других кнопок, однако кнопка, имеющая больший номер, оказывается поверх кнопок с меньшим номером когда кнопки перекрывают друг друга. Таким способом в программе организована демонстрация активного цвета на цвете фона. В цвет фона окрашена широкая кнопка, подложенная под кнопку активного цвета.

  Элементы типа «Label» закрываются полем Picture при его перемещении, и поэтому они в интерфейсе не используются.

  Интерфейс с кнопками и полями реализуется кликами по ним.
  После того, как мы поместили на форму новую кнопку, двойным кликом по ней мы создаём подпрограмму обработки клика. После чего наполняем подпрограмму содержанием. Выглядит эта программа, например, так:

Private Sub Command19_Click()
  Picture1.Line (1, 1)-(Kw, Kh), cBack, BF:
  Picture1.SetFocus
End Sub

  Если мы планируем обращаться к этой подпрограмме из других модулей, то заменяем слово Private на слово Public.
  Но есть и другая возможность обработать клик по этой кнопке:

Private Sub Command47_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
   If Button = 2 Then Picture1.Line (1, 1)-(Kw, Kh), OldC, BF:
End Sub

И тогда при клике правой кнопкой мыши (Button = 2) поле рисунка будет заполнено не цветом фона, а активным цветом.
  В обоих вариантах действие осуществляется не при нажатии кнопки, а после её отпускания. Если во втором варианте предусмотреть действие от клика левой кнопкой мыши (Button = 1), то оно тоже будет произведено, но после действия по первому варианту.

  Второй вариант удобен ещё и тем, что анализируя значения X и Y, можно производить те или иные действия в зависимости от места клика на кнопке.
  Так, узкая кнопка с надписью «Графика» кликом по ней преобразуется в большую кнопку с длинной надписью. А поскольку места для текста по ширине не хватает, то слова текста располагаются на кнопке по вертикали. Таким образом создаётся выпадающее меню для работы с векторной графикой.

  Другой пример. На кнопке блокировки рисования находится картинка с концентрическими кругами. Одновременно, свойству Caption этой кнопки присвоено значение нескольких пробелов. Поскольку кнопка эта узка и расположена вертикально, то места для картинки места не хватает, и кнопка заполняется пробелами. То есть она видится, как пустая.
  Клик мыши по этой кнопке делает её широкой и ликвидирует пробелы в свойстве Caption. Теперь кнопка приобретает тот вид, который вы можете видеть на иллюстрации. Кликами по разным её местам можно теперь не только блокировать или разблокировать рисование, но и изменять направление и величину вектора стекания, если мы рисуем акварельной кистью, или перемещать и разворачивать векторные фигуры, если мы работаем с векторной графикой.
  Клик мыши по левой части широкой кнопки вернёт ей исходный вид.

  Поля типа «PictureBox» также могут играть роль графических меню с набором нарисованных на поле кнопок.
  Таким способом осуществляется выбор кистей для рисования и выбор подходящего паттерна для рисования кистью №5. В исходном состоянии поля для выбора скрыты. Вместо них на левой панели находятся узкие краешки поля. Клик правой кнопкой мыши по этим краешкам разворачивает эти поля вправо.
  Панель для создания и управления анимацией в первоначальном своём состоянии не видна вовсе. Но клик по форме правее верхней панели делает её видимой. Всё управление анимацией делается кликами по квадратикам, нарисованным на панели АНИ. Тут используются как клики левой, так и клики правой кнопкой мыши.

  Таким образом, мы видим, что интерфейс, составленный из кнопок и полей может быть очень изощрённым и разнообразным.

     ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА

  Визуальный интерфейс и подпрограммы, поддерживающие его, находятся в модуле «Form1». Программное окно интерфейса показывает только подпрограммы, но не показывает содержание начала файла Form1.

  Весь файл целиком можно посмотреть, если открыть его в Блокнотике в текстовом режиме. Также можно поступить и с другими модулями, и хотя ничего нового мы в них для себя не откроем, но зато можно будет провести поиск интересующих нас переменных и даже провести их замену, если это необходимо.
  Но файл Form1, открытый в Блокнотике наиболее интересен. Он начинается перечислением всех визуальных объектов с указанием их свойств, преимущественно тех, которые не принимаются по умолчанию. И эти свойства также можно корректировать. Если вы хотите внедрить объект, работающий в другой программе, то можно просто вставить его описание, изменив его номер при необходимости.
  Далее идут строки меню разделов Help, предусмотренные в инструментах VB6, – кликнув по визуальному окну «Form1» и по пункту «Инструменты», мы попадаем в Редактор меню, в котором и создаём эти строки.
  И только после этого идут подпрограммы, которые можно видеть в программном окне интерфейса.

  Хотя порядок следования подпрограмм в принципе безразличен, но для удобного нахождения нужной подпрограммы порядок всё же нужен. Приведу порядок принятый в модуле «Form1» программы DM_Paint.

===============
взято отсюда - http://visualprogs.ru/sample/68.html
текст для операции Принт Скрин от клика по одной из кнопок визуального интерфейса с последующим выводом результата на поле Picture1.
===============
Подпрограммы типа Sub Command_Click()
Порядок следования их неважен.
===============
Sub Form_KeyUp
Обработка нажатий горячих клавиш клавиатуры
===============
Private Sub menu
Меню отсылок на подпрограммы модуля Help
Этот раздел хорошо заметен.
================
Private Sub Form_Load()
Действия при загрузке и при окончании программы.
Private Sub Form_QueryUnload
================
Private Sub Command67_MouseUp Работа с меню векторной графики
================
Private Sub Picture1_MouseUp
Private Sub Picture1_MouseDown
Private Sub Picture1_MouseMove Работа с полем для рисования
================
Private Sub Picture2_MouseDown
Считывание цвета с палитры
и далее работа с другими полями в порядке возрастания их номеров
Private Sub Picture7_MouseDown и MouseUp
движением стилуса это поле перемещается по рисунку.
То же для поля 10 – эта красная перемещаемая кнопка-поле дублирует кнопку Размер кисти рисования.
================
Дальше идёт раздел кнопок
Private Sub Command10_MouseUp и далее в порядке возрастания номеров
================
Private Sub Form_MouseUp для появления окна АНИ
Private Sub Text2_MouseDown подтверждение некоторых действий кликом
         по верхнему текстовому полю с комментариями.
Private Sub Text3_MouseDown кликом по кромке удаляется окно Help

Этим текст подпрограмм модуля Form1 заканчивается. Если нам нужно попасть в центр этого списка, то дважды кликаем по изображению кнопки с надписью Графика, и далее передвигаемся куда нам надо. Как вы видите, искать нужную подпрограмму при таком их расположении весьма удобно.

  Подпрограммы в модуле Anim_D расположены по функциональному принципу – рядом друг с другом находятся связанные между собой или выполняющие сходную задачу. Тем не менее, для удобства, я сделал себе путеводитель но этим программам - http://proza.ru/2021/01/08/454

    МОДУЛЬ «Help»

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

'================================== вывод в текстовое окно
Public Sub T(S As String)
Static X1 As Integer, Y1 As Integer
  If S = "" Then Form1.Text3.Visible = True: Form1.Text3 = "X": Exit Sub
  If InStr(S, "&") > 0 Then
    I = InStr(S, "&"): X1 = Val(S): Y1 = Val(Mid(S, I + 1))
    Form1.Text3.Left = X1 - (Form1.Picture1.Left - 2520) / 15
    Form1.Text3.Top = Y1 - (Form1.Picture1.Top - 630) / 15
    Form1.Text3.Width = 800 - X1: Form1.Text3.Height = 500 - Y1
  Exit Sub: End If
  Form1.Text3 = Form1.Text3 + S + vbNewLine 'символ новой строки
End Sub

  А вот пример текста, который эта подпрограмма обрабатывает:

Public Sub Help15() 'Help рисование в масштабе 2:1
  T (""): T ("200&320"):
  T ("        Более тщательно проработать обозначенную кликами область")
  T ("  можно в Масштабе 2:1.  Для этого, после обозначения области нужно")
  T ("  кликнуть поле выше кнопки <Г> (изначально это поле коричневое).")
  T ("     Выделенная область в укрупнённом масштабе появится в левом верхнем ")
  T ("     углу рисунка.      После проработки область возвращается повторным")
  T ("                кликом.")
  T ("  То же самое с уменьшением области рисования (70%), для её более общей")
  T ("  проработки, можно сделать кликом ПРАВОЙ кн.мыши.")
End Sub

  Мы видим, что средствами Визуал Бейсика можно делать весьма сложные проекты, многофункциональные и с разнообразным и развитым интерфейсом.
  Более подробно о конкретных аспектах программирования и о получаемых результатах читайте в статьях на моей страничке. Буду рад удовлетворить Ваш интерес к этой теме.
__________
17.06.2021

о программе для рисования в популярном виде читаем тут - http://proza.ru/2020/11/17/742


Рецензии
Интересная программа, но пользуюсь другой.

Игорь Леванов   17.06.2021 19:42     Заявить о нарушении
Статья несколько специфическая, она написана для программистов. Дело в том, что на Ютубе меня попросили помочь с программированием в среде VB6. К сожалению, эта среда уже уходит в прошлое, а новые Бейсики не столь хороши, как этот.
Питон, вообще, язык, по моему мнению, негодный, поскольку отступы в тексте программы он трактует как замыкание оператора If и других, ему подобных. Написать нормально читаемый текст в таких условиях невозможно.

Дмитрий Маштаков   17.06.2021 22:21   Заявить о нарушении
Извините, Игорь. - здравия Вам !

К Дмитрию : спасибо за такие тексты. И просьба : побольше исходя из вашего опыта критических высказываний о чём то неладном. Вот как вы здесь о Питоне сказали. Многим поможет.

Вопросы :
Уважаемый Дмитрий, скажыте,
1. можно ли сделать устройство (с программой) которое оценивает как то звучание изготовленных инструментов натуральных. Например - партия - сто аккустических гитар.
Или колоколов. Или ...
1.1. Что за принцыпы должны быть заложены в оценку ?

2. Не знаю каков сейчас ваш интерес к физике. Недавно прочёл две страницы статьи "стратегическая ошибка современной физики" О.Х.ДЕРЕВЕНСКИЙ. - есть в pdf

- эти две страницы понравились.
Там к двоичной логике сводится. Это мне очень нравится.
Уточняю. вопрос 1. К вам, как и музыканту :
Можно ли сделать (выстроить) программку "дерево целей" - предпочтений (с разветвлениями) в оценке звучания ?

3. Дмитрий, хочется спросить : есть ли у вас здесь что-нибудь, где вы жёсткий критик ?

Георгий Сотула   25.07.2021 20:13   Заявить о нарушении
Георгий, если Вы пишите стихи, то за критикой можно обращаться сюда - http://stihi.ru/avtor/tdntdn2
а если Вы занимаетесь чем-то другим, то подумайте - а стоит ли тратить своё время на столь никчёмное занятие? - http://stihi.ru/2017/05/05/4879
))

Дмитрий Маштаков   26.07.2021 00:56   Заявить о нарушении
Дмитрий !
За первую ссылку (на Тимофея) спасибо. Хотя ... ваше "если.." - не очень вежливое.

За вторую - сказать не могу спасибо. Уточните :
Вначале у вас : "если пишете стихи ...
А далее у вас "а если вы занимаетесь ... другим ... никчёмное занятие ..."

Т.е. - вы как бы глуповато утверждаете , что писав этот текст, вы занимаетесь "никчёмным" ?
- Не понял вас, Дмитрий.
Уважаемый !

Прошу не обидеться. - токмо за ради критики высказал.
Покорно жду ответов на первые два вопроса. Спаси Боже.

Георгий Сотула   26.07.2021 06:05   Заявить о нарушении
Да я же пошутил )) Хотя, должен сказать, что Эмили Дикинсон такое же мнение имеет.

Дмитрий Маштаков   26.07.2021 08:55   Заявить о нарушении
Что касается первых двух вопросов, то думаю, то, что делается для духовных запросов человека, никакая программа оценить не в состоянии. Разве только отсеять самый очевидный брак.

Дмитрий Маштаков   26.07.2021 08:58   Заявить о нарушении