Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

ToolBar и смена шрифта экрана.   Найти похожие ветки 

 
kaif ©   (2003-10-26 02:18) [0]

При смене шрифта экрана в Windows на крупный
Свойства экрана|Настройка|Дополнительно...
все кнопки и формы меняют размеры в соответствии с новым скейлингом.
Только компоненты ToolBar, если их свойство Align = alNone
остаются на старых координатах Left, Top и наползают на остальные управляющие элементы. Можно ли это как-то вылечить, не заменяя ToolBar другими компонентами?
Готов править исходники VCL. Если кто знает, где баг сидит, помогите, я в скейлингах никогда не разбирался и вообще путаюсь в таких вещах. Программа готова, а баг вылез только сейчас.


 
kaif ©   (2003-10-26 14:45) [1]

Неужели никто не сталкивался с этой проблемой?


 
mOOx_ ©   (2003-10-26 14:58) [2]

А это действительно на столько актуально, как тебе кажется? Стоит ли данный вопрос того, чтоб на него ответить и решить? Ты для себя ответь сначала на эти вопросы, а затем спрашивай.


 
Fenik ©   (2003-10-26 15:06) [3]

TToolButton наследник TGraphicControl, которому пофиг на такие сообщения винды. Можно попробовать переписать, компонент с учётом соответствующего сообщения винды. Но это геморр.. Лучше использовать другой компонент, либо вообще писать свой с нуля.


 
Fenik ©   (2003-10-26 15:09) [4]

У меня была такая проблема с обычной панелью, когда кнопки, изменив шрифт, уползали. Я просто сделал кнопки и панель побольше.


 
kaif ©   (2003-10-26 16:33) [5]

Fenik © (26.10.03 15:06) [3]
TToolButton наследник TGraphicControl, которому пофиг на такие сообщения винды.
Но сам-то ToolBar наследник TWinControl. Другие наследники, например, обычные TButton правильно меняют и размер и координаты при смене шрифта. А этот гад не меняет. Пусть кнопки останутся маленькие - хрен с ними. Но координата должна меняться. Иначе если кнопки TButton меняют координаты, а ToolBar - нет, то одно на другое наползает. Например, у меня имеется DBNavigator, а справа от него - ToolBar с Align = alNone. При смене шрифта DBNavigator уходит вправо вниз, а ToolBar остается на месте. Вся геометрия рушится.

mOOx_ © (26.10.03 14:58) [2]
А это действительно на столько актуально, как тебе кажется? Стоит ли данный вопрос того, чтоб на него ответить и решить? Ты для себя ответь сначала на эти вопросы, а затем спрашивай.


Я так и сделал, иначе бы не спросил.
Альтернатива следующая. Или я сейчас сажусь и ищу ошибку в исходниках VCL, или кто-то это уже сделал до меня и мне подскажет, возможно ли это вылечить в принципе и как приблизительно.
Я специалист по базам данных, а не по WinControls и их дебрям. Конечно, всякое самообразование полезно, но в данном случае у меня это связано с потерей времени, которое я мог бы употребить с большей пользой, особенно если кто-то из профессионалов VCL решение этой проблемы знает...

Ладно.
Я пошел искать ошибку в дебрях между TWinControl и TToolBar.
:(


 
Fenik ©   (2003-10-26 18:22) [6]

Ага, дошло в чем фишка. Советую просто изменить дизайн. Например, выровнять по правому краю это злополучную коробку инструментов.


 
kaif ©   (2003-10-26 18:48) [7]

Окунувшись в дебри VCL, выяснил следующее:

TWinControl имеет виртуальный метод ChangeScale(M, D: Integer);
Параметры M и D определяют соотношения в которых должно все "увеличиться".
Так вот этот сука TTollBar имеет переопределенный метод ChangeScale в виде заглушки:

procedure TToolBar.ChangeScale(M, D: Integer);
begin
{ Scaling isn"t a standard behavior for toolbars.
We prevent scaling from
occurring here. }
end;

Зачем они так сделали, нужно спросить у Borland.
В общем, я скопировал ComCtrls.pas себе в проект и изменил текст так:

procedure TToolBar.ChangeScale(M, D: Integer);
begin
{ Scaling isn"t a standard behavior for toolbars.
We prevent scaling from
occurring here. }
DisableAlign;
try
FButtonHeight := MulDiv(ButtonHeight, M, D);
FButtonWidth := MulDiv(ButtonWidth, M, D);
inherited ChangeScale(M, D);
finally
EnableAlign;
end;
end;

То есть мало того, что восстановил работу метода предка путем вызова через inherited, но и изменил в соответствии со скейлингом размеры кнопок.

Оттранслировал проект и теперь у меня все отлично работает.
Зная, что Comctrl32.dll вещь поганая, я проверил под:

Windows 98 SE
Windows 2000 SP2
Windows XP Personal.

Смена шрифта на всех системах теперь вызывает пропорциональное изменение всех окон и управляющих элементов, включая мои ToolBar без нарушения геометрии.

Вот!
А так мне пришлось бы переделывать весь проект и всю документацию к нему.
Конечно, в будущем я откажусь от ToolBar и перейду на какой-нибудь нормальный коммерческий компонент.
Но сейчас у меня не было другого выхода.


 
Fenik ©   (2003-10-26 20:08) [8]

Круто!


 
kaif ©   (2003-10-27 00:29) [9]

2 Fenik © (26.10.03 20:08) [8]
:)
Спасибо!


 
ChayNik   (2003-10-27 04:12) [10]

Попробуй просто проверять ширину компонентов и меняй Top, Left в соответствии с новыми значениями


 
Amoeba   (2003-10-27 10:41) [11]

Прочитай следующий материал:
http://cpr.biblio-globus.ru/small_font_defence.htm
Надеюсь, это поможет.


 
kaif ©   (2003-10-27 14:32) [12]

2 Amoeba (27.10.03 10:41) [11]
Очень любопытный компонент. Надо подумать.



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.026 c
1-41325
DNS
2003-10-31 04:30
2003.11.13
Эстетический вопрос!


1-41377
Aleksandr
2003-10-30 13:09
2003.11.13
Почему неправильно рисуется PageControl?


6-41868
BorH
2003-09-08 22:00
2003.11.13
АПИ и СОКЕТЫ


3-40838
Александр из Минска
2003-10-20 15:53
2003.11.13
Хотелось бы научиться


14-42082
BAPBAP
2003-10-22 18:15
2003.11.13
Почтовик и прокси