-
У кого под рукой есть D7 запостите пожалуйста приведенный выше метод. У меня сейчас только D2007 под рукой, что-то там борланд перемудрил там с двойной буферизацией имхо. Сравнить хочу.
-
homm © (20.11.07 13:09) [1]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;
Что не так? -
> Что не так?
еще не понял, но визуально выглядит так сдвиг координат что ли при заливке региона (во всех пред делфи глюк отсутствует, отсутствует и при выключении двойной буферизации).
http://dvmuratov.narod.ru/gluk.png -
Вот от В2007 код. Буду думать, глюк мой или борланда.
procedure TWinControl.WMPaint(var Message: TWMPaint);
var
DC, MemDC: HDC;
MemBitmap, OldBitmap: HBITMAP;
PS: TPaintStruct;
PaintBuffer: HPAINTBUFFER;
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
if DwmCompositionEnabled then
begin
DC := BeginPaint(Handle, PS);
try
PaintBuffer := BeginBufferedPaint(DC, PS.rcPaint, BPBF_COMPOSITED, nil, MemDC);
if PaintBuffer <> 0 then
try
Perform(WM_ERASEBKGND, MemDC, MemDC);
Perform(WM_PRINTCLIENT, MemDC, PRF_CLIENT);
if not (Self is TCustomForm) then
BufferedPaintMakeOpaque(PaintBuffer, @PS.rcPaint);
finally
EndBufferedPaint(PaintBuffer, True);
end;
finally
EndPaint(Handle, PS);
end;
end
else
begin
DC := BeginPaint(Handle, PS);
MemBitmap := CreateCompatibleBitmap(DC, PS.rcPaint.Right - PS.rcPaint.Left,
PS.rcPaint.Bottom - PS.rcPaint.Top);
try
MemDC := CreateCompatibleDC(DC);
OldBitmap := SelectObject(MemDC, MemBitmap);
try
SetWindowOrgEx(MemDC, PS.rcPaint.Left, PS.rcPaint.Top, nil);
Perform(WM_ERASEBKGND, MemDC, MemDC);
Message.DC := MemDC;
WMPaint(Message);
Message.DC := 0;
BitBlt(DC, PS.rcPaint.Left, PS.rcPaint.Top,
PS.rcPaint.Right - PS.rcPaint.Left,
PS.rcPaint.Bottom - PS.rcPaint.Top,
MemDC,
PS.rcPaint.Left, PS.rcPaint.Top,
SRCCOPY);
finally
SelectObject(MemDC, OldBitmap);
end;
finally
EndPaint(Handle, PS);
DeleteDC(MemDC);
DeleteObject(MemBitmap);
end;
end;
end;
end;