C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перерисовка.  (Прочитано 2754 раз)
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Перерисовка.
« : 11 Январь 2016, 13:01:47 »

Есть GroupBox. На нем имеются Label ы. Свойство Transparent  у них true. GroupBox по событию OnPaint формы заливается градиентной кистью вот так

Код:

bool GradientRect(HDC hDC, TRect &Rect, bool IsVertical, TColor Start, TColor End)
{
   TRIVERTEX vert[2];

   vert[0].x = Rect.Left;
   vert[0].y = Rect.Top;
   vert[0].Red   = GetRValue(Start)    vert[0].Green = GetGValue(Start)    vert[0].Blue  = GetBValue(Start)    vert[0].Alpha = 0;

   vert[1].x = Rect.Right;
   vert[1].y = Rect.Bottom;
   vert[1].Red   = GetRValue(End)    vert[1].Green = GetGValue(End)    vert[1].Blue  = GetBValue(End)    vert[1].Alpha = 10;

   GRADIENT_RECT gRect;
   gRect.UpperLeft = 0;
   gRect.LowerRight = 1;

   DWORD Direction = (IsVertical ?  GRADIENT_FILL_RECT_V : GRADIENT_FILL_RECT_H);

   return GradientFill(hDC, &vert[0], 2, &gRect, 1, Direction);
}



void __fastcall TMainForm::FormPaint(TObject *Sender)
{
       TRect Rect;
       Rect.Left=0;
       Rect.Top=0;
       Rect.Right=GroupBox4->Width;
       Rect.Bottom=GroupBox4->Height;
       TColor ColStart = clAqua;
       TColor ColEnd = clSkyBlue;
       GradientRect(GetDC(GroupBox4->Handle),Rect, true, ColStart,ColEnd);
   
}


В начале все хорошо но потом после перерисовки формы Labelы пропадают. (Например после перетаскивания формы за пределы монитора) Так же если до этого
 поменять свойство Caption у Labelов  (программно естественно в процессе выполнения приложения) то их цвет (именно цвет а не цвет шрифта) то этот цвет становится равным цвету у GroupBox. Как вообще построена перерисовка? А вот кнопка к примеру не исчезает при перерисовке. Можно ли это как то исправить? 
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Перерисовка.
« Ответ #1 : 11 Январь 2016, 14:16:51 »

Попробуй в FormPaint ручками сделать Repaint компонентам. Что из этого хорошего выйдет. А может из-за захваченного парента перерисовка дочерних компонент не вызывается.
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Перерисовка.
« Ответ #2 : 11 Январь 2016, 15:18:46 »

Так я делал
Код:
Label1->Invalidate();

но перерисовывать каждый компонент как то, скажем так, не по программистки. Тем более что цвет опять таки не совпадает с цветом фона в результате чего надпись оказывается в прямоугольнике а не сама по себе
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Перерисовка.
« Ответ #3 : 11 Январь 2016, 15:31:13 »

Хмм. действительно лажа выходит. Хотя косяков с цветом нет, просто коротко моргает фон под Label. После чего всё корректно.. если конечно написать
Код
Label1->Repaint();

а не
Код
Label1->Invalidate();
« Последнее редактирование: 11 Январь 2016, 15:48:29 от POV » Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Перерисовка.
« Ответ #4 : 11 Январь 2016, 15:54:23 »

Вот добавь в конце FormRepaint

Код
     for (int i = 0; i  GroupBox4->ControlCount; i++)
if (TLabel *c = dynamic_castTLabel*>(GroupBox4->Controls[i]))
c->Repaint();
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Перерисовка.
« Ответ #5 : 11 Январь 2016, 16:02:30 »

что repaint что invalidate - разницы не вижу. Код добавил. Во первых - исчезла надпись на GroupBox е   во вторых - все мелькает. В общем не так все просто
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Перерисовка.
« Ответ #6 : 11 Январь 2016, 16:05:39 »

У меня на форме еще есть PaintBox реагирующий на MouseMove. Так вот когда по нему мышкой водишь на GroupBoxе вообще мигать все начинает как на елке новогодней
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Перерисовка.
« Ответ #7 : 11 Январь 2016, 16:07:10 »

У меня при Invalidate  постоянно моргают надписи, при Repaint  - нет. Builder2007
А надпись верхняя пропала, да - как оно должно быть. Ты же при перерисовке захватил контекст и сам что-то там нарисовал. Не должно бы вообще быть надписи.

Если моргание в целом устроило бы, то можно в FormRepaint поставить в конце
Код
GroupBox4->Repaint();

Но двигать форму за пределы монитора становится совсем некрасиво.
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Перерисовка.
« Ответ #8 : 12 Январь 2016, 08:11:03 »

Я вот думаю можно ли OnPaint у GroupBox как то перехватить? И выполнять перерисовку при перерисовки именно GroupBox а не всей формы
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


« Ответ #9 : 12 Январь 2016, 08:18:08 »

Цитата: Sergey1985 от 12 Январь 2016, 08:11:03
Я вот думаю можно ли OnPaint у GroupBox как то перехватить? И выполнять перерисовку при перерисовки именно GroupBox а не всей формы

Об этом многие и я тоже тут спрашивали не раз. Резюме в плане наиболее адекватного пути - свой компонент. На базе например Tpanel чтобы он точно был контейнером. И уже в его Paint рисуй что хочешь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.104 секунд. Запросов: 20.