⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hgegui.pas

📁 完整的Delphi游戏开发控件
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    FCtrls := Ctrl;
    Ctrl.Prev := nil;
    Ctrl.Next := nil;
  end else begin
    while Assigned(Last.Next) do
      Last := Last.Next;
    Last.Next := Ctrl;
    Ctrl.Prev := Last;
    Ctrl.Next := nil;
  end;
end;

constructor THGEGUI.Create;
begin
  inherited Create;
  FHGE := HGECreate(HGE_VERSION);
  FNavMode := HGEGUI_NONAVKEYS;
end;

procedure THGEGUI.DelCtrl(const Id: Integer);
var
  Ctrl: IHGEGUIObject;
begin
  Ctrl := FCtrls;
  while Assigned(Ctrl) do begin
    if (Ctrl.Id = Id) then begin
      if Assigned(Ctrl.Prev) then
        Ctrl.Prev.Next := Ctrl.Next
      else
        FCtrls := Ctrl.Next;
      if Assigned(Ctrl.Next) then
        Ctrl.Next.Prev := Ctrl.Prev;
      Ctrl.Next := nil;
      Ctrl.Prev := nil;
      Exit;
    end;
    Ctrl := Ctrl.Next;
  end;
end;

destructor THGEGUI.Destroy;
var
  Ctrl, NextCtrl: IHGEGUIObject;
begin
  Ctrl := FCtrls;
  while Assigned(Ctrl) do begin
    NextCtrl := Ctrl.Next;
    Ctrl.Prev := nil;
    Ctrl.Next := nil;
    Ctrl := NextCtrl;
  end;
  FCtrls := nil;
  inherited;
end;

procedure THGEGUI.EnableCtrl(const Id: Integer; const Enabled: Boolean);
var
  Ctrl: IHGEGUIObject;
begin
  Ctrl := GetCtrl(Id);
  if Assigned(Ctrl) then
    Ctrl.Enabled := Enabled;
end;

procedure THGEGUI.Enter;
var
  Ctrl: IHGEGUIObject;
begin
  Ctrl := FCtrls;
  while Assigned(Ctrl) do begin
    Ctrl.Enter;
    Ctrl := Ctrl.Next;
  end;
  FEnterLeave := 2;
end;

function THGEGUI.GetCtrl(const Id: Integer): IHGEGUIObject;
begin
  Result := FCtrls;
  while Assigned(Result) do begin
    if (Result.Id = Id) then
      Exit;
    Result := Result.Next;
  end;
end;

function THGEGUI.GetFocus: Integer;
begin
  if Assigned(FCtrlFocus) then
    Result := FCtrlFocus.Id
  else
    Result := 0;
end;

procedure THGEGUI.Leave;
var
  Ctrl: IHGEGUIObject;
begin
  Ctrl := FCtrls;
  while Assigned(Ctrl) do begin
    Ctrl.Enter;
    Ctrl := Ctrl.Next;
  end;
  FCtrlFocus := nil;
  FCtrlOver := nil;
  FCtrlLock := nil;
  FEnterLeave := 1;
end;

procedure THGEGUI.Move(const DX, DY: Single);
var
  Ctrl: IHGEGUIObject;
  R: PHGERect;
begin
  Ctrl := FCtrls;
  while Assigned(Ctrl) do begin
    R := Ctrl.PRect;
    R.X1 := R.X1 + DX;
    R.Y1 := R.Y1 + DY;
    R.X2 := R.X2 + DX;
    R.Y2 := R.Y2 + DY;
    Ctrl := Ctrl.Next;
  end;
end;

procedure THGEGUI.MoveCtrl(const Id: Integer; const X, Y: Single);
var
  Ctrl: IHGEGUIObject;
  R: PHGERect;
begin
  Ctrl := GetCtrl(Id);
  if Assigned(Ctrl) then begin
    R := Ctrl.PRect;
    R.X2 := X + (R.X2 - R.X1);
    R.Y2 := Y + (R.Y2 - R.Y1);
    R.X1 := X;
    R.Y1 := Y;
  end;
end;

function THGEGUI.ProcessCtrl(const Ctrl: IHGEGUIObject): Boolean;
begin
  Result := False;
  if (not FLLastPressed) and (FLPressed) then begin
    FCtrlLock := Ctrl;
    SetFocus(Ctrl.Id);
    Result := Ctrl.MouseLButton(True) or Result;
  end;

  if (not FRLastPressed) and (FRPressed) then begin
    FCtrlLock := Ctrl;
    SetFocus(Ctrl.Id);
    Result := Ctrl.MouseRButton(True) or Result;
  end;

  if (FLLastPressed) and (not FLPressed) then
    Result := Ctrl.MouseLButton(False) or Result;

  if (FRLastPressed) and (not FRPressed) then
    Result := Ctrl.MouseRButton(False);

  if (FWheel <> 0) then
    Result := Ctrl.MouseWheel(FWheel) or Result;

  Result := Ctrl.MouseMove(FMX - Ctrl.PRect.X1,FMY - Ctrl.PRect.Y1) or Result;
end;

procedure THGEGUI.Render;
var
  Ctrl: IHGEGUIObject;
begin
  Ctrl := FCtrls;
  while Assigned(Ctrl) do begin
    if (Ctrl.Visible) then
      Ctrl.Render;
    Ctrl := Ctrl.Next;
  end;
  if (FHGE.Input_IsMouseOver) and Assigned(FCursor) then
    FCursor.Render(FMX,FMY);
end;

procedure THGEGUI.Reset;
var
  Ctrl: IHGEGUIObject;
begin
  Ctrl := FCtrls;
  while Assigned(Ctrl) do begin
    Ctrl.Reset;
    Ctrl := Ctrl.Next;
  end;
end;

procedure THGEGUI.SetColor(const Color: Longword);
var
  Ctrl: IHGEGUIObject;
begin
  Ctrl := FCtrls;
  while Assigned(Ctrl) do begin
    Ctrl.Color := Color;
    Ctrl := Ctrl.Next;
  end;
end;

procedure THGEGUI.SetCursor(const Spr: IHGESprite);
begin
  FCursor := Spr;
end;

procedure THGEGUI.SetFocus(const Id: Integer);
var
  CtrlNewFocus: IHGEGUIObject;
begin
  CtrlNewFocus := GetCtrl(id);
  if (CtrlNewFocus = FCtrlFocus) then
    Exit;
  if (CtrlNewFocus = nil) then begin
    if Assigned(FCtrlFocus) then
      FCtrlFocus.Focus(False);
    FCtrlFocus := nil;
  end else if (not CtrlNewFocus.IsStatic) and (CtrlNewFocus.Visible)
    and (CtrlNewFocus.Enabled)
  then begin
    if Assigned(FCtrlFocus) then
      FCtrlFocus.Focus(False);
    CtrlNewFocus.Focus(True);
    FCtrlFocus := CtrlNewFocus;
  end;
end;

procedure THGEGUI.SetNavMode(const Mode: Integer);
begin
  FNavMode := Mode;
end;

procedure THGEGUI.ShowCtrl(const Id: Integer; const Visible: Boolean);
var
  Ctrl: IHGEGUIObject;
begin
  Ctrl := GetCtrl(Id);
  if Assigned(Ctrl) then
    Ctrl.Visible := Visible;
end;

function THGEGUI.Update(const DT: Single): Integer;
var
  Done: Boolean;
  Key: Integer;
  Ctrl: IHGEGUIObject;
begin
  Result := 0;

// Update the mouse variables
  FHGE.Input_GetMousePos(FMX,FMY);
  FLLastPressed := FLPressed;
  FLPressed := FHGE.Input_GetKeyState(VK_LBUTTON);
  FRLastPressed := FRPressed;
  FRPressed := FHGE.Input_GetKeyState(VK_RBUTTON);
  FWheel := FHGE.Input_GetMouseWheel;


// Update all controls
  Ctrl := FCtrls;
  while Assigned(Ctrl) do begin
    Ctrl.Update(DT);
    Ctrl := Ctrl.Next;
  end;

// Handle Enter/Leave
  if (FEnterLeave <> 0) then begin
    Ctrl := FCtrls;
    Done := True;
    while Assigned(Ctrl) do begin
      if (not Ctrl.IsDone) then begin
        Done := False;
        Break;
      end;
      Ctrl := Ctrl.Next;
    end;
    if (not Done) then
      Exit
    else begin
      if (FEnterLeave = 1) then begin
        Result := -1;
        Exit;
      end else
        FEnterLeave := 0;
    end;
  end;

// Handle keys
  Key := FHGE.Input_GetKey;
  if ((((FNavMode and HGEGUI_LEFTRIGHT) <> 0) and (Key = HGEK_LEFT))
    or (((FNavMode and HGEGUI_UPDOWN) <> 0) and (Key = HGEK_UP)))
  then begin
    Ctrl := FCtrlFocus;
    if (Ctrl = nil) then begin
      Ctrl := FCtrls;
      if (Ctrl = nil) then
        Exit;
    end;

    repeat
      Ctrl := Ctrl.Prev;
      if (Ctrl = nil) and (((FNavMode and HGEGUI_CYCLED) <> 0) or (FCtrlFocus = nil)) then begin
        Ctrl := FCtrls;
        while Assigned(Ctrl.Next) do
          Ctrl := Ctrl.Next;
      end;
      if (Ctrl = nil) or (Ctrl = FCtrlFocus) then
        Break;
    until (not Ctrl.IsStatic) and (Ctrl.Visible) and (Ctrl.Enabled);

    if Assigned(Ctrl) and (Ctrl <> FCtrlFocus) then begin
      if Assigned(FCtrlFocus) then
        FCtrlFocus.Focus(False);
      Ctrl.Focus(True);
      FCtrlFocus := Ctrl;
    end;
  end else if ((((FNavMode and HGEGUI_LEFTRIGHT) <> 0) and (Key = HGEK_RIGHT))
    or (((FNavMode and HGEGUI_UPDOWN) <> 0) and (Key = HGEK_DOWN)))
  then begin
    Ctrl := FCtrlFocus;
    if (Ctrl = nil) then begin
      Ctrl := FCtrls;
      if (Ctrl = nil) then
        Exit;
      while Assigned(Ctrl.Next) do
        Ctrl := Ctrl.Next;
    end;

    repeat
      Ctrl := Ctrl.Next;
      if (Ctrl = nil) and (((FNavMode and HGEGUI_CYCLED) <> 0) or (FCtrlFocus = nil)) then
        Ctrl := FCtrls;
      if (Ctrl = nil) or (Ctrl = FCtrlFocus) then
        Break;
    until (not Ctrl.IsStatic) and (Ctrl.Visible) and (Ctrl.Enabled);

    if Assigned(Ctrl) and (Ctrl <> FCtrlFocus) then begin
      if Assigned(FCtrlFocus) then
        FCtrlFocus.Focus(False);
      Ctrl.Focus(True);
      FCtrlFocus := Ctrl;
    end;
  end else if Assigned(FCtrlFocus) and (Key <> 0) and (Key <> HGEK_LBUTTON)
    and (Key <> HGEK_RBUTTON)
  then begin
    if (FCtrlFocus.KeyClick(Key,FHGE.Input_GetChar)) then begin
      Result := FCtrlFocus.Id;
      Exit;
    end;
  end;

// Handle mouse
  if Assigned(FCtrlLock) then begin
    Ctrl := FCtrlLock;
    if (not FLPressed) and (not FRPressed) then
      FCtrlLock := nil;
    if (ProcessCtrl(Ctrl)) then begin
      Result := Ctrl.Id;
      Exit;
    end;
  end else begin
    // Find last (topmost) control
    Ctrl := FCtrls;
    if Assigned(Ctrl) then
      while Assigned(Ctrl.Next) do
        Ctrl := Ctrl.Next;

    while Assigned(Ctrl) do begin
      if (Ctrl.Enabled) and (Ctrl.PRect.TextPoint(FMX,FMY)) then begin
        if (FCtrlOver <> Ctrl) then begin
          if Assigned(FCtrlOver) then
            FCtrlOver.MouseOver(False);
          Ctrl.MouseOver(True);
          FCtrlOver := Ctrl;
        end;

        if (ProcessCtrl(Ctrl)) then
          Result := Ctrl.Id;
        Exit;
      end;
      Ctrl := Ctrl.Prev;
    end;

    if Assigned(FCtrlOver) then begin
      FCtrlOver.MouseOver(False);
      FCtrlOver := nil;
    end;
  end;
end;

initialization
  THGEGUIObject.FHGE := nil;
  THGEGUI.FHGE := nil;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -