Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Вниз

Неправильная отрисовка фона панели, лежащей в ScrollBox (XP темы)   Найти похожие ветки 

 
Tack   (2006-12-10 22:46) [0]

На форме имеется PageControl, в нем на одном из TabSheet-ов лежит ScrollBox. В ScrollBox лежит большая Panel, которую ScrollBox прокручивает вверх-вниз.

При включенном стиле XP каждый TabSheet в фоне имеет приятный градиент по вертикали (от белого к сероватому). Тот же градиент отрисовывается и на ScrollBox, и на ее Panel, если у всех объектов свойство ParentBackground := True.

Это все выглядит замечательно, пока не начать прокручивать ScrollBox. Градиент панели после прокрутки ломается, и постепенно от всего градиента остается только два цвета, перемешанные на панели как придется.

Если кто-то сталкивался с такой проблемой, подскажите, как выйти из ситуации.


 
AndreyRu   (2006-12-11 16:02) [1]

Повесь InvalidateRect на событие прокрутки


 
Tack   (2006-12-11 16:34) [2]

Если прокрутка плавная (VertScrollBar.Tracking = True), то кошмарно моргает в процессе перерисовки. :-(

А можно ли как-то отключить XP-градиент TabSheet-а ?


 
AndreyRu   (2006-12-11 17:25) [3]

Можно отлавливать событие WM_ERASEBKGND, wParam которого есть HDC - Контекст устройства, только вот тебе тогда придется компонентик небольшой написать.

//Component

type
 TMeScrollBox = class(TScrollBox)
 private
   fColorBG : TColor;
   procedure SetCol(val : TColor);
 protected
   procedure ErsBg(var message : TWMERASEBKGND); message WM_ERASEBKGND;
 published
    property ColorBg : TColor read fColorBG write SetCol;
 end;
///-------------------------------------
procedure TMeScrollBox.ErsBg(var message : TWMERASEBKGND);
 var
   dc : HDC;
   hb : HBrush;
   r : TRect;
 begin
   dc := message.DC;
   hb := CreateSolidBrush(ColorToRgb(fColorBG));
   GetWindowRect(handle, r);
   FillRect(dc, r, hb);
   DeleteObject(hb);  
 end;
///-------------------------------------
procedure SetCol(val : TColor);
 begin
   if val = fColorBG then Exit;
   fColorBG := val;
   InvalidateRect(Handle, nil, true);  
 end;
///-------------------------------------

Инсталиш компонент и с XP должно работать.


 
Tack   (2006-12-11 17:44) [4]

спасибо, попробую



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

Форум: "Основная";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.038 c
11-1143445780
nester
2006-03-27 11:49
2007.02.04
[Error] Need imported data reference ($G) to access GUID_NULL


2-1168952409
KygECHuK
2007-01-16 16:00
2007.02.04
DLL


2-1168554549
Infinityx93
2007-01-12 01:29
2007.02.04
Динамический массив


3-1159957776
SDA
2006-10-04 14:29
2007.02.04
Ломается кодировка Delphi-MysQL!!!???


3-1162417414
Broyler
2006-11-02 00:43
2007.02.04
Собственный SQL monitor





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский