Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.033 c