Вверх ↑
Разработчик
Ответов: 26170
Рейтинг: 2127
#1: 2008-04-02 11:28:38 ЛС | профиль | цитата
Galkov писал(а):
Ты у нас по рисованию - вот и давай...

Ага, вот я б еще ассемблер знал в совершенстве, тогда бы точно полез...
И, все равно, ты меня озадачил, надо будет лезть, не сегодня, так завтра -- точно...

------------ Дoбавленo:


Вот смотри, Кладов поменял реализацию DoubleBuffered в последенем KOL'e

Вот наш


//[procedure TControl.SetDoubleBuffered]
procedure TControl.SetDoubleBuffered(const Value: Boolean);
begin
if CannotDoubleBuf then Exit;
fDoubleBuffered := Value;
Global_OnBufferedDraw := WndProcBufferedDraw;
Global_Invalidate := @ InvalidateDblBufParent;
Global_DblBufCreateWnd := @ DblBufCreateWndProc;
end;

{$IFDEF ASM_VERSION}
//[procedure TControl.SetTransparent]
procedure TControl.SetTransparent(const Value: Boolean);
asm
CMP [EAX].fTransparent, DL
JZ @@exit
MOV [EAX].fTransparent, DL
TEST DL, DL
JZ @@exit
MOV ECX, [EAX].fParent
JECXZ @@exit
XCHG EAX, ECX
CALL SetDoubleBuffered
@@exit:
end;
{$ELSE ASM_VERSION} //Pascal
procedure TControl.SetTransparent(const Value: Boolean);
begin
if fTransparent = Value then Exit;
fTransparent := Value;
//ExStyle := ExStyle or WS_EX_TRANSPARENT;
if fParent = nil then Exit;
if Value then
fParent.DoubleBuffered := True;
end;
{$ENDIF ASM_VERSION}

А вот новый


//[procedure TControl.SetDoubleBuffered]
procedure TControl.SetDoubleBuffered(const Value: Boolean);
begin
if CannotDoubleBuf then Exit;
fDoubleBuffered := Value;
AttachProc(WndProcTransparent);
{$IFNDEF SMALLEST_CODE}
Global_AttachProcExtension := @TransparentAttachProcExtension;
{$ENDIF}
end;

//[procedure TControl.SetTransparent]
{$IFDEF ASM_VERSION}
{$ELSE ASM_VERSION} //Pascal
procedure TControl.SetTransparent(const Value: Boolean);
begin
fTransparent := Value;
if fParent = nil then Exit;

{$IFDEF GRAPHCTL_XPSTYLES}
if not AppTheming then
fClassicTransparent := Value;
{$ENDIF}

if Value then begin
AttachProc(WndProcTransparent);
fParent.DoubleBuffered := TRUE;
end;
end;
{$ENDIF ASM_VERSION}

------------ Дoбавленo:


Galkov, ты вообще этот глюк с прозрачностью рассматривал -- на что он влияет и как влияет

Вот маленький эксперимент с глюком, проявляется он у меня только на дочерних формах


Add(MainForm,12310116,105,105)
{
Left=20
Top=105
Color=32768
}
Add(Label,1547846,203,105)
{
Left=70
Top=65
Width=87
Height=41
Font=[MS Sans Serif,24,1,0,1]
Transparent=0
}
Add(Label,10179485,154,105)
{
Left=190
Top=130
Width=87
Height=41
Font=[MS Sans Serif,24,1,0,1]
Transparent=0
}
Add(ChildFormEx,7528158,154,154)
{
}
BEGIN_SDK
Add(EditMultiEx,2479969,21,21)
{
}
Add(MainForm,11508501,35,105)
{
Left=35
Top=105
}
END_SDK


Если убрать дочернюю, то глюк исчезает... странный глюк

И вот еще что, если поставить Control.Doublebuffered := true; в тот же Label, но выключить прозрачность, то глюка нет, а это значит, что это все относится только к Transparent и никак не относится к Doublebuffered


карма: 22

0