Особенности работы с PictureBox в среде VB6
Толкового описания того, как это делать правильно, я в интернете не нашёл.
Расскажу об этом на примере 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
Свидетельство о публикации №220042201178
Добрый день, Дмитрий ...вич!
•
Вопрос 1.
А как же свойство Stretch объекта PictureBox?
Вопрос 2.
А что это у Вас за редактор такой интересный DM_Paint?
•
Вот эта Ваша фраза «...в интернете про это совершенно никакой информации нет. Пришлось догадываться самому» – она много стОит; на выходных проверю Ваш код, если
стандартный виндОвый MS PaintBrush для этого подойдёт.
Хомуций 16.09.2021 19:16 Заявить о нарушении
Если интересуетесь исходниками. то они тут - http://disk.yandex.ru/d/WJ5xN76xQrReYQ а о программе в целом я рассказываю на Ютубе - http://www.youtube.com/channel/UCxmwXkCiEIs7Stw7tlADyYw
Дмитрий Маштаков 17.09.2021 15:20 Заявить о нарушении
Дмитрий Маштаков 17.09.2021 20:14 Заявить о нарушении
Дмитрий Маштаков 17.09.2021 20:28 Заявить о нарушении
Уже скачал, завтра буду разбираться.
Наперёд спасибо!
Хомуций 17.09.2021 21:18 Заявить о нарушении