Как перерисовать графику после обновления экрана? - PullRequest
1 голос
/ 24 января 2020

У меня есть следующий код для моего windows приложения форм , и у меня возникают проблемы с перерисовкой растрового изображения на экране после обновления экрана. Я пытался использовать таймер для рисования растрового изображения на экране, но я получил некоторые ошибки, такие как Not Enough Memory и Graphics currently in use. Когда я должен перерисовать, чтобы мое растровое изображение всегда отображалось на экране.

Код:

using Gma.System.MouseKeyHook;
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
using System.Windows.Forms;


namespace Inker
{
    public partial class Form1 : Form
    {
        [DllImport("User32.dll")]
        public static extern IntPtr GetDC(IntPtr hwnd);
        [DllImport("User32.dll")]
        static extern int ReleaseDC(IntPtr hwnd, IntPtr dc);

        [DllImport("user32.dll")]
        public static extern short GetAsyncKeyState(int key);

        private const int VK_SHIFT = 0x10;
        private const int VK_CONTROL = 0x11;
        private const int VK_ALT = 0x12;

        private IKeyboardMouseEvents m_GlobalHook;

        private bool painting = false;

        Image signature;
        Point previousPoint;
        Pen pen;
        IntPtr dc;

        public Form1()
        {
            SetStyle(ControlStyles.ResizeRedraw, true);
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dc = GetDC(IntPtr.Zero);
            m_GlobalHook = Hook.GlobalEvents();
            m_GlobalHook.MouseDownExt += mMouseDown;
            m_GlobalHook.MouseMoveExt += mMouseMove;
            m_GlobalHook.MouseUpExt += mMouseUp;

            pen = getPen(Color.FromArgb(255, 0, 0, 0), 10);

        }
        void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            m_GlobalHook.MouseDownExt -= mMouseDown;
            m_GlobalHook.MouseMoveExt -= mMouseMove;
            m_GlobalHook.MouseUpExt -= mMouseUp;
            m_GlobalHook.Dispose();
            signature.Dispose();
            ReleaseDC(IntPtr.Zero, dc);
        }

        Pen getPen(Color color, float width)
        {
            Pen pen = new Pen(color, width);
            pen.Alignment = PenAlignment.Center;
            pen.StartCap = LineCap.Round;
            pen.EndCap = LineCap.Round;
            return pen;
        }


        private void mMouseUp(object sender, MouseEventExtArgs e)
        {
            if (e.Button == MouseButtons.Left && painting)
            {
                painting = false;
                e.Handled = true;
            }
        }

        private void mMouseMove(object sender, MouseEventExtArgs e)
        {
            if (painting)
            {
                if (signature == null)
                    signature = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);

                using (Graphics g = Graphics.FromImage(signature))
                {
                    g.SmoothingMode = SmoothingMode.AntiAlias;
                    g.DrawLine(pen, previousPoint, e.Location);
                    Console.WriteLine("Working or not!");
                    previousPoint = e.Location;
                    Invalidate();
                }
            }
        }

        private void mMouseDown(object sender, MouseEventExtArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                bool shiftdown = (GetAsyncKeyState(VK_SHIFT) & 0x8000) != 0;
                bool controldown = (GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0;

                if (controldown && shiftdown)
                {
                    painting = true;
                    previousPoint = e.Location;
                    e.Handled = true;
                }
            }
        }

        void Form1_Paint(object sender, PaintEventArgs e)
        {
            redrawMethod();
        }

        void redrawMethod()
        {
            if (signature != null)
                using (Graphics g = Graphics.FromHdc(dc))
                    g.DrawImage(signature, 0, 0);
        }
    }
}

Я использую MouseKeyHook пакет для обнаружение глобальных событий мыши.

Цель этого приложения - рисовать линии на экране, когда пользователь использует ctrl + shift + LMB. Если есть другой способ добиться этого, пожалуйста, дайте мне знать.

Заранее спасибо.

...