Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизDoubleBuffered распространять, на определенный участок Найти похожие ветки
← →
DelphiLexx © (2006-08-28 16:49) [0]Как заставить DoubleBuffered Control"a действовать не на весь размер (Width и Height) этого контрола, а на определенную часть.
Мне это необходимо в связи с тем, что при больших размерах Width Height контрола (ну скажем 3000, 2000 соответственно) прорисовка начинает кушать немеренно ресурсы процессора, что ведет к торможению.
← →
Fay © (2006-08-28 16:58) [1]40-дюймовый монитор?
← →
DelphiLexx © (2006-08-28 17:02) [2]
> 40-дюймовый монитор?
У меня 17-ити дюймовый!
← →
oxffff © (2006-08-28 17:03) [3]Написать свою реализацию WMPaint(var Message: TWMPaint);
procedure TWinControl.WMPaint(var Message: TWMPaint);
← →
Fay © (2006-08-28 17:04) [4]2 oxffff © (28.08.06 17:03) [3]
А мне вот не очевидно, что целевой control - потомок TWinControl
← →
oxffff © (2006-08-28 17:06) [5]А зачем такой размер?
← →
oxffff © (2006-08-28 17:07) [6]Почему же есть DoubleBuffered, height, width.
:)
← →
OSokin © (2006-08-28 17:22) [7]Самому реализовывать даблбуфферность
← →
DelphiLexx © (2006-08-28 17:24) [8]
> Почему же есть DoubleBuffered, height, width.
> :)
В смысле "DoubleBuffered, height, width." не совсем понял твой ответ.
← →
oxffff © (2006-08-28 20:08) [9]2 fay
> Почему же есть DoubleBuffered, height, width.
> :)
> В смысле "DoubleBuffered, height, width." не совсем понял твой ответ.
← →
Fay © (2006-08-28 21:25) [10]2 oxffff © (28.08.06 20:08) [9]
> не совсем понял твой ответ
Такая же фигня
← →
oxffff © (2006-08-29 12:10) [11]Fay wrote
> 2 oxffff © (28.08.06 17:03) [3]
>А мне вот не очевидно, что целевой control - потомок TWinControl
oxffff answered
Почему же есть DoubleBuffered, height, width.
to DelphiLexx
procedure TWinControl.WMPaint(var Message: TWMPaint);
var
DC, MemDC: HDC;
MemBitmap, OldBitmap: HBITMAP;
PS: TPaintStruct;
begin
if not FDoubleBuffered or (Message.DC <> 0) then
begin
if not (csCustomPaint in ControlState) and (ControlCount = 0) then
inherited
else
PaintHandler(Message);
end
else
begin
DC := GetDC(0);
/////////////////////////////////////////////////////////////////////////
!!! Здесь нужно поправить область
///
MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
ReleaseDC(0, DC);
MemDC := CreateCompatibleDC(0);
OldBitmap := SelectObject(MemDC, MemBitmap);
try
DC := BeginPaint(Handle, PS);
Perform(WM_ERASEBKGND, MemDC, MemDC);
Message.DC := MemDC;
WMPaint(Message);
Message.DC := 0;
BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
EndPaint(Handle, PS);
finally
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
DeleteObject(MemBitmap);
end;
end;
end;
← →
oxffff © (2006-08-29 12:11) [12]А если это не потомок TwinConrol.
Тогда написать аналогично.
← →
oxffff © (2006-08-29 12:18) [13]Естественно не править TWinControl.WMPaint(var Message: TWMPaint);
А переопределить в своем классе.
Аля
MyClass=class(..)
private
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
end;
← →
Fay © (2006-08-29 15:28) [14]На самом деле, для меня было открытием, что все контролы могут получать сообщение. Приплыли называется 8)
← →
oxffff © (2006-08-29 18:25) [15]2 fay
> На самом деле, для меня было открытием, что все контролы могут
> получать сообщение. Приплыли называется 8)
Не понял тебя
← →
oxffff © (2006-08-29 18:33) [16]2 fay
Так у ТObject.Dispatch на что.
А у TControl WndProc и вызывает Dispatch.
← →
Fay © (2006-08-30 02:25) [17]2 oxffff © (29.08.06 18:33) [16]
Я действительно не знал, о чём и сказал.
Страницы: 1 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.045 c