Конференция "Основная" » TWinControl.WMPaint от Delphi7 запостите пожалуйста. [WinXP]
 
  • DVM © (20.11.07 13:05) [0]
    У кого под рукой есть 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;



    Что не так?
  • DVM © (20.11.07 13:16) [2]

    > Что не так?

    еще не понял, но визуально выглядит так сдвиг координат что ли при заливке региона (во всех пред делфи глюк отсутствует, отсутствует и при выключении двойной буферизации).

    http://dvmuratov.narod.ru/gluk.png
  • DVM © (20.11.07 13:18) [3]
    Вот от В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;

 
Конференция "Основная" » TWinControl.WMPaint от Delphi7 запостите пожалуйста. [WinXP]
Есть новые Нет новых   [134479   +8][b:0][p:0.002]