Особенности работы с PictureBox в среде VB6

   Имея опыт работы по созданию графического редактора с среде Визуал Бейсик 6, хочу поделиться некоторыми особенностями работы с компонентом PictureBox, связанными с изменением размеров этого компонента.
   Толкового описания того, как это делать правильно, я в интернете не нашёл.
   Расскажу об этом на примере Picture1 - именно эту картинку с первым номером я использую как поле для рисования в своей программе.

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

   Проблема состоит не в том, чтобы изменить свойства Picture1.Image и  Picture1.Height, а в том, чтобы рисунок действительно принял эти размеры.
   Поясню. Например, мы изменили свойства Picture1.Width и  Picture1.Height в сторону их уменьшения, смотрим на экран монитора и радуемся - рисунок стал маленьким, и вдобавок, он окружён тоненькой рамочкой, бордюром, как знак того, что наши действия прошли успешно.
   Отнюдь.
   Перебросим наш рисунок на поле 2 оператором Picture2.Picture = Picture1.Image, а затем вернём его обратно оператором Picture1.Picture = Picture2.Picture и что мы увидим?
 О ужас, рисунок в размерах совсем не изменился.
   С одной стороны это хорошо.
  Используя разные графические методы мы можем рисовать на Picture1, удалять нарисованную графику оператором Picture1.Cls, закреплять графику на поле оператором Picture1.Picture = Picture1.Image, перебрасывать рисунок с одного поля на другое, и нигде - ни в этих операциях, ни между ними  уменьшить первоначальный размер рисунка просто так, невозможно. И стало быть, нарисованное не пропадёт.

  А вот увеличить размер рисунка просто. Операторы
     Picture1.Width = Picture1.Width + whStep
     Picture1.Height = Picture1.Height + whStep   легко решат эту задачу.

  Но обратно никак. С отрицательным значением переменной whStep операторы не работают. И в этом есть логика - если мы нарисуем что-то на рисунке большого формата, то оно опять же не пропадёт.
  Такой логический принцип просматривается в функционировании среды программирования VB6.

  Соблюдается этот принцип и при загрузке файлов. Например, при выполнении операторов подпрограммы
      Picture1.Picture = LoadPicture(CurDir() + "/имя файла" + ".bmp")
      Text2 ="   Файл загружен"
      If Kwh = 1 Then Picture1.Height = 7575: Picture1.Width = 12495
      If Kwh = 2 Then Picture1.Height = 9570: Picture1.Width = 18405
рисунок после загрузки файла обрезается или дополняется в своих размерах до указанного формата 1 или 2.

  Однако, если файл загрузить без выполнения последних двух строк, то дальнейшие изменения формата рисунка оказываются возможными только в сторону увеличения размеров рисунка. А как в случае необходимости уменьшить его размер, не вполне понятно.

  В этот-то проблема и состоит.
И как оказалось, решается она просто. Изменение свойств Picture1.Image и  Picture1.Height в сторону их уменьшения нужно предварить оператором закрепления графики, стоящем в тексте подпрограммы, предназначенной для этого. Например –
________
Private Sub Command11_MouseUp(Button As Integer, Shift As Integer, … )
   If Button = 2 Then
 If Picture1.Width < 60000 Then Picture1.Width = Picture1.Width + whStep
 Picture1.Picture = Picture1.Image:
   End If
End Sub       эта подпрограмма увеличивает ширину рисунка
________ 
Private Sub Command12_MouseUp(Button As Integer, … )
   If Button = 2 Then
     Picture1.Picture = Picture1.Image      '<===  Вот этот оператор
If Picture1.Width > 2*whStep Then Picture1.Width =Picture1.Width - whStep
 Picture1.Picture = Picture1.Image:
   End If
End Sub       эта подпрограмма уменьшает ширину рисунка
 
Подпрограмма для выделения области рисунка, изменения её размера и обособления результата в новый рисунок, выглядит так –
________
Private Sub Command65_Click() 'вырезать из рисунка зону «д»
Dim W As Long, H As Long, W1 As Long, H1 As Long, K As Single, I As Integer
  If oD = 0 Then Text2 = "область |д| не выделена": Exit Sub
  K = Val(Text1): I = InStr(Text1, к): If K = 0 Then K = 1
  If K < 0.3 Or K > 3 Then Text2 = " допустимо 0.3<к<3": GoTo 6
  Picture1.Picture = Picture1.Image: W = X2 - X1 + 1: H = Y2 – Y1 + 1
  Picture1.PaintPicture Picture1, 0, 0, W, H, X1, Y1, W, H
  Picture1.Picture = Picture1.Image:
  Picture1.Width = (W + 4) * 15: Picture1.Height = (H + 4) * 15
  If K = 1 Then GoTo 6
  Picture1.Picture = Picture1.Image: W1 = W * K: H1 = H * K:
  Picture1.Width = (W1 + 4) * 15: Picture1.Height = (H1 + 4) * 15
  Picture1.PaintPicture Picture1, 0, 0, W1, H1, 0, 0, W, H
6  Picture1.Picture = Picture1.Image
End Sub

А эта подпрограмма изменяет размер рисунка целиком –
________
Private Sub Command65_MouseUp(Button As Integer, Shift As Integer,… )
Dim W As Long, H As Long, W1 As Long, H1 As Long, K As Single, I As Integer
  If Button = 2 Then
  K = Val(Text1): I = InStr(Text1, к): Picture1.Picture = Picture1.Image: '<=== Вот этот оператор
  If K = 0 Or I = 0 Or K = 1 Then Text2 = " увеличено 1:1": Exit Sub
  If K < 0.3 Or K > 3 Then Text2 = " допустимо 0.3<к<3": Exit Sub
  W = Picture1.Width / 15 - 4: H = Picture1.Height / 15 - 4:
  W1 = W * K: H1 = H * K:
  Picture1.Width = (W1 + 4) * 15: Picture1.Height = (H1 + 4) * 15          '<=== он нужен, чтобы этот оператор работал правильно
  Picture1.PaintPicture Picture1, 0, 0, W1, H1, 0, 0, W, H               
  Picture1.Width = (W1 + 4) * 15: Picture1.Height = (H1 + 4) * 15
  Picture1.Picture = Picture1.Image: Text2 = " увеличено " + Str(K) + "x"
  End If
End Sub

Тут важно, чтобы оператор Picture1.Picture = Picture1.Image находился именно в тексте той подпрограммы, в которой уменьшаются размеры рисунка. Выполнение его прежде, но отдельно, нужного результата не приносит.
  Мне пришлось немало поэкспериментировать, прежде я понял, в чём дело. Опять же, в интернете про это совершенно никакой информации нет. Пришлось догадываться самому.
_________
22.4.2020


Рецензии
О, встретил родственную душу!
Добрый день, Дмитрий ...вич!

Вопрос 1.
А как же свойство Stretch объекта PictureBox?
Вопрос 2.
А что это у Вас за редактор такой интересный DM_Paint?

Вот эта Ваша фраза «...в интернете про это совершенно никакой информации нет. Пришлось догадываться самому» – она много стОит; на выходных проверю Ваш код, если
стандартный виндОвый MS PaintBrush для этого подойдёт.

Хомуций   16.09.2021 19:16     Заявить о нарушении
Спасибо за интерес. Может быть, я не всё про Визуал Бейсик знаю. Но проблемы по обрезке рисунка у меня были. Что касается "Stretch объекта PictureBox" то такого свойства я среди прочих свойств не обнаружил. М.б. в VB6 такого просто нет?
Если интересуетесь исходниками. то они тут - http://disk.yandex.ru/d/WJ5xN76xQrReYQ а о программе в целом я рассказываю на Ютубе - http://www.youtube.com/channel/UCxmwXkCiEIs7Stw7tlADyYw

Дмитрий Маштаков   17.09.2021 15:20   Заявить о нарушении
А, понял - свойство Stretch не в PictureBox, а в Image есть. Но я объектами Image не пользуюсь, поскольку в них рисовать нельзя.

Дмитрий Маштаков   17.09.2021 20:14   Заявить о нарушении
MS PaintBrush совсем уж старая программа, ещё ДОС-овских времён. Я для простых вещей - надпись сделать, рисунок раскроить, Paint под Виндос использую, но старый, а не новый. Старый попроще, и в нём нет ничего лишнего. Нет набора кистей, который мне не нужен, поскольку кисти в моей программе есть. Так и работаю, двумя редакторами - Paint и своим DM_Paint. И это удобно. В моём редакторе ещё векторная графика, и анимация есть. Обширный раздел Help тоже - всё уместилось в 1.36 МБайт.

Дмитрий Маштаков   17.09.2021 20:28   Заявить о нарушении
Я так и понял, что DM_Paint – это Ваша программа (смотрел Ваши ролики в Ютюбе).
Уже скачал, завтра буду разбираться.
Наперёд спасибо!

Хомуций   17.09.2021 21:18   Заявить о нарушении