Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про csOpaque


Страницы:   1 2

Суслик ©   (2005-09-27 20:02:00) 

Добрый день.

Никак не могу понять, как работает csOpaque.
1. Создаю кнопку
2. Создаю TWinControl, у которого ControlStyle := ControlStyle - [csOpaque]. При этом этот TWinControl "лежит" НАД кнопкой.

Почему не видна кнопка? Вроде должна...


Игорь Шевченко   (2005-09-28 10:07:00) [21]


> 1. Есть потомок TWinControl
> 2. В стилях контрола НЕТ csOpaque
> 3. На контроле ничего не лежит.
> Почему под контролом ничего не видно (т.е. не видны другие
> контролы, например TButton, лежищие под моим контролом)?
>


Перекрой WMEraseBkgnd и не делай там ничего


Суслик   (2005-09-28 09:51:00) [22]

В своем предположении, что:
1 Посылает wm_erasebkgnd BeginPaint
2 Управляет необходимость посылки этого сообщения InvalidateRect
я был вроде прав.

Тогда вопрос.
1. Есть потомок TWinControl
2. В стилях контрола НЕТcsOpaque
3. На контроле ничего не лежит.
Почемупод контролом ничего не видно (т.е. не видны другие контролы, например TButton, лежищие под моим контролом)?


Суслик   (2005-09-28 09:35:00) [23]


> Значит, обязаннарисовать всю свою клиентскую


Вот я примерно так и думал. Только найти в коде controls.pas не могу.

Насколько я понимаю указанный тобой факт (т.е. что не посылвается wv_erasebkgnd) реализуется в TControl.InvalidateControl и далее в InvalidateRect (в 3ем параметре).

Собственно вопрос родиля потому, что:
1. Я задавал вопрос http://www.delphimaster.ru/cgi-bin/forum.pl?id=1127738263&n=0
2. В ответе [3] Леонид Трояновский сказал, что нужен csOpaque.
3. Я пытаюсь понять на что он влияет, т.к. что без csOpaque, что c csOpaque я не вижу разницы.

Т.е. как бы увидеть разницу в поведении потомков TWinControlc csOpaque и без него?


Игорь Шевченко   (2005-09-27 21:52:00) [24]

csOpaque определяет, будет ли ему посылаться сообщение WM_ERASEBKGND.

Opaque - непрозрачный. Значит, обязан нарисовать всю свою клиентскую область, а не заставлять родителя рисовать ее.


Суслик   (2005-09-27 20:38:00) [25]

Причем здесь кнопка?

Ее же вообще не видно...

Да... надо будет поизучать controls.pas.


umbra   (2005-09-27 20:36:00) [26]

по-моему, отличие в степени запонения на глаз не отличишь. вот если убрать csOpaque у кнопки, она на вид изменится хоть чуть-чуть?


Суслик   (2005-09-27 20:29:00) [27]

Знаю я эту строку из хелпа.
Но я же отключаю csOpaque. По идее, согласно же хелпу, контрол НЕ полностью заполняет свой прямоугольник.

Вот как раз этого эффекта, т.е. неполного заполнения прямоугольника, в моем примере и не видно.

В этом собственно и вопрос - почему?


umbra   (2005-09-27 20:26:00) [28]

для прозрачности достаточто Visible := false


umbra   (2005-09-27 20:25:00) [29]

с прозрачносью это не имеет ничего общего. Это преведенная строка из хелпа


csOpaque - контрол полностью заполняет свой клиентский прямоугольник.


Суслик   (2005-09-27 20:20:00) [30]

У меня есть подозрение, что я вообще неверно понимаю csOpaque...


Суслик   (2005-09-27 20:18:00) [31]


> Не стоит изменять ControlStyle во время віполнения, разве
> что в конструкторе. Текущие характеристики содержатся в
> свойстве ControlState.

в данном примере это не важно

все равно тоже самое...

type
  twincontrol2 = class(twincontrol)
     constructor create(o: tcomponent); override;
  end;

constructor twincontrol2.create;
begin
  inherited;
  controlstyle := controlstyle - [csopaque];
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  kf: tform;
  kb: tbutton;
  kc: twincontrol2;
begin
  kf := tform.createnew(application);

  kb := tbutton.create(kf);
  kb.parent := kf;
  kb.left := 10;
  kb.top := 10;

  kc := twincontrol2.create(kf);
  kc.parent := kf;
  kc.left := 5;
  kc.top := 5;
  kc.width := 100;
  kc.height := 100;

  kf.show();
end;


umbra   (2005-09-27 20:12:00) [32]

так контрол заслоняет

csOpaque контрол полностью заполняет своой клиентский прямоугольник.


Если csOpaque убрать, то будет заполнять не полностью, но как-то ж будет. И


Не стоит изменять ControlStyle во время віполнения, разве что в конструкторе. Текущие характеристики содержатся в свойстве ControlState.


Суслик   (2005-09-27 20:08:00) [33]

Example

var
  kf: tform;
  kb: tbutton;
  kc: twincontrol;
begin
  kf := tform.createnew(application);

  kb := tbutton.create(kf);
  kb.parent := kf;
  kb.left := 10;
  kb.top := 10;

  kc := twincontrol.create(kf);
  kc.parent := kf;
  kc.controlstyle := kc.controlstyle - [csopaque];
  kc.left := 5;
  kc.top := 5;
  kc.width := 100;
  kc.height := 100;

  kf.show();
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо