![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про csOpaque
Суслик © (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;