PictureBox在Tab键按下时抛出“参数无效”ArgumentException

时间:2012-12-17 10:30:04

标签: vb.net winforms bitmap keypress modi

我有一个表单,用户可以先扫描到位图。扫描完成后,加载位图,我有4个文本框然后启用。在每个文本框旁边,我有一个名为“从图像剪切”的按钮。当用户单击该按钮时,他们可以单击并拖动位图以使用MODI获取所选文本。

除了一个令人讨厌的错误之外,这个工作非常完美:当我点击“从图像剪切”按钮并拖动一个正方形时,它会很好地获取文本框中的信息。然后,如果我点击下一个文本框,它会很顺利,但如果我使用tab键离开该字段,我会得到一个“参数无效”ArgumentException并且它没有显示任何帮助崩溃的代码在哪里。我可以在表单中四处选择,没有任何问题,但是一旦扫描了位图,当我使用Tab键时,它会像10次中的9次一样崩溃。

我尝试使用以下方法覆盖tab键(仅用于调试):

Protected Overrides Function ProcessTabKey(ByVal forward As Boolean) As Boolean
    MsgBox("TAB is currently disabled!")
    Return False 'Tried True as well, just in case
End Function

......但它仍然崩溃。

关于什么是错的任何建议?由于我不知道从哪里开始调试,我无法分辨出要显示的代码。

编辑1

以下是被抛出的ArgumentException的堆栈跟踪:

  • 在System.Drawing.Image.get_Width()
  • 在System.Drawing.Image.get_Size()
  • at System.Windows.Forms.PictureBox.ImageRectangleFromSizeMode(PictureBoxSizeMode mode)
  • 在System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
  • at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e,Int16 layer)
  • at System.Windows.Forms.Control.WmPaint(Message& m)
  • at System.Windows.Forms.Control.WndProc(Message& m)
  • at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
  • at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
  • at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)
  • at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
  • at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID,Int32 reason,Int32 pvLoopData)
  • at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason,ApplicationContext context)
  • at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,ApplicationContext context)
  • at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
  • at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
  • at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String [] commandLine)
  • at ORC_Testing.My.MyApplication.Main(String [] Args)in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
  • at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly,String [] args)
  • at System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)
  • at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
  • at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
  • at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean ignoreSyncCtx)
  • at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state)
  • 在System.Threading.ThreadHelper.ThreadStart()

编辑2

以下是我扫描/加载图片的方式:

Dim filename As Collection
filename = TwainHandler.ScanImages("c:\scan\", "tif")
Dim ScannedFile As Image = Image.FromFile(filename(1))
PictureBox1.Image = ScannedFile
PictureBox1.Width = ScannedFile.Width
' etc.

3 个答案:

答案 0 :(得分:10)

您的问题很可能是,您在某个Dispose对象上调用了Image方法。当您调用Image.Dispose时,它会从内存中删除基础图像数据,因此Image对象仍然存在,但由于它不再包含实际图像而无效。将PictureBox.Image属性设置为已加载的Image对象时,PictureBox控件将假定Image对象保持有效,以便以后可以在控件中重复使用它需要重新粉刷到屏幕上。例如:

Dim myImage As Image = Image.FromFile("file path")
PictureBox1.Image = myImage
PictureBox1.Refresh() ' This works
myImage.Dispose()
PictureBox1.Refresh() ' This throws an exception because it tries to access the disposed Image object

PictureBox控件会在处理时自动处理图像,因此您无需担心自己处理它。您应该处理图像的唯一时间是当您不将它们提供给任何其他对象供以后使用时。

答案 1 :(得分:1)

这是我的解决方案,有人可以使用它,即使问题已经过去了。

34px

答案 2 :(得分:0)

PictureBox1.Image = myImage.Clone 这样您就可以使用图像的副本,因此原始

的内容无关紧要