Ненужное масштабирование объектов

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Ненужное масштабирование объектов

Сообщение Reb Orn » 20.04.2013 (Сб) 16:01

Приветствую.
Есть проблема, заключается в следующем:
Открываю старые свои проекты и графика в image / backgroundimage у всех объектов поголовно (будь то panel, button или даже picturebox c size mode=stretchimage) уменьшены. Выглядит так же как на рабочий стол с разрешением 1024х768 поставить обои 200х150 и выбрать "замостить". Чем это вызвано и как это убрать?
Такую же проблему наблюдаю когда передаю екзешник программы на другой компьютер с другим соотношением сторон монитора.

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

Сообщение Qwertiy » 20.04.2013 (Сб) 20:54

Anchor, Dock, AutoSize, AutoSizeMode?

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Ненужное масштабирование объектов

Сообщение Reb Orn » 20.04.2013 (Сб) 23:06

Anchor Top,left
Dock по дефолту none
SizeMode у picturebox's стоит обычно StretchImage.
Autosize никогда не использую, а на button's его и вовсе нет, а там тоже съезжает фон.

Все хорошо себя показывает. Но через какое-то время меняю винду или монитор и вся графика на обьектах съезжает.

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

Сообщение Qwertiy » 21.04.2013 (Вс) 10:52

Reb Orn писал(а):Autosize никогда не использую, а на button's его и вовсе нет, а там тоже съезжает фон.

У всего он есть.

Reb Orn писал(а):Все хорошо себя показывает. Но через какое-то время меняю винду или монитор и вся графика на обьектах съезжает.

Выкладывай какой-нибудь проект.

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Ненужное масштабирование объектов

Сообщение Reb Orn » 21.04.2013 (Вс) 11:45

Вот, делал когда-то дремучую игрульку, на ней хорошо виден этот косяк.
Чтобы задействовать объекты, нужно было на них кликнуть. Это были panel с транспарентным задним фоном, т.е. не видимые для пользователя. Они были так расположены на форме, что соответствовали backgroundу этой формы. А когда графика съехала, "попасть" мышкой стало невозможно. Да и общий дизайн пострадал.
Вот: http://files.mail.ru/40A7673164954648A2075D0D6BD298FA (простите, не знаю как именно здесь принято проекты выкладывать. Благо он не большой)

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

Сообщение Qwertiy » 22.04.2013 (Пн) 11:03

Reb Orn писал(а):Вот, делал когда-то дремучую игрульку, на ней хорошо виден этот косяк.
Вот: http://files.mail.ru/40A7673164954648A2075D0D6BD298FA (простите, не знаю как именно здесь принято проекты выкладывать. Благо он не большой)

Во-первых, надо выкладывать код, а не exe'шник. Во-вторых, желательно выкладывать что-то простое, чтобы не приходилось разбираться. Ну и в-третьих, лучше выкладывать как вложение, если размер файла позволяет.

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Ненужное масштабирование объектов

Сообщение Reb Orn » 30.05.2013 (Чт) 9:06

Код загрузки изображения стоит в Form.load и выглядит вот так для каждого объекта:
Panel1.BackgroundImage = System.Drawing.Bitmap.FromFile("Data/Graphic/Interface/Panel1Background.jpg")

При этом вот так выглядит запущенное окно на моем компьютере:
http://s1.ipicture.ru/uploads/20130530/s3idw7J7.jpg

А вот так на любом другом (степень уползания Backgroundimage и расположения объектов в целом, разная)
http://s1.ipicture.ru/uploads/20130530/2u5ebJg3.jpg

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

Сообщение Qwertiy » 30.05.2013 (Чт) 12:04

Ты можешь сделать какой-то простой семпл, чтобы оно не работало и выложить его код???

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Ненужное масштабирование объектов

Сообщение Reb Orn » 30.05.2013 (Чт) 20:56

Создаю проект, в единственной стартовой форме создаю Panel1 300х400 скажем. Располагаю ровно в центре формы.

На событие Form.load
пишу этот код:
Panel1.BackgroundImage = System.Drawing.Bitmap.FromFile("Data/Graphic/Interface/Panel1Background.jpg") - все, больше другого кода нет.

Запускаю, все нормально.
Запускаю на другой машине, Panel1 не совсем по центру а чуть-чуть куда-нибудь смещена и картинка либо не влезла, либо наоборот слишком мала.

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Ненужное масштабирование объектов

Сообщение Admiralisimys » 30.05.2013 (Чт) 22:14

Reb Orn, а где код по выдерживанию отношения размещения Panel к форме (не задано свойство Anchor либо Dock)? Где собственно принятая система координат (свойства формы AutoScaleDimensions и AutoScaleMode)?
Вот один из возможных вариантов.
Код: Выделить всё
Imports System
Imports System.Drawing
Imports System.Windows.Forms

Class Form1
    Inherits Form

    <STAThread()>
    Public Shared Sub Main()
        Application.Run(New Form1())
    End Sub

    Public Sub New()
        ClientSize = New Size(720, 576)

        Dim pn As New Panel()
        pn.Parent = Me
        pn.Size = New Size(300, 400)
        pn.BackgroundImage = Bitmap.FromFile("C:\Windows\Web\Wallpaper\Windows\img0.jpg")
        pn.Location = New Point(ClientSize.Width / 2 - pn.Size.Width / 2, ClientSize.Height / 2 - pn.Size.Height / 2)
        pn.Anchor = pn.Anchor And AnchorStyles.Bottom And AnchorStyles.Left And AnchorStyles.Right And AnchorStyles.Top

        AutoScaleDimensions = New Size(4, 8)
        AutoScaleMode = Windows.Forms.AutoScaleMode.Font
    End Sub

End Class

Конечно это нужно ещё проверить на целевых ПК.

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

Сообщение Qwertiy » 30.05.2013 (Чт) 22:51

Reb Orn писал(а):Создаю проект, в единственной стартовой форме создаю Panel1 300х400 скажем. Располагаю ровно в центре формы.

Так вот создай, заархивируй и выложи тут!

Admiralisimys писал(а):Вот один из возможных вариантов.

Что я не пойму, это пример того как надо делать, или как не надо?
Я бы всё масштабирование отключил.

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Ненужное масштабирование объектов

Сообщение Admiralisimys » 30.05.2013 (Чт) 23:51

Qwertiy я так понимаю судя по описанию Reb Orn имеет место не учитывание на разных системах значений системных настроек (в данном случаи предположу DPI, возможно лишь значение размера системного шрифта). Данный пример показывает как возможно стоит делать, дабы осуществить данное учитывание, что б программа отображался как желает её автор.

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

Сообщение Qwertiy » 31.05.2013 (Пт) 1:46

Admiralisimys писал(а):Данный пример показывает как возможно стоит делать, дабы осуществить данное учитывание, что б программа отображался как желает её автор.

А мне кажется, что так как раз делать не надо, а надо везде поставить None.

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Ненужное масштабирование объектов

Сообщение Reb Orn » 01.06.2013 (Сб) 20:30

Создал самый легкий и примитивный пример.
Вот: http://files.mail.ru/9EF2F39649574828A2442A76BA2F2EE2

На форме расположена buttonи panel. Background формы и panel загружают картинку при запуске.
Так же в папке bin есть скриншот того как это выглядит при запуске у меня на компьютере и, соответственно, так как хотел бы чтобы это было на других.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Ненужное масштабирование объектов

Сообщение FireFenix » 01.06.2013 (Сб) 22:36

Reb Orn писал(а):На форме расположена buttonи panel. Background формы и panel загружают картинку при запуске.
Так же в папке bin есть скриншот того как это выглядит при запуске у меня на компьютере и, соответственно, так как хотел бы чтобы это было на других.

Размер контейнера не равен размеру изображения.
Для подгона картинки под размер можно юзать BackgroundImageLayout = ImageLayout.Stretch
Феншуйно было бы получать текущее dpi и на основе его подгонять все размеры

Вообще использовать отличное от 96dpi - это извращение.

Так же использовать WF контролы для отображения картинок и элементов игр - извращение. Уж лучше тогда на WPF, а ещё лучше на DX/OGL
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Ненужное масштабирование объектов

Сообщение Reb Orn » 01.06.2013 (Сб) 23:59

FireFenix,
Я не смог отыскать BackgroundImageLayout ни к одному объекту на форме. Может ли это быть связано с тем что у меня Microsoft Visual Studio .NET 2003?
К родному проекту (а не к примеру, который тут выкладывал) графика имеет 96dpi. Так что прошу прощение за дезинформацию, однако, опытным путем проверил что не dpi стал причиной "сдвига" объектов и графики.
__
Размер контейнера не равен размеру изображения.

В " Windows Form Designer generated code " прописано свойство size для Panel1 600х600 и картинка, которая в процессе присвоится ей тоже 600х600.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Ненужное масштабирование объектов

Сообщение FireFenix » 02.06.2013 (Вс) 1:02

Reb Orn писал(а):Я не смог отыскать BackgroundImageLayout

Начиная с FW3.5 msdn -> http://msdn.microsoft.com/ru-ru/library ... ayout.aspx

Reb Orn писал(а):В " Windows Form Designer generated code " прописано свойство size для Panel1 600х600 и картинка, которая в процессе присвоится ей тоже 600х600.

где?
Код: Выделить всё
Me.Panel1.Size = New System.Drawing.Size(220, 320)

Me.Button1.Size = New System.Drawing.Size(40, 40)

Me.AutoScaleBaseSize = New System.Drawing.Size(6, 15)
Me.ClientSize = New System.Drawing.Size(598, 398)

это в исходниках, а если декомпилить exe'шник в bin, то там вообще яд
Код: Выделить всё
   Dim point As New Point(40, 40)
    Me.Panel1.Location = point

    Dim size As New Size(220, 320)
    Me.Panel1.Size = size


    point = New Point(530, 320)
    Me.Button1.Location = point

    size = New Size(40, 40)
    Me.Button1.Size = size


Так же судя по описанию ехе'шника версия FW1.1.4322 Харкдор и садомия. На дворе 2013 год, есть 2012 студия и FW4.5

Так же если внимательно смотреть в код, то там есть AutoScale и явно он там не нужен или не нужен в том виде как исполнен.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Ненужное масштабирование объектов

Сообщение Admiralisimys » 02.06.2013 (Вс) 1:21

Reb Orn для данного примера нужно воспользоваться общим советом Qwertiy-FireFenix убрать/закомментировать Me.AutoScaleBaseSize = New System.Drawing.Size(6, 15), тогда вид приложения будет совпадать с приведённым на скриншоте.

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

Сообщение Qwertiy » 02.06.2013 (Вс) 2:40

Reb Orn писал(а):у меня Microsoft Visual Studio .NET 2003?

Неужели действительно надо эту гадость использовать?

FireFenix писал(а):Вообще использовать отличное от 96dpi - это извращение.

Зачем вообще думать о dpi? Да хоть 37.2, какая разница?

FireFenix писал(а):Размер контейнера не равен размеру изображения.

Равен. Кроме формы:
Код: Выделить всё
Me.ClientSize = New System.Drawing.Size(598, 398)
по пикселю с каждой стороны - граница окна, это надо немного подправить.

FireFenix писал(а):Для подгона картинки под размер

Ему наоборот надо размер под картинку подгонять вроде...

Reb Orn писал(а):Так же в папке bin есть скриншот того как это выглядит при запуске у меня на компьютере и, соответственно, так как хотел бы чтобы это было на других.

Надо просто удалить присваивание AutoScaleBaseSize:
Код: Выделить всё
        'Me.AutoScaleBaseSize = New System.Drawing.Size(6, 15)
        'Me.ClientSize = New System.Drawing.Size(598, 398)
        Me.ClientSize = New System.Drawing.Size(600, 400)

А картинки вообще ни при чём, размер меняется и без них.

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Ненужное масштабирование объектов

Сообщение Reb Orn » 02.06.2013 (Вс) 9:25

После удаления строки Me.AutoScaleBaseSize все стало так как нужно.
Всем огромное спасибо за помощь и особенно за терпение.
Тему можно закрывать.


Вернуться в Visual Basic .NET

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

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

    TopList