Сергей Горбань дата публикации 26-12-2005 06:53 | КАТЕГОРИЯ | | БИБЛИОТЕКА.VCL.TCustomActionControl.Неправильный шрифт при отрисовке | | ПРОДУКТ | | Delphi 7 | | ПЛАТФОРМА | | Windows XP |
Если положить TActionToolBar в какой-либо контейнер (TPanel, TGroupBox и т.п., когда Parent <> форма), то добавление в программу компонента TXPManifest (или непосредственно ресурса WindowsXP.res) приводит к ошибкам отрисовки TActionToolBar.
Проверено в Delphi 7 в WinXP SP2 и Windows Server 2003 SP1
Проявляется только при включенных "темах"!
Причина вот в этом куске модуля ActnMan.pas (строки 4981-4984, комменатарий оригинальный, борландовский):
procedure TCustomActionControl.Paint;
..................
// Hack: Themes delete the font so it must be reassigned
// Occurs when there is a gradient background on the ActionBand
if ThemeServices.ThemesEnabled then
Canvas.Font.Assign(Self.Font);
..................
Видно, что здесь уже делали патч. Но он не работает, так как в методе TResourceManager.AssignResource, реализующем копирование ресурсов шрифта (вызывается из TFont.Assign), стоит проверка на совпадение ресурсов, и если они совпадают, то фактическое копирование не производится, а главное, не вызывается GraphicsObject.Changed, который должен сбросить флаг csFontValid в TCanvas.FontChanged. Из-за этого в последующих графических операциях используется "грязный" шрифт (оставшийся от других операций).
- Обходной путь. В design-time изменить у проблемного TActionToolBar любое свойство шрифта (главное, чтобы оно не совпадало со свойствами "по-умолчанию", описанными в переменной DefFontData модуля Graphics.pas).
В этом случае Assign отработает корректно.
- Внести изменения в ActnMan.pas, устраняющие проблему. Например, вот так:
procedure TCustomActionControl.Paint;
..................
// Hack: Themes delete the font so it must be reassigned
// Occurs when there is a gradient background on the ActionBand
If ThemeServices.ThemesEnabled then
begin
Canvas.Font.Assign(Self.Font);
//Fox: Здесь был косяк Борланда, Canvas.Font.Assign(Self.Font)
//НЕ вызывает TCanvas.FontChanged при одинаковых параметрах
//исходного и нового шрифта (см. TResourceManager.AssignResource),
//со всеми вытекающими...
//Лечение простое. Вызываем OnChange сами...
Canvas.Font.OnChange(Canvas.Font);
end;
Скачать пример:StoneTest_91.zip
[Интерфейс. Компоненты и формы] [WinXP]
Обсуждение материала [ 13-08-2006 12:55 ] 6 сообщений |