Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Подводные камни
  
О разделе

Список по категориям
Общий список

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
 
 19:50 Fox
 
 
Во Флориде и в Королевстве сейчас  19:53[Войти] | [Зарегистрироваться]

VCL.TCustomActionControl.Неправильный шрифт при отрисовке

Сергей Горбань
дата публикации 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. Из-за этого в последующих графических операциях используется "грязный" шрифт (оставшийся от других операций).


Типовые решения


  1. Обходной путь. В design-time изменить у проблемного TActionToolBar любое свойство шрифта (главное, чтобы оно не совпадало со свойствами "по-умолчанию", описанными в переменной DefFontData модуля Graphics.pas). В этом случае Assign отработает корректно.
  2. Внести изменения в 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 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Хостинг предоставлен компанией DOTNETPARK (ASP.NET, MS SQL hosting)  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования