У меня есть следующий код для моего 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
. Если есть другой способ добиться этого, пожалуйста, дайте мне знать.
Заранее спасибо.