使用 Graphics.GetHdc 时,System.Drawing.dll 引发了“System.ArgumentException”类型的未处理异常

Posted

技术标签:

【中文标题】使用 Graphics.GetHdc 时,System.Drawing.dll 引发了“System.ArgumentException”类型的未处理异常【英文标题】:System.Drawing.dll threw an unhandled exception of type 'System.ArgumentException' when Graphics.GetHdc is used 【发布时间】:2016-04-24 16:03:51 【问题描述】:

我正在将代码从 VB6 翻译成 VB .NET。

这是VB6代码:

retval = BitBlt(Picture1.hdc, 0, 0, Picture1.Width, Picture1.Height, jdc, 0, 0, SRCCOPY)

等效的 VB .NET 代码为:

Dim gr As Graphics = Picture1.CreateGraphics()
Dim hdc As IntPtr = gr.GetHdc()

g_variable3D.retval = BitBlt(hdc, 0, 0, Picture1.Width, Picture1.Height, g_variable3D.jdc, 
        0, 0, TernaryRasterOperations.SRCCOPY)

当我运行代码时,我收到一条错误消息:

Dim hdc As IntPtr = gr.GetHdc()

错误信息说:

System.Drawing.dll 中出现“System.ArgumentException”类型的未处理异常。附加信息:参数无效。

这是堆栈跟踪:

StackTrace:
    at System.Drawing.Graphics.GetHdc()      
    at frm3D.vb:line 313
    at frm3D.Picture1_MouseMove(Object sender, MouseEventArgs e) in frm3D.vb:line 1176
    at System.Windows.Forms.Control.OnMouseMove(MouseEventArgs e)
    at System.Windows.Forms.Control.WmMouseMove(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 My.MyApplication.Main(String[] Args) in :line 81
      InnerException: 

我查看了各种网站和论坛,但找不到解决此问题的线索。

我该如何处理这个异常?这里哪个参数无效?

【问题讨论】:

【参考方案1】:

是的,这最终会发生。在 MouseMove 事件处理程序中不会花费很长时间。正如 Graphics.GetHdc() 的文档所指出的,您必须调用 ReleaseHdc() 以再次释放设备上下文。

分配太多会导致操作系统不正常。它会拔掉插头,不会让你分配更多。异常有点混乱,GDI 不提供错误信息。这是您可以在任务管理器的进程选项卡中看到的内容。使用 View > Select columns 并勾选 GDI Objects 和 USER Objects。当您移动鼠标时,您应该会看到第一个稳步攀升。该节目通常以 10,000 个对象结束。

【讨论】:

您好,我已添加 ReleaseHdc() 以释放设备上下文,但任务管理器中的 GDI 对象仍然增加,我的代码在 GetHdc 处崩溃。我附上了下面的编辑代码供您参考。 Dim hdc As IntPtr = g.GetHdc g_variable3D.retval = BitBlt(hdc, 0, 0, Picture1.Width,Picture1.Height, g_variable3D.jdc, 0, 0, TernaryRasterOperations.SRCCOPY) g.ReleaseHdc(hdc) '这很重要释放绘图上下文的句柄结束使用 这就是我推荐使用任务管理器的原因,像这样的泄漏几乎从来不会孤立于一个错误。注释掉代码块以查找其他代码块。验证 g_variable3D.jdc 是否已正确清理。检查位图是否被处理。等等。

以上是关于使用 Graphics.GetHdc 时,System.Drawing.dll 引发了“System.ArgumentException”类型的未处理异常的主要内容,如果未能解决你的问题,请参考以下文章

FTP SYST回答“Unix类型:L8”

java基础1.5版后新特性 自动装箱拆箱 Date SimpleDateFormat Calendar.getInstance()获得一个日历对象 抽象不要生成对象 get set add Syst

[System Interrupts] 使用DPC Latency Checker解决CPU0被系统终端100%占用问题 / Use DPC Latency Checker to solve Syst

找不到方法:'无效 Microsoft.PowerBI.Api.V1.PowerBIClient..ctor(Microsoft.Rest.ServiceClientCredentials, Syst

zabbix: Get value from agent failed: cannot connect to [[172.16.179.10]:10050]: [4] Interrupted syst

Docker启动报Job for docker.service failed because the control process exited with error code. See “syst