Okay, ich habs geschafft was zu zeichnen:
PHP-Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace TastaturVisualizer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void timer1_Tick(object sender, EventArgs e)
{
IntPtr deskDC = User32.GetDC(IntPtr.Zero);
Graphics g = Graphics.FromHdc(deskDC);
Pen p = new Pen(Color.FromArgb(100, 0, 0), 10);
g.DrawLine(p, 5, 5, 300, 300);
User32.ReleaseDC(0, deskDC);
}
private void button1_Click(object sender, EventArgs e)
{
}
}
#region User32
internal class User32
{
[DllImport("user32")]
internal static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("User32.dll")]
internal static extern void ReleaseDC(int hwnd, IntPtr hdc);
}
#endregion
}
Doch es gibt 2 Probleme:
a) wenn ich ein Fenster unter dem Strich hindurchziehe, bleibt ein Strich auf dem Fenster zurück, bis es sich neuzeichnet. Ich nehme an, ich muss vor der Zeichenanweisung des Strichs alle offenen/sichtbaren Fenster repainten lassen. Doch wie bestimme ich alle offenen/sichtbaren Fenster?
b) Wenn sich die Fenster unter dem Strich neuzeichnen, dann flackert der Strich. Wie kann ich das unterbinden, bzw den Strich mit Doublebuffering zeichnen?
Edit: Okay gegen a) hab ich folgendes gefunden:
PHP-Code:
User32.InvalidateRect(IntPtr.Zero, IntPtr.Zero, true);
...
[DllImport("user32.dll")]
internal static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);
Allerdings flackert das wie irre