-
Помогите со спрайтами У меня графика работает нормально, но когда я поверх своего приложения открываю другое, то графика начинает отбражаться на фоне, взятом из другого приложения. Например, открываю блокнот, фон становится белым. Что делать?
Вот исходный код:
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;
-
Так рисуй не на DC десктопа, а на DC своего окна. нафига на десктопе рисовать?
-
не понял, я вроде рисую на DC битмапа?
-
> не понял, я вроде рисую на DC битмапа?
А это что:
> dc:=GetDc(0);
-
> [3] Elec3C © (03.07.08 16:24)
это глупость от старой реализации. :) Мне уже в личку объяснили. Непонятно только зачем такую кашу на форум выкладывать.
|