происходит смещение элементов внутри picturebox

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

происходит смещение элементов внутри picturebox

Сообщение tunduk » 17.08.2013 (Сб) 20:05

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

У большинства не съезжает но у некоторых наблюдается.

Где грабли? как избежать этого?
спасибо.

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: происходит смещение элементов внутри picturebox

Сообщение bon818 » 17.08.2013 (Сб) 22:20

может
? = GetDeviceCaps(GetDC(0), LOGPIXELSX)
у тех возвращает не 96

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: происходит смещение элементов внутри picturebox

Сообщение Хакер » 18.08.2013 (Вс) 4:33

bon818, тебе не судьба написать Screen.TwipsPerPixelX вместо GetDeviceCaps(GetDC(0), LOGPIXELSX) если ты видишь, что имеешь дело с людьми, которые вряд ли работают с GDI напрямую?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: происходит смещение элементов внутри picturebox

Сообщение tunduk » 18.08.2013 (Вс) 6:36

Можно поподробнее, господа.
Я не особо матерый программо-писатель (скорее наоборот) _0)
Процесс ваяния выглядит обычно так: На пикчербокс кладется рисунок схема, поверх нее кладутся маленькие картинки, в данном случае контакты реле и в зависимости от происходящего в цепи события я подменяю маленькие картинки меняя состояние контактов в схеме.
При этом положение маленькой картинки на большой я осуществляю вручную подгоняя TOP и LEFT.
Написал мелкую программулю, отослал юзверю у которого съезжает. Оказалось сдвиг происходит независимо от того помещена картинка в картинку т.е. когда вторая не в контейнере первой.

спасибо.

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: происходит смещение элементов внутри picturebox

Сообщение tunduk » 18.08.2013 (Вс) 7:06

поЯндексил: "Соотношение размеров твипа и пиксела изменяется в зависимости от разрешения экрана, и в Visual Basic измеряется при помощи переменной Screen.TwipsPerPixelX и Screen.TwipsPerPixelY для горизонтальных и вертикальных размеров соответственно."
СТало чуток доходить.Проблема в том что при изменении количества пикселей на экране меняется количество твипов на пиксел.
Как же написать исправление, корректор под разное разрешение, чтобы везде одинаково выглядел результат?

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: происходит смещение элементов внутри picturebox

Сообщение tunduk » 18.08.2013 (Вс) 8:33

сработает ли :
pic1.left=pic1.left/ a * b

где a=количество твипов в пикселе у юзера, b= количество твипов у меня?

спасибо

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: происходит смещение элементов внутри picturebox

Сообщение Mikle » 18.08.2013 (Вс) 9:48

Это сработает, но нужно ли это делать.
Проблема в том, что некоторые элементы зависят от масштаба TwipsPerPixel, а некоторые - нет. Тут вариантов много.
1. Если используемые изображения векторные либо фотографии, то есть их можно масштабировать без существенных потерь - то так и сделать.
2. Если картинки пиксельарт, их много и они сильно перемешаны с нормально масштабируемыми контролами, то при загрузке формы поправить эти контролы, как ты и предложил, только не забыть так же про Width, FontSize и т. п.
3. При возможности немасштабируемые элементы расположить в отдельной области со скроллбарами.
Последний раз редактировалось Mikle 18.08.2013 (Вс) 12:51, всего редактировалось 1 раз.

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: происходит смещение элементов внутри picturebox

Сообщение tunduk » 18.08.2013 (Вс) 10:15

спасибо.
а какие зависят еще элементы?
номер 1 не понял решение.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: происходит смещение элементов внутри picturebox

Сообщение Mikle » 18.08.2013 (Вс) 10:38

Попробуй в настройках Панели управления "Экран\Параметры\Дополнительно\Общие" поменять масштаб. Этим ты сменишь TwipsPerPixel для своей системы, поэкспериментируй, станет понятнее.
От масштаба зависят практически все контролы - кнопки, лейблы, скроллбары и т. п. Но не зависят изображения, если только они не в контролах типа Image со свойством Stretch=True. То есть, если тебе нужно менять размеры изображений, то либо через Stretch, либо сам, вручную. Stretch даёт очень плохое качество масштабирования.
Если поменять размеры всех изображений в контролах (не путать с самими контролами) в соответствие с масштабом, то не придётся менять позиции и размеры.

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: происходит смещение элементов внутри picturebox

Сообщение tunduk » 23.08.2013 (Пт) 14:36

проблемка связанная со съезжанием повлекла вторую...
на моем пикчербоксе лежит N маленьких картинок и K лабелов причем они не являются массивом , хочется подлечить их положение у юзверей с не 15х15 пикселов на дюйм, переводной коэфициент мну известен ... дело за малым лень не дает кучус трок вписывать... из головы лезет "Не спеши подумай" (с) реклама

СЛучано нельзя как-то указать используя
For Each ... но вот что далее?
???.left=????.left*koefficient
???.top=???.top*koefficient
next

никогда FOr Each не пользовался ... сижу книжку листаю ... но пока похожего не нахожу...

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.08.2013 (Пт) 14:39

Код: Выделить всё
For Each Ctrl As Control In Pct.Controls
  ' Your code here
Next Ctrl


UPDATE: Тьфу, это по VB6 раздел... Тогда что-то такое:
Код: Выделить всё
Dim Ctrl0 As Object, Ctrl As Control
For Each Ctrl0 In Pct.Controls
  Ctrl = Ctrl0
  ' Your code here
Next Ctrl0

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: происходит смещение элементов внутри picturebox

Сообщение tunduk » 23.08.2013 (Пт) 15:50

Qwertiy, а можно ответ для дураков? или этот и был уже для дураков? 8)
Ctrl10 и pct.controls нужно чем-то заменить?
Где-то может, можно прочитать доходчиво?...

Dim Ctrl0 As Object, Ctrl As Control
For Each Ctrl0 In Pct.Controls
Ctrl = Ctrl0
Ctrl0.Left = Ctrl0.Left + 100
Ctrl0.Top = Ctrl0.Top + 100
Next Ctrl0

охохонюшки... видно сидеть мне прописывать все вручную 8(

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.08.2013 (Пт) 15:58

Pct - на имя твоего PictureBox'а. Ctrl10 у меня нет. В цикле работай с Ctrl, а не с Ctrl0.
Если пишет ошибку про тип переменной в For Each, поменяй Object на Variant.
Я уже не помню точно как это делалось в VB6...
А что ещё за +100??

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: происходит смещение элементов внутри picturebox

Сообщение tunduk » 23.08.2013 (Пт) 16:04

это я для примера , попробовать + 100 поставил

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: происходит смещение элементов внутри picturebox

Сообщение tunduk » 23.08.2013 (Пт) 16:16

Dim Ctrl0 As Variant, Ctrl As Control

For Each Ctrl0 In pic1.Controls
Ctrl = Ctrl0
Ctrl.Left = Ctrl.Left + 100
Ctrl.Top = Ctrl.Top + 100
Next Ctrl0

"Способ или параметр данных не найден"



Dim Ctrl0 As Object, Ctrl As Control

For Each Ctrl0 In pic1.Controls
Ctrl = Ctrl0
Ctrl.Left = Ctrl.Left + 100
Ctrl.Top = Ctrl.Top + 100
Next Ctrl0
"Способ или параметр данных не найден"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.08.2013 (Пт) 16:25

Me.Controls и надо как-то проверять кто родительский...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: происходит смещение элементов внутри picturebox

Сообщение Mikle » 23.08.2013 (Пт) 23:09

Не понятно зачем две переменные - Ctrl0 и Ctrl, и присвоение Ctrl = Ctrl0 должно быть Set Ctrl = Ctrl0
Вот рабочий код из моего старого проекта:
Код: Выделить всё
  Dim c As Control
  For Each c In Controls
    c.FontSize = c.FontSize * Screen.TwipsPerPixelX / 15
    c.Left = c.Left * Screen.TwipsPerPixelX / 15
    c.Width = c.Width * Screen.TwipsPerPixelX / 15
    c.Top = c.Top * Screen.TwipsPerPixelY / 15
    c.Height = c.Height * Screen.TwipsPerPixelY / 15
  Next c

Только если попадутся контролы, не имеющие свойства Font, будет ошибка, их или отдельным циклом обрабатывать, или, к примеру, пропускать ошибку с помощью On Local Error Resume Next.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.08.2013 (Пт) 23:37

Mikle писал(а):Не понятно зачем две переменные - Ctrl0 и Ctrl, и присвоение Ctrl = Ctrl0 должно быть Set Ctrl = Ctrl0

Две переменных - для приведения типа к Control. Про Set действительно забыл.

Mikle писал(а):Вот рабочий код из моего старого проекта:

Он все контролы обработает, а не только те что в PictureBox'е.

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: происходит смещение элементов внутри picturebox

Сообщение tunduk » 24.08.2013 (Сб) 6:46

Mikle писал(а):Вот рабочий код из моего старого проекта:


спасибо, вот что-то такое простое я и предполагал что можно замутить

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: происходит смещение элементов внутри picturebox

Сообщение tunduk » 24.08.2013 (Сб) 6:47

и QWERTiy спасибо за попытку помочь

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.09.2013 (Пт) 14:36

Возможно подойдёт в качестве альтернативного решения: MSDN :: High DPI, а точнее, MSDN :: Declaring Managed Applications As DPI-Aware.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 41

    TopList