- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
if not DoubleBuffered then
begin
BufferDC := CreateCompatibleDC(DC);
// CreateCompatibleDC(DC) return 0 if Drawing takes place to MemDC(buffer):
// return <> 0 => need to double buffer || return = 0 => no need to double buffer
if BufferDC <> 0 then
begin
// Using the cache if possible
if FIsCachedBuffer or FIsFullSizeBuffer then
begin
// Create cache if need
if CacheBitmap = 0 then
begin
BufferBitMap := CreateCompatibleBitmap(DC, ClientWidth, ClientHeight);
// Assign to cache if need
if FIsCachedBuffer then
CacheBitmap := BufferBitMap;
end
else
BufferBitMap := CacheBitmap;
// Assign region for minimal overdraw
Region := CreateRectRgnIndirect(UpdateRect);//0, 0, UpdateRect.Width, UpdateRect.Height);
SelectClipRgn(BufferDC, Region);
end
else
// Create buffer
BufferBitMap := CreateCompatibleBitmap(DC, RectWidth(UpdateRect), RectHeight(UpdateRect));
// Select buffer bitmap
SelectObject(BufferDC, BufferBitMap);
// [change coord], if need
// Moving update region to the (0,0) point
if not(FIsCachedBuffer or FIsFullSizeBuffer) then
begin
GetViewportOrgEx(BufferDC, SaveViewport);
SetViewportOrgEx(BufferDC, -UpdateRect.Left + SaveViewport.X, -UpdateRect.Top + SaveViewport.Y, nil);
end;
end
else
BufferDC := DC;
end
else
BufferDC := DC;
//.......
Dr_Stertor 06.01.2017 22:20 # 0
@DoubleBuffered
Рисование происходит на виртуальной канве, затем вызывается BitBlt и переносит рисунок на оригинальный контекст. Вообще-то, запрет перерисовки делается отправкой контролу сообщения WM_SETREDRAW либо вызовом обертки(методы BeginUpdate/EndUpdate в классах TListItems, TStrings...).
guest 07.01.2017 21:30 # 0
WM_SETREDRAW - не панацея, http://www.transl-gunsmoker.ru/2011/02/unfortunate-effect-of-wmsetredraw.html
Предлагаю запустить пример "\Samples\BufferedChildrens" и посмотреть о какой проблеме мерцания речь.
1024-- 07.01.2017 21:37 # +1
guest 07.01.2017 21:43 # 0
huesto 08.01.2017 02:14 # +1
Похоже кто-то с премиум-аккаунтом перешел.
barop 08.01.2017 02:19 # +2
Когда я выросту, я тоже буду дельфистом
bormand 08.01.2017 20:52 # 0
CHayT 08.01.2017 21:10 # 0
bormand 08.01.2017 21:15 # 0
inkanus-gray 09.01.2017 14:34 # +5
А что, если ГК и есть премиум-версия Хабра?
defecate-plusplus 07.01.2017 21:40 # +3
> make delphi great again
я смотрю, тебя уже вдоволь накормили на хабре
хорошо, что ты пришел по адресу
добро пожаловать, друг
guest 07.01.2017 21:46 # 0
inkanus-gray 09.01.2017 14:37 # +3
barop 08.01.2017 01:50 # +3
Блин, я в свопливом турбопаскль-детстве писовал в памяти, а потом сливал ее в память видеокарты
Рисовал бы на другой странице, будь она у 13h.
Даблбуфр это же самый главный паттерн этих ваших гуев
bormand 08.01.2017 07:51 # +1
Во времена 3.1 таки память и такты экономили. А потом так и осталось.
З.Ы. А виста и выше сами не даблбуферят всё подряд случаем, когда аэро включено?
barop 08.01.2017 11:23 # +2
http://stackoverflow.com/questions/1840516/is-double-buffering-required-with-desktop-composition-enabled
3_14-pidar 09.01.2017 19:47 # −3
guest 10.01.2017 08:30 # +1
3-14dar 08.01.2017 12:29 # +4