Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
1

Различие рамеров элементов в формах приложений у Windows XP и 7

20.09.2013, 13:24. Показов 1318. Ответов 7

Господа, если кто знает, поясните откуда берутся такие значения.
Создаю новый проект (на XP), кладу на форму панель и листбокс. Запускаю. На XP все размеры отображаются такими же, как и в инспекторе объектов, но на семерке ширина и высота некоторых компонентов увеличиваются. Из-за этого, если сделать привязку к краям формы, то на семерке форма получается меньше, чем вписанные в нее элементы.
Как это победить?


Различие рамеров элементов в формах приложений у Windows XP и 7
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2013, 13:24
Ответы с готовыми решениями:

Изменение рамеров прямоугольника
Добрый день. Никак не получается изменить размеры прямоугольника нарисованного на форме по...

Практическое задание (рисование в Windows формах)
Значит дали мне задание практическое: "Дано три стороны треугольника (любые). Нужно определить тип...

Запуск приложений, созданных в visual studio 2012 и windows 7 на компьютерах со старым windows xp!
Может кому понадобится! Запуск приложений, созданных в visual studio 2012 и windows 7 на...

Разработка универсальных приложений для Windows 10 и Магазина Windows
Здравствуйте. У меня проблема, не знаю как решить. Предыстория такова: Разрабатываю приложение C#...

7
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
20.09.2013, 14:00 2
Можно потыкать свойство Anchors. Можно вручную все размещать в событии формы onResize().
0
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
20.09.2013, 14:05  [ТС] 3
Цитата Сообщение от gumi250 Посмотреть сообщение
свойство Anchors
С него все и началось. Но что с ним, что без него все тоже самое.
Цитата Сообщение от gumi250 Посмотреть сообщение
вручную все размещать в событии формы onResize()
Пробовал. Такой же результат.

Добавлено через 39 секунд
Разрешения мониторов, и сами разные мониторы тоже пробовал.
0
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
20.09.2013, 14:13 4
А чего именно хотите? Чтобы размер всех компонент был одинаков на всех компах и всех операционках? Даже без осей, как правило пользователь сам может менять размер формы и при этом расположение компонентов должно оставаться корректным.
0
Эксперт C
26087 / 16276 / 3495
Регистрация: 24.12.2010
Сообщений: 35,680
20.09.2013, 15:06 5
SatanaXIII, В Qt эта проблема решается с помощью Layout-ов. В Бюлдере, кажется, тоже есть что-то в этом роде. Точно не скажу, не пробовал. Если что найдете - расскажите.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31193 / 20390 / 7941
Регистрация: 22.10.2011
Сообщений: 35,365
Записей в блоге: 6
20.09.2013, 15:15 6
SatanaXIII, здесь читал?
1
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
20.09.2013, 15:46  [ТС] 7
Цитата Сообщение от gumi250 Посмотреть сообщение
А чего именно хотите?
Цитата Сообщение от gumi250 Посмотреть сообщение
пользователь сам может менять размер формы и при этом расположение компонентов должно оставаться корректным.
В общем случае да, чтобы размеры оставались одинаковыми для любой винды. Как в редакторе набросал и так чтобы все время и было.

Цитата Сообщение от Байт Посмотреть сообщение
В Qt эта проблема решается с помощью Layout-ов.
Посмотрю. Найду, обязательно отпишусь.

Цитата Сообщение от UI Посмотреть сообщение
здесь читал?
Нет. Вот сейчас читаю. Проблемы со шрифтами? Ладно. Как обчитаюсь доложу.
0
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
26.09.2013, 10:52  [ТС] 8
Лучший ответ Сообщение было отмечено как решение

Решение

Итак.
Частный случай лечения:
свойству формы PixelsPerInch, по умолчанию равному 96, надо присвоить значение 120.

Спасибо славному UI, он был прав - дело в шрифтах. Много чего интересного представлено по той ссылке, но в основном все рекомендации сводятся к просто установке свойства Scaled в false. И предлагается это как панацея. Но приводит это к следующим последствиям:
Различие рамеров элементов в формах приложений у Windows XP и 7

Утолщение справа и снизу. Но все якоря, и прочие привязки отрабатывают корректно.
По этому лучше оставить Scaled в true и баловаться с PixelsPerInch.

Как это работает и зачем:
Свойство PixelsPerInch отвечает за количество пикселей в одном дюйме экрана. И при чем того экрана, на котором велась компоновка графического интерфейса. Как следствие, для аналогичного отображения масштабов компонентов при других параметрах другого монитора (на одном мониторе сколько разрешение не меняй - количество пикселей на дюйм не изменится)(а так же еще кстати может и совпасть, то есть у одного монитора относительно второго будет диагональ больше, а количество точек на дюйм меньше. И получится что на них будет работать одинаково корректно), нужно в конструктор формы вводить специальную функцию, определяющую параметры монитора, на котором запущена программа, и вычисляющая из этого требуемый коэффициент поправки.
При этом важно понимать отличие количества точек на дюйм и количества пикселей на дюйм. Пикселей в конкретном мониторе всегда одинаковое количество, а точек - в зависимости от разрешения (одна точка - группа пикселей).
Пример функции для конструктора:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//эта структура будет содержать разрешение экрана на системе
struct res{float x,y;}res;
 
/*здесь будет хранится коэфицент, показывающий во сколько раз
текущее разрешение больше исходного*/
struct factor{float x,y;}factor;
 
//считать текущее разрешение
res.x=Screen->Width;
res.y=Screen->Height;
 
//вычислить коэфицент. Если программа пишется при другом разрешении,
//то нужно только подставить его вместо 1024 и 768
factor.x=1024/res.x;
factor.y=768/res.y;
 
int cc=ControlCount-1; //количество объектов на форме
while(cc!=-1) //для каждого объекта выполняем следующие операции
{
Controls[cc]->Left/=factor.x; //правильно располагаем по горизонтали
Controls[cc]->Top/=factor.y; //…по вертикали
Controls[cc]->Width/=factor.x; //растягиваем до нужной ширины
Controls[cc]->Height/=factor.y; //…высоты
cc--;
}
 
//теперь растягиваем саму форму
Form1->Width/=factor.x;
Form1->Height/=factor.y;
 
//изменяем размер шрифтов; не забудьте поставить свойство формы Scaled=true
Form1->PixelsPerInch=Screen->PixelsPerInch;
}
5
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2013, 10:52

Как сделать плейлист в windows visual studio 2010, в формах?
Помогите пожалуйста, как сделать плейлист! Что нужно сделать? Плеер готов, музыка выбирается из...

Отключение элементов на формах через RadioButton
Доброго времени суток. Такая задача. Пишу программу с БД для курсовой - есть форма "Окно входа"...

Расположение элементов управления на web формах
Всем привет. Не могу понять это так задумано. Почему я не могу расположить элементы на web форме в...

Создание Windows-приложений
Всем доброго времени суток проблема с Delphi необходимо что бы кто то помог с решением задачи......

Создание Windows-приложений
Помогите пожалуйста :cry: Нужно создать меню с командами Input color, Change, Exit, Help. ...

Создание Windows приложений
Помогите пожалуйста сделать задание!( Общая часть задания:написать Windows-приложение, заголовок...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.