Рисование графики, полученной GetDC, не работает внутри цикла - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь нарисовать графику прямо на экране, но когда я использую ее внутри using, по какой-то причине она не работает. Я хочу избежать создания нескольких экземпляров в миллисекунду, чтобы избежать дополнительного использования процессора.

У меня есть класс IDisposable ManagedDC, который содержит IntPtr для DC, и графический класс, который инициализируется Graphics.FromHdc () при инициализации класса. Когда я помещаю цикл с графическим кодом внутри блока using, никаких ошибок не возникает, но, похоже, ничего не рисует. Выполнение using внутри цикла работает, но создает дополнительную нагрузку.

Код класса ManagedDC:

        class ManagedDC : IDisposable
        {
            [DllImport("User32.dll", SetLastError = true)]
            public static extern IntPtr GetDC(IntPtr hwnd);
            [DllImport("User32.dll", SetLastError = true)]
            public static extern int ReleaseDC(IntPtr hwnd, IntPtr dc);

            public ManagedDC()
            {
                pointer = GetDC(IntPtr.Zero);
                if (pointer == IntPtr.Zero) Throw();
                graphics = Graphics.FromHdc(pointer);
            }

            public IntPtr pointer { get; private set; }
            public Graphics graphics { get; private set; }

            public void Dispose()
            {
                graphics.Dispose();
                graphics = null;
                if (ReleaseDC(IntPtr.Zero, pointer) == 0) Throw();
            }
            void Throw()
            {
                throw new Exception("win32 error code: " + Marshal.GetLastWin32Error().ToString());
            }
        }

Код проблемы:

            using (ManagedDC dc = new ManagedDC())
            {
                for (int i = 0; i < 20; i++)
                {
                    dc.graphics.FillRectangle(Brushes.Black, 50, 50, 100, 100);
                    System.Threading.Thread.Sleep(100);
                }
            }

Я ожидал, что for внутри using будет работать как обычно, но вместо этого он ничего не выводит на экран. using внутри for работает как задумано, но создает новые экземпляры каждый раз без причины. Мне интересно, почему это происходит, и есть ли способ это исправить.

...