Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.036 c
1-41632
Matrex
2003-10-25 21:29
2003.11.13
RichEdit


1-41328
denis24
2003-10-30 17:56
2003.11.13
button в ячейке стрингрида


3-41080
NATALIk
2003-10-21 11:36
2003.11.13
Paradox, поля Currency


1-41721
Oleg_
2003-11-03 13:38
2003.11.13
рисунок в поток не передается


4-42243
mitur
2003-09-13 18:00
2003.11.13
Как вернуть в программу выделенный текст активного окна?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский