0
     static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new SpaceInvaders());// i get an error here when i start the form application.. it says Argument Exception. Parameter is not valid
    }

我的主要表格如下所示:

    public SpaceInvaders()
    {
        InitializeComponent();

    }

    public void SpaceInvaders_Load(object sender, EventArgs e)
    {
}

这是堆栈跟踪

" 在 System.Drawing.Graphics.GetHdc()\r\n 在 System.Drawing.BufferedGraphics.RenderInternal(HandleRef refTargetDC, BufferedGraphics 缓冲区)\r\n 在 System.Drawing.BufferedGraphics.Render()\r\n 在 System .Windows.Forms.Control.WmPaint(Message& m)\r\n 在 System.Windows.Forms.Control.WndProc(Message& m)\r\n 在 System.Windows.Forms.ScrollableControl.WndProc(Message& m)\r \n 在 System.Windows.Forms.ContainerControl.WndProc(Message& m)\r\n 在 System.Windows.Forms.Form.WndProc(Message& m)\r\n 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message& m)\r\n 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)\r\n 在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam )\r\n 在 System.Windows.Forms.UnsafeNativeMethods。DispatchMessageW(MSG& msg)\r\n 在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)\r\n 在 System.Windows。 Forms.Application.ThreadContext.RunMessageLoopInner(Int32 原因,ApplicationContext 上下文)\r\n 在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 原因,ApplicationContext 上下文)\r\n 在 System.Windows.Forms.Application。在 D:\Documents and Settings\Dima\My Documents\Visual Studio 2008\Projects\SpaceInvaders\SpaceInvaders\Program.cs:line 18 中的 WindowsFormsApplication1.Program.Main() 处运行(Form mainForm)\r\n\r\n在 System.AppDomain._nExecuteAssembly(Assembly 程序集,String[] args)\r\n 在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,String[] args)\r\n 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()\r\n 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态)\r\n 在 System.Threading.ExecutionContext.Run( ExecutionContext executionContext、ContextCallback 回调、对象状态)\r\n 在 System.Threading.ThreadHelper.ThreadStart()"

“参数无效。”

我想我发现了问题:

  public void Draw(Graphics  g,int animationCell)
    {
     // some code
        g.dispose()//that method threw the exception can someone tell me why? i thought you do need to dispose your graphics object at the end when you finish using it.
       }
4

3 回答 3

2

我认为您应该使用 Step Into (F11) 进行调试,以便您可以进入 SpaceInvaders 表单并查看是否为方法提供了任何 null 或其他无效参数。

此行可能不会立即引发异常:

Application.Run(new SpaceInvaders());

但是一些初始化函数可能会产生问题。

看到堆栈跟踪和代码后编辑:

请参阅该//some code部分。检查之前的代码g.dispose()是否不会触发在 Draw 方法之后执行的任何事件处理程序。如果是这样,那么该事件处理程序应该是需要图形对象的事件处理程序,但您已经处置了它。因此图形参数为空。//some code如果您需要任何进一步的帮助,请填写该部分。

于 2011-04-14T14:48:31.967 回答
1

简短的回答:

只是不要在 Draw() 方法中对 Graphics 对象调用 Dispose()。Graphics-object 包含原生绘图表面的句柄。如果您处置它,您的表单将无法在屏幕上绘制。

于 2011-04-14T15:49:19.237 回答
1

你不应该处置别人的Graphics物品。

仅处置您拥有的对象,并且仅在您确定没有其他人会使用它时才处置。

如果您从其他人那里得到一次性物品,您应该假设(除非他们另有说明)他们会在您完成后将其丢弃。您不应该自己处理它,也不应该将其保存以备后用(因为他们可能已经处理了它)

于 2011-04-14T17:22:12.173 回答