Особенности работы с 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