{Notation:
  _s     : String
  _i     : Integer
  _x     : Extended
         mf: TBMetaFile
         f: TFigur
         c: TCanvas
}

unit spielgraph;

interface
uses forms,graphics,classes,sysutils,metafile,controls,windows,AbstractSpielVar;
type
  TFigur=(fLeer,fBelagerer,fGetreuer,fKoenig,fThron,fKoenigThron); //Mögliche Figurtypen
  TFigurenBilder=class
    belagerer_xmf:TBMetafile;
    getreuer_xmf:TBMetafile;
    koenig_xmf:TBMetafile;
    koenigthron_xmf:TBMetafile;
    thron_xmf:TBMetafile;
    constructor Create(pfad_s:string);
    destructor Destroy;override;
    procedure DrawToCanvasEx(figur_xf:TFigur;ziel_xc:TCanvas;x_i,y_i,width_i,height_i,helligkeit_i:integer);
  end;

  TSpielHint=class(THintWindow)
   private
    drawPosX_i,drawPosY_i:integer;
   public
    procedure ActivateHint(Rect: TRect; const AHint: string);override;
    procedure Paint;override;
    procedure CreateParams(var Params: TCreateParams);override;
  end;
  TSpielHintClass=class of TSpielHint;
implementation
procedure TSpielHint.ActivateHint;
var rgn:HRGN;
    rgn2:HRGN;
    mousePos_xp:TPoint;
    points_ap:array[0..2] of TPoint;
begin
  inherited;
  GetCursorPos(mousePos_xp);
  width:=width+50;
  height:=height+30;
  if mousePos_xp.x<left then begin
    width:=width-mousePos_xp.x+left; //Rechte Seite nicht verschieben
    drawPosX_i:=-mousePos_xp.x+left+40;//Textausgabeposition verschieben
    Left:=mousePos_xp.x; //Linke Seite verschieben
  end else drawPosX_i:=40; //drawPosX_i auf jeden Fall setzten
  if mousePos_xp.y<top then begin
    height:=height-mousePos_xp.y+top; //Unterer Seite nicht verschieben
    drawPosY_i:=-mousePos_xp.y+top+20;//Textausgabeposition verschieben
    top:=mousePos_xp.y; //Obere Seite verschieben
  end else drawPosY_i:=20; //drawPosY_i auf jeden Fall setzten;
  points_ap[0]:=Point(mousePos_xp.x-left,mousePos_xp.y-top);
  points_ap[1]:=Point(width div 2,height div 3);
  points_ap[2]:=Point(width div 4,height div 2);
  rgn:=CreateEllipticRgn(10,10,width,height);
  rgn2:=CreatePolygonRgn(points_ap,3,WINDING);
  CombineRgn(rgn,rgn,rgn2,RGN_OR);
  SetWindowRgn(handle,rgn,true);
end;
procedure TSpielHint.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style and not WS_BORDER;
end;
procedure TSpielHint.Paint;
var
  R: TRect;
begin
  R := ClientRect;
  R.Left:=drawPosX_i;
  R.top:=drawPosY_i;
  Canvas.Font.Color := clInfoText;
  DrawText(Canvas.Handle, PChar(Caption), -1, R, DT_LEFT or DT_NOPREFIX or
    DT_WORDBREAK);
end;

constructor TFigurenBilder.Create(pfad_s:string);
begin
  if pfad_s[length(pfad_s)]<>'\' then pfad_s:=pfad_s+'\';
  belagerer_xmf:=TBMetafile.Create;
  belagerer_xmf.LoadFromFile(pfad_s+'belagerer.bvf');
  getreuer_xmf:=TBMetafile.Create;
  getreuer_xmf.LoadFromFile(pfad_s+'getreuer.bvf');
  koenig_xmf:=TBMetafile.Create;
  koenig_xmf.LoadFromFile(pfad_s+'koenig.bvf');
  koenigthron_xmf:=TBMetafile.Create;
  koenigthron_xmf.LoadFromFile(pfad_s+'thronkoenig.bvf');
  thron_xmf:=TBMetafile.Create;
  thron_xmf.LoadFromFile(pfad_s+'thron.bvf');
end;
destructor TFigurenBilder.Destroy;
begin
  belagerer_xmf.free;
  getreuer_xmf.free;
  koenig_xmf.free;
  koenigthron_xmf.free;
  thron_xmf.Free;
end;
procedure TFigurenBilder.DrawToCanvasEx(figur_xf:TFigur;ziel_xc:TCanvas;x_i,y_i,width_i,height_i,helligkeit_i:integer);
begin
  ziel_xc.CopyMode:=cmSrcCopy;
  if figur_xf=fleer then exit;
  case figur_xf of //Jeweiligen Figuren Typ zeichnen
    fBelagerer:belagerer_xmf.DrawEx(ziel_xc,x_i,y_i,width_i,height_i,helligkeit_i);
    fGetreuer:getreuer_xmf.DrawEx(ziel_xc,x_i,y_i,width_i,height_i,helligkeit_i);
    fKoenig:koenig_xmf.DrawEx(ziel_xc,x_i,y_i,width_i,height_i,helligkeit_i);
    fThron:thron_xmf.DrawEx(ziel_xc,x_i,y_i,width_i,height_i,helligkeit_i);
    fKoenigThron:koenigthron_xmf.DrawEx(ziel_xc,x_i,y_i,width_i,height_i,helligkeit_i);
  end;
  exit;
end;

end.
