1

したがって、このクラスにはCommon.csという名前のクラスがあり、フォームのインスタンスを作成する関数frmMainGame.csがあり、この新しいフォームインスタンスを呼び出すメソッドを呼び出しますが、何らかの理由でそうしません。そのため、フォームがmainGame.Show();を使用して表示されるとき。フォームがそこにぶら下がっているだけで、何もできません。

コードは次のとおりです。

frmMainGame.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;

namespace Ghoul_Engine
{ 

public partial class frmMainGame : Form
{

 public delegate void openGame();
 public delegate void refreshGame();
 public delegate void updateScreen(Bitmap image);

 drawing draw;


 public bool isTyping = false;


    public Graphics g;

    public List<String> Chat = new List<String>();

    public List<String> chat
    {
        get { return Chat; }
    }

    public frmMainGame()
    {

        draw = new drawing(this);

        InitializeComponent();

    }

    public Size size{
        get { return this.Size; }
    }

    public void showGame()
    {
        if (InvokeRequired)
        {
            MessageBox.Show("Invoke");
            BeginInvoke(new openGame(showGame), null);
        }
        else
        {
            this.Show();
            this.Focus();
        }
    }


    public void refresh()
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new refreshGame(refresh), null);
        }
        else
        {
            this.Refresh();
        }
    }
    private void frmMainGame_Load(object sender, EventArgs e)
    {
        this.DoubleBuffered = true;
        draw.drawText(new string[] { "GHOUL Game Engine Alpha V0.0.1" }, 12, 0, 0, Brushes.Yellow);
        clientNetHandler handlers = new clientNetHandler();

    }

    public void update(Bitmap image)
    {
        if (InvokeRequired)
        {
            this.Invoke(new updateScreen(update), new object[] { image });
        }
        else
        {
            pbScreen.Image = image;
        }
    }


    private void frmMainGame_Close(object sender, FormClosingEventArgs e)
    {

        Program.Network.Send("logout", Program.netHandlers.getDataByte(clientNetHandler.cNetType.Logout));
        //Program.Network.closeSocket();
        Program.mainMenu.showMainMenu();
        Program.mainGame = new frmMainGame();
    }

    private void tmrRefreshScreen_Tick(object sender, EventArgs e)
    {

    }

    private void frmMainGame_KeyPress(object sender, KeyPressEventArgs e)
    {

    }

    private void pbScreen_Click(object sender, EventArgs e)
    {
        draw.drawText(Chat.ToArray(), 12, 0, 30, Brushes.Green);
    }
}
}

Common.Cs :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Drawing;

namespace Ghoul_Engine
{
class Common
{


     public Common()
    {
    }
     public void innnitiateGame(String login)
     {

         Program.mainMenu.hideMainMenu();
         frmMainGame mainGame = new frmMainGame();
         mainGame.showGame();
     }

    public void preExit()
    {
            Program.Network.closeSocket();
    }

}
}
4

2 に答える 2

2

フォーム インスタンスを に渡すことによって作成されるメッセージ ポンプが必要ですApplication.Run()

     Application.Run(new frmMainGame());
于 2013-06-10T02:34:20.933 に答える
2

おそらく、クラス構造を少し再設計する必要があります。Common.cs でメイン フォームのインスタンスを作成する代わりに、通常の流れで進めることをお勧めします。つまり、program.cs でメイン フォームのインスタンスを作成してApplication.Run()、メッセージ ポンプをインストールし、ソケット通信クラスを保持します。別のファイルに(おそらくそのままのように)メインフォーム内でインスタンス化します。これらの通信クラスを複数のフォームで使用できるようにする必要がある場合は、program.cs でインスタンスを作成し、別のフォームや他のモジュールにパラメーターとして渡します。

于 2013-06-10T03:04:05.430 に答える