Direkt auf Bildschirm zeichnen

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Direkt auf Bildschirm zeichnen

    Mein Problem ist folgendes:

    Ich würde gerne ohne eine Form mit FormBorderStyle = None und der Größe des Bildschirmes
    direkt auf den Bildschirm zeichnen (genauer gesagt auf den zweiten Bildschirm).

    Filzstift habe ich bereits ausprobiert, aber das hat den Nachteil, dass man das gezeichnete nicht in eine Datei speichern kann :D .

    Der Grund für das direkte Zeichnen ist simpel: man kann wenn man eine Form verwendet nich auf darunterliegende Icons clicken, Fenster ziehen, etc.


    Ich hätte gehofft, dass sich eine Art Graphics Objekt aus einem Handle erstellen lässt, Ähnlich wie z.B. bei Graphics.FromHwnd(PictureBox1.Handle). Derartiges habe ich allerdings nicht gefunden.


    Ist es überhaupt realisierbar, dass man durch transparente Stellen hindurchklicken kann?
    Denn mit der TransparencyKey Eingenschaft auf 0; 0; 1 und der Hintergrundfarbe der Form 0; 0; 1 funktioniert es im Moment nicht, auch nicht mit anderen Farben (sollte es nicht eigentlich funktionieren?). Ich glaube ich es schon einmal geschafft durch transparente Stellen zu klicken. Könnte es damit zusammenhängen, dass ich das Codeschnipsel "formDrag" verwendet habe? (Anstelle von MyBase.MouseDown und MyBase.MouseMove habe ich PictureBox1.MouseDown und PictureBox1.MouseMove verwendet um eine PictureBox, welche einen Rahmen darstellt zu verschieben)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich hätte gehofft, dass sich eine Art Graphics Objekt aus einem Handle erstellen lässt, Ähnlich wie z.B. bei Graphics.FromHwnd(PictureBox1.Handle). Derartiges habe ich allerdings nicht gefunden.

    Das geht übrigens tatsächlich: Graphics.FromHandle(IntPtr.Zero)

    Allerdings soll manja nie ausserhalb eines PaintEvents und mit einem selbsterstellten Graphics zeichnen. Weil das Betriebssystem zeichnet auch, etwa wenn du ein Fenster verschiebst.
    Beim Zeichnen im Paint-Event wirst du darüber unterrichtet, und zeichnest dein Kram eben neu.

    Aber beim Zeichnen ausserhalb dieses Mechanismus kriegstes nicht mit, und dann sieht sehr komisch aus, wenn das OS Teile deiner Malereien übermalt.

    Aber vlt kann man das sogar hinkriegen, indem man alle Windows auffm Bildschirm subclassen tut, und auf deren WM_Paint - Message hört.
    Vielleicht Vielleicht kann man aus der Win-Message sogar das Rechteck herausfummeln, was neu gezeichnet wurde. Jedenfalls nicht so performant wäre, wenn du jedesmal den ganzen Bildschirm neu übermalen müsstest.

    Aber ich glaube mich zu erinnern, man konnte bei einem Form auch einen ExStyle setzen, sodaß Mausklickse hindurch gingen - das wäre glaub besser als ins IntPtr.Zero - Handle zu malen.
    Und dann mw. die Opacity des Forms auf 30% setzen, dann isses halbtransparent.

    Naja - ich finds jetzt nicht wieder :(
    @ X-Zat: Danke, jetzt funktioniert das mit der Transparenz wieder.

    @ ErfinderDesRades: Vielen vielen Dank. Es funktioniert! Allerdings wird wie von Dir bereits erwähnt das Gezeichnete von Windows übermalt. Mal sehen, was Subclassing ist. Vielleicht krieg ich das auch noch hin.

    Edit:

    Subclassing ist zwar interessant, aber das funktioniert nicht, wenn man mit der Maus über ein DesktopIcon fährt.


    Und es hat sich ein weiteres Problem ergeben: Das funktioniert nur auf dem ersten Bildschirm. Auf dem zweiten wird nichts gezeichnet, auch nicht wenn ich z.B. das zu zeichnende Rechteck über den rechten Bildschirmrand hinaus zeichne (siehe Anhang).
    Bilder
    • Unbenannt.png

      175,14 kB, 824×607, 241 mal angesehen
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()