Рисование графики, полученной с помощью GetDC, не работает внутри цикла

#c# #windows #drawing

#c# #Windows #рисование

Вопрос:

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

У меня есть IDisposable класс ManagedDC, который содержит IntPtr для DC, и графический класс, который инициализируется графикой.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 , что inside using будет работать как обычно, но вместо этого он ничего не выводит на экран. using внутри for работает по назначению, но каждый раз создает новые экземпляры без причины.
Мне интересно, почему это происходит, и есть ли какой-либо способ это исправить.

Комментарии:

1. Я не могу воспроизвести это; работает для меня с using outside of the loop в Windows 10.

2. Замораживание цикла сообщений на 2 секунды действительно является «проблемным кодом»… вам следует пересмотреть свой подход…

3. Это консольное приложение, я сделал поток. Sleep() в качестве примера. Я использую Windows 7, если это что-то меняет.