AD商业广告自由选择
AD商业广告自由选择

GOM引擎源码RunGate窗口内嵌部分源码解析

正文概述 开源人   2025-10-25 03:40:59  
procedure TfrmMain.CheckBox27Click(Sender: TObject);
var
  I: Integer;
begin
  if CheckBox27.Checked then
  begin
    for I := 0 to Length(RunGate) - 1 do
    begin
      if RunGate[I].boGetStart and (RunGate[I].btStartStatus = 2) then
      begin
        Windows.SetParent(RunGate[I].MainFormHandle, 0);
      end;
    end;
  end
  else
  begin
    for I := 0 to Length(RunGate) - 1 do
    begin
      if RunGate[I].boGetStart and (RunGate[I].btStartStatus = 2) then
      begin
        Windows.SetParent(RunGate[I].MainFormHandle, ScrollBoxPanel.Handle);
        Windows.GetWindowRect(RunGate[I].MainFormHandle, hRect);
        Windows.MoveWindow(RunGate[I].MainFormHandle, 0, 0, hRect.Right - hRect.Left, hRect.Bottom - hRect.Top, True); //设置窗口位置
        ShowWindow(RunGate[I].MainFormHandle, SW_HIDE);
        ShowWindow(RunGate[I].MainFormHandle, SW_MINIMIZE); //最小化
        ShowWindow(RunGate[I].MainFormHandle, SW_SHOW);
      end;
    end;
  end;
end;
procedure TfrmMain.ProcessLogServerMsg(wIdent: Word; sData: string);
var
  nHandle: THandle;
  hRect: TRect;
begin
  case wIdent of
    SG_FORMHANDLE: begin
        nHandle := Str_ToInt(sData, 0);
        if nHandle <> 0 then begin
          LogServer.MainFormHandle := nHandle;
          //        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);
        end;
      end;

    SG_STARTNOW: begin
        MainOutMessage(sData);
      end;

    SG_STARTOK: begin
        LogServer.btStartStatus := 2;
        MainOutMessage(sData);

        // 可选:将子窗口嵌入到 ScrollBoxPanel(仅在界面勾选时执行)
        if CheckBoxWindosInto.Checked then
        begin
          if Windows.SetParent(LogServer.MainFormHandle, ScrollBoxPanel.Handle) = 0 then
          begin
            Application.ProcessMessages;
            Sleep(10);
          end
          else
          begin
            Windows.GetWindowRect(LogServer.MainFormHandle, hRect);
            Windows.MoveWindow(
              LogServer.MainFormHandle,
              0,
              0,
              hRect.Right - hRect.Left,
              hRect.Bottom - hRect.Top,
              True);
            ShowWindow(LogServer.MainFormHandle, SW_HIDE);
            ShowWindow(LogServer.MainFormHandle, SW_MINIMIZE);
            ShowWindow(LogServer.MainFormHandle, SW_SHOW);
          end;
        end;

        // 保留最小化逻辑
        if LogServer.boMinimize then
          SendMessage(LogServer.MainFormHandle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
      end;
  end;
end;
 
procedure TfrmMain.ProcessRunGateMsg(wIdent: Word; sData: string);
var
  I: Integer;
  nHandle: THandle;
  hRect: TRect;
begin
  case wIdent of
    SG_FORMHANDLE:
    begin
      nHandle := Str_ToInt(sData, 0);
      if g_boRunGate_GetMultiThread then
      begin
        if nHandle <> 0 then
        begin
          RunGate[0].MainFormHandle := nHandle;
        end;
      end
      else
      begin
        for I := Low(RunGate) to High(RunGate) do
        begin
          if RunGate[I].boGetStart and (RunGate[I].MainFormHandle = 0) then
          begin
            RunGate[I].MainFormHandle := nHandle;
            Break;
          end;
        end;
      end;
    end;

    SG_STARTNOW:
    begin
      if g_boRunGate_GetMultiThread then
        MainOutMessage(sData)
      else
      begin
        nHandle := Str_ToInt(sData, 0);
        for I := Low(RunGate) to High(RunGate) do
        begin
          if RunGate[I].MainFormHandle = nHandle then
          begin
            case I of
              0: MainOutMessage('正在启动游戏网关一...');
              1: MainOutMessage('正在启动游戏网关二...');
              2: MainOutMessage('正在启动游戏网关三...');
              3: MainOutMessage('正在启动游戏网关四...');
              4: MainOutMessage('正在启动游戏网关五...');
              5: MainOutMessage('正在启动游戏网关六...');
              6: MainOutMessage('正在启动游戏网关七...');
              7: MainOutMessage('正在启动游戏网关八...');
            end;
            Break;
          end;
        end;
      end;
    end;

    SG_STARTOK:
    begin
      if g_boRunGate_GetMultiThread then
      begin
        RunGate[0].btStartStatus := 2;
        MainOutMessage(sData);

        if CheckBoxWindosInto.Checked then
        begin
          if Windows.SetParent(RunGate[0].MainFormHandle, ScrollBoxPanel.Handle) <> 0 then
          begin
            Windows.GetWindowRect(RunGate[0].MainFormHandle, hRect);
            Windows.MoveWindow(RunGate[0].MainFormHandle, 0, 0,
              hRect.Right - hRect.Left, hRect.Bottom - hRect.Top, True);
            ShowWindow(RunGate[0].MainFormHandle, SW_MINIMIZE);
            ShowWindow(RunGate[0].MainFormHandle, SW_SHOW);
          end
          else
          begin
            Application.ProcessMessages;
            Sleep(10);
          end;
        end;

        if g_boRunGate_GetMinimize then
          SendMessage(RunGate[0].MainFormHandle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
      end
      else
      begin
        nHandle := Str_ToInt(sData, 0);
        for I := Low(RunGate) to High(RunGate) do
        begin
          if RunGate[I].MainFormHandle = nHandle then
          begin
            RunGate[I].btStartStatus := 2;

            case I of
              0: MainOutMessage('游戏网关一启动完成...');
              1: MainOutMessage('游戏网关二启动完成...');
              2: MainOutMessage('游戏网关三启动完成...');
              3: MainOutMessage('游戏网关四启动完成...');
              4: MainOutMessage('游戏网关五启动完成...');
              5: MainOutMessage('游戏网关六启动完成...');
              6: MainOutMessage('游戏网关七启动完成...');
              7: MainOutMessage('游戏网关八启动完成...');
            end;

            // 内嵌窗口逻辑
            if CheckBoxWindosInto.Checked then
            begin
              if Windows.SetParent(RunGate[I].MainFormHandle, ScrollBoxPanel.Handle) <> 0 then
              begin
                Windows.GetWindowRect(RunGate[I].MainFormHandle, hRect);
                Windows.MoveWindow(RunGate[I].MainFormHandle, 0, 0,
                  hRect.Right - hRect.Left, hRect.Bottom - hRect.Top, True);
                ShowWindow(RunGate[I].MainFormHandle, SW_MINIMIZE);
                ShowWindow(RunGate[I].MainFormHandle, SW_SHOW);
              end
              else
              begin
                Application.ProcessMessages;
                Sleep(10);
              end;
            end;

            if g_boRunGate_GetMinimize then
              SendMessage(RunGate[I].MainFormHandle, WM_SYSCOMMAND, SC_MINIMIZE, 0);

            Break;
          end;
        end;
      end;
    end;
  end;
end;


声明:本文系互联网搜索而收集整理,不以盈利性为目的,文字、图文资料源于互联网且共享于互联网。
如有侵权,请联系 yao4fvip#qq.com (#改@) 删除。