Kreis Grafik auf der Position des Cursors zeigen

  • C#

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Kreis Grafik auf der Position des Cursors zeigen

    Hallo,

    ich habe eine Anwendung geschrieben, die mir erlaubt, ausgehend von der aktuellen Cursor Position ein Ellipse Objekt zu zeichnen, sodass die Ellipse dann dem Cursor folgt. Das funktioniert auch wirklich gut muss ich sagen, jedoch habe ich zwei Fragen.
    1. Ich habe naiver Weise versucht eine gefüllte kreisförmige Ellipse zu zeichnen (siehe unteren Teil im Code). Dies hat leider dazu geführt, dass das "Klick Event" der Maus nicht mehr funktionierte, ich weiß allerdings gerade nicht warum das so ist. Ich würde jedoch gerne eine gefüllte kreisförmige Ellipse zeichnen, weiß hier jemand Rat?
    2. Die Schnelligkeit der Cursorverfolgung könnte meiner Meinung nach noch verbessert werden. Gerade wenn die Maus sehr schnell bewegt wird, sieht man dann doch, dass die gezeichnete Ellipse hier etwas träge ist. Meine Frage ist daher kann man das überhaupt schneller machen? Ich wüsste nur, dass man das Timer Intervall anpassen könnte, aber das hilft hier nicht viel...

    Meinen aktueller Code:
    Spoiler anzeigen

    C#-Quellcode

    1. ​using System;
    2. using System.Drawing;
    3. using System.Windows.Forms;
    4. namespace CursorHacks
    5. {
    6. public partial class Form1 : Form
    7. {
    8. int circle_size = 30;
    9. public Form1()
    10. {
    11. InitializeComponent();
    12. TopMost = true;
    13. ShowInTaskbar = false;
    14. FormBorderStyle = FormBorderStyle.None;
    15. BackColor = Color.Blue;
    16. TransparencyKey = Color.Blue;
    17. Width = 42;
    18. Height = 42;
    19. timer1.Interval = 5;
    20. timer1.Enabled = true;
    21. timer1.Start();
    22. }
    23. void Timer1_Tick(object sender, EventArgs e)
    24. {
    25. Point cursor_point = Cursor.Position;
    26. cursor_point.Offset(-(Width / 2), -(Height / 2));
    27. Location = cursor_point;
    28. this.TopMost = true;
    29. Show();
    30. }
    31. private void Form1_Paint(object sender, PaintEventArgs e)
    32. {
    33. e.Graphics.DrawEllipse(Pens.Black, (Width - circle_size) / 2, (Height - circle_size) / 2, circle_size, circle_size);
    34. // Mein neues Vorhaben:
    35. //Color clr = Color.FromArgb(100, Color.Red);
    36. //e.Graphics.FillEllipse(new SolidBrush(clr), (Width - circle_size) / 2, (Height - circle_size) / 2, circle_size, circle_size)
    37. }
    38. }
    39. }
    Timer? Warum nicht MouseMove?
    Bzgl. Click_Event: Tja, der Code ist leider nicht oben zu sehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hab sowas noch nie programmiert. Aber ich denke der Timer ist hier wohl das schlechteste Mittel der Wahl. Wüsste akut aber auch keine Alternative. Evtl. wäre das MouseMove Event der Form oder ähnliches besser geeignet. Aber wie gesagt, keine Erfahrung damit.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    ​Gerade wenn die Maus sehr schnell bewegt wird, sieht man dann doch, dass die gezeichnete Ellipse hier etwas träge ist.

    Probier mal das hier. Linke Maustaste gedrückt halten und bewegen. Zeichnet eine Linie aufs Form. Daran siehst du, dass das System irgendwann nicht mehr hinterherkommt. Kommt von Stackoverflow
    stackoverflow.com/questions/47…e-parts-of-a-graphicspath

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Drawing.Drawing2D;
    7. using System.Linq;
    8. using System.Text;
    9. using System.Threading.Tasks;
    10. using System.Windows.Forms;
    11. namespace selbst_zeichnen
    12. {
    13. public partial class Form1 : Form
    14. {
    15. private GraphicsPath _drawingPath = new GraphicsPath();
    16. private Point lastMouseLocation;
    17. private bool drawing = false;
    18. public Form1()
    19. {
    20. InitializeComponent();
    21. }
    22. private void Form1_Load(object sender, EventArgs e)
    23. {
    24. }
    25. private void Form1_MouseDown(object sender, MouseEventArgs e)
    26. {
    27. if (e.Button == MouseButtons.Right)
    28. {
    29. _drawingPath = new GraphicsPath();
    30. Invalidate();
    31. }
    32. }
    33. private void Form1_MouseMove(object sender, MouseEventArgs e)
    34. {
    35. if (e.Button == MouseButtons.Left)
    36. {
    37. drawing = true;
    38. _drawingPath.AddLine(lastMouseLocation, e.Location);
    39. Invalidate();
    40. }
    41. if (e.Button == MouseButtons.None && drawing)
    42. {
    43. drawing = false;
    44. _drawingPath.StartFigure();
    45. }
    46. lastMouseLocation = e.Location;
    47. }
    48. private void Form1_Paint(object sender, PaintEventArgs e)
    49. {
    50. e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear;
    51. e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
    52. e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
    53. e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    54. using (SolidBrush b = new SolidBrush(Color.Blue))
    55. using (Pen p = new Pen(b, 51))
    56. {
    57. e.Graphics.DrawPath(p, _drawingPath);
    58. }
    59. using (SolidBrush b = new SolidBrush(Color.LightGreen))
    60. using (Pen p = new Pen(b, 50))
    61. {
    62. e.Graphics.DrawPath(p, _drawingPath);
    63. }
    64. }
    65. }
    66. }

    VaporiZed schrieb:

    Timer? Warum nicht MouseMove?
    Bzgl.


    Ja stimmt MouseMove könnte vermutlich auch funktionieren, das hab ich noch nicht getestet, klingt aber logisch...

    VaporiZed schrieb:

    Bzgl. Click_Event: Tja, der Code ist leider nicht oben zu sehen.


    Achso, ich hatte fast damit gerechnet, dass das missverstanden werden könnte (mein Fehler) ;) . Ich hab das Event nicht definiert, ich wollte damit nur sagen, dass wenn ich die Linke Maustaste betätige, ich nichts anklicken kann...

    Notiz am Rande: Das was ich baue könnte man auch als Cursor Highlighter interpretieren...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB.neter0101“ ()

    null, das ist doch auch cool! Wie hast du es denn geschafft, dass du auf den Bildschirm malen konntest? Der Cursor Highlighter folgt ja nur dem Cursor, daher kann man das bestimmt adaptieren?!

    Ich habe bei StackOverflow gesehen, dass das Problem die Transparenz ist, siehe hier z.B. stackoverflow.com/questions/11…sual-c-sharp-window-forms, jedoch verstehe ich nicht genau, wie das WndProc() die Befehle an die untergeordneten GUI Elemente weiterreicht...

    ---------------------------------------------

    Ich denke ich habs...

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Diagnostics;
    3. using System.Drawing;
    4. using System.Drawing.Drawing2D;
    5. using System.Runtime.InteropServices;
    6. using System.Windows.Forms;
    7. namespace CursorHacks
    8. {
    9. public partial class Form1 : Form
    10. {
    11. int circle_size = 30;
    12. public Form1()
    13. {
    14. InitializeComponent();
    15. TopMost = true;
    16. ShowInTaskbar = false;
    17. FormBorderStyle = FormBorderStyle.None;
    18. this.Opacity = 0.5;
    19. this.BackColor = Color.Red;
    20. this.FormBorderStyle = FormBorderStyle.None;
    21. this.Height = 30;
    22. this.Width = 30;
    23. this.MaximumSize = new System.Drawing.Size(Height, Width);
    24. timer1.Interval = 5;
    25. timer1.Enabled = true;
    26. timer1.Start();
    27. }
    28. [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
    29. private static extern IntPtr CreateRoundRectRgn
    30. (
    31. int nLeftRect,
    32. int nTopRect,
    33. int nRightRect,
    34. int nBottomRect,
    35. int nWidthEllipse,
    36. int nHeightEllipse
    37. );
    38. [DllImport("user32.dll", SetLastError = true)]
    39. static extern int GetWindowLong(IntPtr hWnd, int nIndex);
    40. [DllImport("user32.dll")]
    41. static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
    42. const int GWL_EXSTYLE = -20;
    43. const int WS_EX_LAYERED = 0x80000;
    44. const int WS_EX_TRANSPARENT = 0x20;
    45. protected override void OnLoad(EventArgs e)
    46. {
    47. base.OnLoad(e);
    48. var style = GetWindowLong(this.Handle, GWL_EXSTYLE);
    49. SetWindowLong(this.Handle, GWL_EXSTYLE, style | WS_EX_LAYERED | WS_EX_TRANSPARENT);
    50. }
    51. void Timer1_Tick(object sender, EventArgs e)
    52. {
    53. Point cursor_point = Cursor.Position;
    54. cursor_point.Offset(-(Width / 2), -(Height / 2));
    55. Location = cursor_point;
    56. this.TopMost = true;
    57. Show();
    58. Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, Height, Width, 22, 22));
    59. }
    60. }
    61. }


    So siehts dann aus:
    Bilder
    • CursorHighlighter.gif

      43,97 kB, 194×179, 364 mal angesehen

    Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „VB.neter0101“ ()

    Ich glaube mit Graphics.FromHdc.
    Wenn du IntPtr.Zero als Argument nutzt, müsstest du ein Grahpics-Object vom "Screen" bekommen.
    docs.microsoft.com/de-de/dotne…?view=dotnet-plat-ext-5.0

    Edit: Kann sein das du mit GetDC den DC hohlen musst und diesen als Argument nutzen musst.(IntPtr.Zero als Argument nutzen, den Rückgabewert dann für Graphics.FromHdc nutzen)Schon lange her, kann mich nicht 100% dran erinnern.
    docs.microsoft.com/en-us/windo…/winuser/nf-winuser-getdc
    @VB.neter0101 Die Herangehensweise ist üblicherweise die, dass Du im MouseMove-Event die Koordinaten abspeicherst und .Invalidate() aufrufst.
    Im Paint-Event malst Du dann das, was zu malen ist.
    Um es "smooth" zu machen, invalidisierst Du nur den Bereich, der von der Überlagerung des alten zu löschenden und des neuen zu malenden Kreises beschrieben wird.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany, wenn ich dich richtig verstehe, dann schlägst du sowas vor:

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Diagnostics;
    6. using System.Drawing;
    7. using System.Linq;
    8. using System.Runtime.InteropServices;
    9. using System.Text;
    10. using System.Threading.Tasks;
    11. using System.Windows.Forms;
    12. namespace WindowsFormsApp3
    13. {
    14. public partial class Form1 : Form
    15. {
    16. int x_cord, y_cord;
    17. [DllImport("user32.dll", SetLastError = true)]
    18. [return: MarshalAs(UnmanagedType.Bool)]
    19. static extern bool GetCursorPos(out POINT lpPoint);
    20. public struct POINT
    21. {
    22. public int X;
    23. public int Y;
    24. public POINT(int X, int Y)
    25. {
    26. this.X = X;
    27. this.Y = Y;
    28. }
    29. }
    30. [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
    31. private static extern IntPtr CreateRoundRectRgn
    32. (
    33. int nLeftRect, // x-coordinate of upper-left corner
    34. int nTopRect, // y-coordinate of upper-left corner
    35. int nRightRect, // x-coordinate of lower-right corner
    36. int nBottomRect, // y-coordinate of lower-right corner
    37. int nWidthEllipse, // width of ellipse
    38. int nHeightEllipse // height of ellipse
    39. );
    40. [DllImport("user32.dll", SetLastError = true)]
    41. static extern int GetWindowLong(IntPtr hWnd, int nIndex);
    42. [DllImport("user32.dll")]
    43. static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
    44. const int GWL_EXSTYLE = -20;
    45. const int WS_EX_LAYERED = 0x80000;
    46. const int WS_EX_TRANSPARENT = 0x20;
    47. private IntPtr xx;
    48. protected override void OnLoad(EventArgs e)
    49. {
    50. base.OnLoad(e);
    51. var style = GetWindowLong(this.Handle, GWL_EXSTYLE);
    52. SetWindowLong(this.Handle, GWL_EXSTYLE, style | WS_EX_LAYERED | WS_EX_TRANSPARENT);
    53. }
    54. public Form1()
    55. {
    56. InitializeComponent();
    57. TopMost = true;
    58. ShowInTaskbar = false;
    59. FormBorderStyle = FormBorderStyle.None;
    60. this.Opacity = 0.5;
    61. this.BackColor = Color.Red;
    62. this.FormBorderStyle = FormBorderStyle.None;
    63. this.Height = 30;
    64. this.Width = 30;
    65. this.MaximumSize = new System.Drawing.Size(Height, Width);
    66. xx = CreateRoundRectRgn(x_cord, y_cord, Height, Width, 22, 22);
    67. }
    68. private void Form1_Move(object sender, EventArgs e)
    69. {
    70. }
    71. private void Form1_MouseMove(object sender, MouseEventArgs e)
    72. {
    73. Point cursor_point = Cursor.Position;
    74. cursor_point.Offset(-(Width / 2), -(Height / 2));
    75. Location = cursor_point;
    76. x_cord = cursor_point.X;
    77. y_cord = cursor_point.Y;
    78. Debug.WriteLine(cursor_point.X + "," + cursor_point.Y);
    79. Invalidate();
    80. }
    81. private void Form1_Paint(object sender, PaintEventArgs e)
    82. {
    83. this.TopMost = true;
    84. Region = System.Drawing.Region.FromHrgn(xx);
    85. Show();
    86. }
    87. }
    88. }


    Leider verfolgt die Form den Cursor dann nicht mehr... Und die CPU Auslastung ist bei 100% 8-)

    VB.neter0101 schrieb:

    wenn ich dich richtig verstehe, dann schlägst du sowas vor:
    Nö, eher so was:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private DoDraw As Boolean
    3. Private Rect As Rectangle
    4. Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown
    5. Me.DoDraw = True
    6. Me.Rect = New Rectangle(e.Location, Size.Empty)
    7. Me.Rect.Inflate(20, 20) ' Umfeld des Kreises invalidisieren
    8. Me.Invalidate(Me.Rect)
    9. End Sub
    10. Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove
    11. If Me.DoDraw Then
    12. Me.Invalidate(Me.Rect)
    13. Me.Rect = New Rectangle(e.Location, Size.Empty)
    14. Me.Rect.Inflate(20, 20) ' Umfeld des Kreises invalidisieren
    15. Me.Invalidate(Me.Rect)
    16. End If
    17. End Sub
    18. Private Sub Form1_MouseUp(sender As Object, e As MouseEventArgs) Handles MyBase.MouseUp
    19. Me.DoDraw = False
    20. Me.Invalidate(Me.Rect)
    21. End Sub
    22. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
    23. Me.Rect.Inflate(-10, -10) ' kleineren Kreis malen, sonst bleiben Ränder stehen
    24. e.Graphics.FillEllipse(Brushes.Green, Me.Rect)
    25. End Sub
    26. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe etwas weitergebastelt und eine "Lösung", die jetzt stabil läuft, jedoch ist die Verfolgung immer noch etwas träge wie ich finde. Hier suche ich noch nach einer Verbesserung. Mit MouseMove kann ich leider nicht arbeiten, weil ich ja außerhalb der Form arbeiten möchte, d.h. die Maus soll immer noch dazu befähigt sein, sich durch das System zu klicken...

    @RodFromGermany, was ist der Vorteil von Paint und MouseMove im Vergleich zum Timer? Das mit MouseMove habe ich versucht, aber das geht nur, solange der Cursor in der Form ist, ich möchte diesen Maus Highlighter jedoch außerhalb der Form, in jeder anderen Anwendung nutzen.

    @ErfinderDesRades, du hattest doch noch eine ähnliche Implementierung, hast du noch etwaige Verbesserungen?

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Diagnostics;
    6. using System.Drawing;
    7. using System.Linq;
    8. using System.Runtime.InteropServices;
    9. using System.Text;
    10. using System.Threading.Tasks;
    11. using System.Windows.Forms;
    12. namespace WindowsFormsApp3
    13. {
    14. public partial class Form1 : Form
    15. {
    16. POINT p;
    17. public static int sizeA = 35;
    18. public static int sizeB = 15;
    19. [DllImport("user32.dll", SetLastError = true)]
    20. [return: MarshalAs(UnmanagedType.Bool)]
    21. static extern bool GetCursorPos(out POINT lpPoint);
    22. public struct POINT
    23. {
    24. public int X;
    25. public int Y;
    26. public POINT(int X, int Y)
    27. {
    28. this.X = X;
    29. this.Y = Y;
    30. }
    31. }
    32. [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
    33. private static extern IntPtr CreateRoundRectRgn
    34. (
    35. int nLeftRect, // x-coordinate of upper-left corner
    36. int nTopRect, // y-coordinate of upper-left corner
    37. int nRightRect, // x-coordinate of lower-right corner
    38. int nBottomRect, // y-coordinate of lower-right corner
    39. int nWidthEllipse, // width of ellipse
    40. int nHeightEllipse // height of ellipse
    41. );
    42. [DllImport("user32.dll", SetLastError = true)]
    43. static extern int GetWindowLong(IntPtr hWnd, int nIndex);
    44. [DllImport("user32.dll")]
    45. static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
    46. const int GWL_EXSTYLE = -20;
    47. const int WS_EX_LAYERED = 0x80000;
    48. const int WS_EX_TRANSPARENT = 0x20;
    49. private IntPtr xx;
    50. protected override void OnLoad(EventArgs e)
    51. {
    52. base.OnLoad(e);
    53. var style = GetWindowLong(this.Handle, GWL_EXSTYLE);
    54. SetWindowLong(this.Handle, GWL_EXSTYLE, style | WS_EX_LAYERED | WS_EX_TRANSPARENT);
    55. }
    56. public Form1()
    57. {
    58. InitializeComponent();
    59. TopMost = true;
    60. ShowInTaskbar = false;
    61. FormBorderStyle = FormBorderStyle.None;
    62. Opacity = 0.5;
    63. BackColor = Color.Red;
    64. FormBorderStyle = FormBorderStyle.None;
    65. Height = sizeA + 40;
    66. Width = sizeA + 40;
    67. MaximumSize = new System.Drawing.Size(Height, Width);
    68. xx = CreateRoundRectRgn(0, 0, Height, Width, sizeB, sizeB);
    69. GetCursorPos(out p);
    70. Left = p.X - ((Width) / 2);
    71. Top = p.Y - ((Height)/ 2);
    72. timer1.Interval = 2;
    73. timer1.Start();
    74. }
    75. private void timer1_Tick(object sender, EventArgs e)
    76. {
    77. GetCursorPos(out p);
    78. Left = p.X - (Width / 2);
    79. Top = p.Y - (Height / 2);
    80. Region = Region.FromHrgn(xx);
    81. TopMost = true;
    82. Show();
    83. }
    84. }
    85. }


    Aber rein von der Theorie wäre doch eine transparente Full Screen Form, durch die ich durchklicken kann und auf der ich etwas zeichnen kann sicherlich geeigneter?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB.neter0101“ ()

    nee, meine Implementierung tickt anners und wäre als userdefined Cursor nicht zu brauchen.
    Dein Sample flimmert stark.
    Weil du in jedem TimerTick das Form neu anzeigst.

    Die Sache mit dem userdefined Cursor wäre vmtl. ziemlich genau dein Vorhaben. bin ich auf Stackoverflow auf was gestossen, aber hab ich vergessen.
    oder "eigene Cursor-Datei" googeln.

    VB.neter0101 schrieb:

    was ist der Vorteil von Paint und MouseMove im Vergleich zum Timer?
    Was soll diese Frage :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany, das bezog sich auf den Vergleich deiner Anwendung und meiner Implementierung in meinem letzten Beitrag Kreis Grafik auf der Position des Cursors zeigen. Ich finde meine Lösung relativ puristisch, wohingegen sich mir der Vorteil von deiner Implementierung mit MouseMove und Paint noch nicht erschließt. Warum ist MouseMove besser, als das was ich gemacht habe?

    @ErfinderDesRades, danke auch für deine Antwort! Du sagtest "Weil du in jedem TimerTick das Form neu anzeigst.", gibt es eine Möglichkeit das bei meiner aktuellen Implementierung zu verbessern?

    Nebenbei: Ich möchte den Cursor nicht ersetzen! Was ich möchte, ist eigentlich nur ein Highlighting ähnlich zu dem, was die Freeware PenAttention tut (das möchte ich nachbauen, nur besser).
    @VB.neter0101 Dein Programm malt auf allen Screens, aber Windows ist nicht mehr bedienbar. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.neter0101 schrieb:

    Du sagtest "Weil du in jedem TimerTick das Form neu anzeigst.", gibt es eine Möglichkeit das bei meiner aktuellen Implementierung zu verbessern?
    Ja, gibt es.
    ABer das ist so simpel, das mag ich nicht vorsagen.
    guck deinen Code an, und überleg, welches die bösen Zeilen sind, die das Form in jedem Timer-Tick anzeigen.
    Dann überleg, wie man hinbekommt, dass das Form nur noch einmal angezeigt wird - das reicht ja.

    RodFromGermany schrieb:

    @VB.neter0101 Dein Programm malt auf allen Screens, aber Windows ist nicht mehr bedienbar. ;(


    Aber das soll es doch? Das ist zumindest die Interpretation eines Mouse Highlighters? Woran machst du fest, dass Windows nicht mehr bedienbar ist?

    @ErfinderDesRades das kann dann ja eigentlich nur Show() sein? Aber du sprichst von der Mehrzahl ;) d.h. da ist dann noch mehr...