2016-01-19 6 views
1

Я переводил коды с VB6 на VB .NET.System.Drawing.dll бросил необработанное исключение типа «System.ArgumentException», когда используется Graphics.GetHdc

Вот код 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.ArgumentException» произошло в System.Drawing.dll. Дополнительная информация: Параметр недействителен.

Вот трассировки стека:

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: 

Я проверил различные сайты и форумы, но я не мог найти ключ на решение этой проблемы.

Как я могу справиться с этим исключением? Какой параметр здесь недействителен?

ответ

3

Да, это произойдет в конечном итоге. Не займет много времени в обработчике событий MouseMove. Поскольку документация для Graphics.GetHdc() не перестает указывать, вы должны , чтобы освободить контекст устройства еще раз, чтобы вызывать ReleaseHdc().

Выделение слишком многих из них приводит к нарушению операционной системы. Он вытащит вилку и не позволит вам выделить больше. Исключение немного запутанно, GDI не предоставляет информацию об ошибке. Это вы можете увидеть на вкладке «Диспетчер задач», «Процессы». Используйте «Просмотр»> «Выбрать столбцы» и отметьте объекты «GDI» и «USER Objects». Вы должны видеть, как первый из них неуклонно поднимается, двигая мышь. Шоу обычно заканчивается на 10 000 объектов.

+0

Привет, я добавил ReleaseHdc(), чтобы освободить контекст устройства, но объекты GDI в диспетчере задач все еще увеличиваются, а мой код разбился на GetHdc. Я прикрепил отредактированные коды ниже для справки. дим HDC Как IntPtr = g.GetHdc g_variable3D.retval = BitBlt (HDC, 0, 0, Picture1.Width, Picture1.Height, g_variable3D.jdc, 0, 0, TernaryRasterOperations.SRCCOPY) g.ReleaseHdc (HDC) 'важно вывести дескриптор в контекст чертежа End Using – hunterex

+1

Вот почему я рекомендовал использовать диспетчер задач, утечка, подобная этому, почти никогда не изолирована от одной ошибки. Комментируйте фрагменты кода, чтобы найти другие. Убедитесь, что g_variable3D.jdc очищается должным образом. Убедитесь, что растровые изображения удаляются. Etcetera. –