• ug © (02.07.08 17:01) [0]
    Помогите со спрайтами
    У меня графика работает нормально, но когда я поверх своего приложения
    открываю другое, то графика начинает отбражаться на фоне, взятом из
    другого приложения. Например, открываю блокнот, фон становится белым.
    Что делать?

    Вот исходный код:

    procedure TBoard.AnimMove(Num: Integer; XSt, YSt, XFin, YFin: Integer);
    { Performes animated transition from the cell with (XSt, YSt)
    coordinates to
     the cell with (XFin, YFin) coordinates }
    var CellRect: TRect;
       X_Sc, X_Sc_St, X_Sc_Fin, Y_Sc, Y_Sc_St, Y_Sc_Fin, XYStep: Integer;
       {$IFDEF Step3} MemBitmap: TBitmap; {$ENDIF}

       NewColor: TColor;

     procedure DrawAnimBitmap;
     { Draws the image }
     var dc: HDC;
     begin
     {$IFDEF Step3}

           dc:=GetDc(0);
           if (not (CellBitmap.Canvas.Handle=dc)) then
           begin
      BitBlt(CellBitmap.Canvas.Handle, 0, 0, CellSide, CellSide,
         MemBitmap.Canvas.Handle, CellRect.Left, CellRect.Top, SRCCOPY);
     // DrawGrid;
       CellBitmap.Canvas.Brush.Color := NewColor; // Pattern
       // Pattern^Destination

       { BitBlt(CellBitmap.Canvas.Handle, 0, 0, CellSide, CellSide,
         Frm_Knight.Pbx_ChessBoard.Canvas.Handle, 0, 0, PATINVERT); }
            BitBlt(CellBitmap.Canvas.Handle, 0, 0, CellSide, CellSide,
             CellBitmap.Canvas.Handle , 0, 0, PATINVERT);

       // Source&Destination
       BitBlt(CellBitmap.Canvas.Handle, 0, 0, CellSide, CellSide,
         KnightBitmap.Canvas.Handle, 0, 0, SRCAND);
       // Pattern^Destination
       BitBlt(CellBitmap.Canvas.Handle, 0, 0, CellSide, CellSide,
         CellBitmap.Canvas.Handle, 0, 0, PATINVERT);

       BitBlt(Frm_Knight.Pbx_ChessBoard.Canvas.Handle, CellRect.Left,
    CellRect.Top,
         CellSide-3, CellSide-3, CellBitmap.Canvas.Handle,
         0, 0, SRCCOPY);

       end;
         // SetBkColor(CellBitmap.Canvas.Handle, color);

     {$ELSE}
       //Board.BoardPaint;

       CellBitmap.LoadFromFile('Knight2.bmp');
       CellBitmap.Monochrome := True;
       CellBitmap.Canvas.Brush.Color := NewColor;
       CellBitmap.Transparent := True;
      { CellBitmap.Canvas.FloodFill(CellBitmap.Width div 2,
    CellBitmap.Height div 2,
         clBlack, fsSurface); }
    // Frm_Knight.Pbx_ChessBoard.Canvas.StretchDraw(CellRect,
    CellBitmap);
     {$ENDIF}
     end;

    begin
     NewColor := GetCellColor(Num);
     if CellSide < 70 then XYStep := 1 else XYStep := 2;

     {$IFDEF Step3}
     MemBitmap := TBitmap.Create;
     MemBitmap.Height := Frm_Knight.Pbx_ChessBoard.Height;
     MemBitmap.Width := Frm_Knight.Pbx_ChessBoard.Width;

     BitBlt(MemBitmap.Canvas.Handle, 0, 0, Frm_Knight.Pbx_ChessBoard.Width,
       Frm_Knight.Pbx_ChessBoard.Height,
    Frm_Knight.Pbx_ChessBoard.Canvas.handle
       , 0, 0, SRCCOPY);

     {$ENDIF}

     X_Sc_St := (XSt-1)*CellSide + 2;
     X_Sc_Fin := (XFin-1)*CellSide + 2;

     Y_Sc_St := (YSt-1)*CellSide + 2;
     Y_Sc_Fin := (YFin-1)*CellSide + 2;

     { Horizontal movement }
     X_Sc := X_Sc_St;
     while True do
     begin
       CellRect := Rect(X_Sc, Y_Sc_St, X_Sc + CellSide-3, Y_Sc_St +
    CellSide-3);

       DrawAnimBitmap;
       Delay(2*((Frm_Knight.Tbr_Playspeed.Max+1)-Frm_Knight.Tbr_Playspeed.Position));
       if X_Sc = X_Sc_Fin then break;
       if X_Sc_Fin > X_Sc_St then
       begin
         Inc(X_Sc, XYStep);
         if X_Sc_Fin < X_Sc then X_Sc := X_Sc_Fin;
       end
       else
       begin
         Dec(X_Sc, XYStep);
         if X_Sc_Fin > X_Sc then X_Sc := X_Sc_Fin;
       end;
       Application.ProcessMessages;
     end;

     { Vertical movement }
     Y_Sc := Y_Sc_St;
     while True do
     begin
       CellRect := Rect(X_Sc_Fin, Y_Sc, X_Sc_Fin + CellSide-3, Y_Sc +
    CellSide-3);
       DrawAnimBitmap;

       Delay(2*((Frm_Knight.Tbr_Playspeed.Max+1)-Frm_Knight.Tbr_Playspeed.Position));
       if Y_Sc = Y_Sc_Fin then break;
       if Y_Sc_Fin > Y_Sc_St then
       begin
         Inc(Y_Sc, XYStep);
         if Y_Sc_Fin < Y_Sc then Y_Sc := Y_Sc_Fin;
       end
       else
       begin
         Dec(Y_Sc, XYStep);
         if Y_Sc_Fin > Y_Sc then Y_Sc := Y_Sc_Fin;
       end;
       Application.ProcessMessages;
     end;

     {$IFDEF Step3}
    { BitBlt(Frm_Knight.Pbx_ChessBoard.Canvas.Handle, 0, 0,
       Frm_Knight.Pbx_ChessBoard.Width, Frm_Knight.Pbx_ChessBoard.Height,
       MemBitmap.Canvas.Handle, 0, 0, SRCCOPY);
     MemBitmap.Free; }
     {$ENDIF}
    end;
  • @!!ex © (02.07.08 18:34) [1]
    Так рисуй не на DC десктопа, а на DC своего окна. нафига на десктопе рисовать?
  • ug © (02.07.08 19:07) [2]
    не понял, я вроде рисую на  DC битмапа?
  • Elec3C © (03.07.08 16:24) [3]

    > не понял, я вроде рисую на  DC битмапа?

    А это что:

    > dc:=GetDc(0);
  • @!!ex © (03.07.08 19:19) [4]
    > [3] Elec3C ©   (03.07.08 16:24)

    это глупость от старой реализации. :)
    Мне уже в личку объяснили.
    Непонятно только зачем такую кашу на форум выкладывать.
Есть новые Нет новых   [134430   +2][b:0][p:0]