Frage

Blick auf ein Fenster tooltips Ich sehe im Hinweisfenster der Klasse, dass es seinen Schlagschatten zeichnet draußen das tatsächliche Rechteck des Hinweisfensters.

Benutzen SpyXX - Ich kann das Fensterrechteck und die Klassenstile des Tooltips abrufen:

Rectangle:     (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect:   (0, 0)-(104, 20), 104x20

Sie werden feststellen, dass der Schlagschatten, den Sie sehen, physisch ist draußen das Fenster, das gezeichnet wird.Wie kann ich draußen um mein Fenster einen Schatten zeichnen, während ich bin? draußen mein Fenster?

Notiz: Der Schatten wird nicht nach dem Standard gezeichnet CS_DROPSHADOW Klassenstil. Ich habe dies experimentell bestätigt und kann auch die Klassenstile für das Fenster sehen SpyXX;es nutzt nicht CS_DROPSHADOW:

Windows Styles:     94000001

    WS_POPUP        80000000
    WS_VISIBLE      10000000
    WS_CLIPSIBLINGS  4000000
    TTS_ALWAYSTIP          1

Extended Styles:    00080088

    WS_EX_LAYERED      80000
    WS_EX_TOOLWIN         80
    WS_EX_TOPMOST          8

Wie kann ich also außerhalb meines Fensters zeichnen?

Notiz: Der Versuch, auf dem Desktop-DC zu zeichnen, ist nicht möglich.Von Greg Schechter Umleiten von GDI-, DirectX- und WPF-Anwendungen:

Zeichnen und Lesen vom Bildschirm - Baaaad!

Schließlich, da wir uns mit dem Umbauthema befinden, schreibt eine besonders gefährliche Praxis auf den Bildschirm, entweder durch die Verwendung von GETDC (NULL) und das Schreiben darauf oder versuchen, XOR-Gummi-Band-Linien zu machen, usw.Es gibt zwei große Gründe, warum das Schreiben auf den Bildschirm schlecht ist:

Es ist teuer...Das Schreiben auf den Bildschirm selbst ist nicht teuer, wird aber fast immer durch Lesen vom Bildschirm begleitet, da man normalerweise beim Schreiben auf den Bildschirm lesende Vorgänge wie XOR wie XOR les modifizieren.Das Lesen von der Video -Speicheroberfläche ist sehr teuer, erfordert eine Synchronisation mit dem DWM und stellt das gesamte GPU -Rohr sowie das DWM -Anwendungsrohr auf.
Es ist unvorhersehbar...Wenn Sie es irgendwie schaffen, zur tatsächlichen Primäranlage zu gelangen und darauf zu schreiben, kann es keine Vorhersehbarkeit geben, wie lange das, was Sie an die Primärin geschrieben haben, auf dem Bildschirm bleiben.Da die UCE nichts davon weiß, kann sie in der nächsten Frame -Aktualisierung gelöscht werden, oder es kann sehr lange bestehen bleiben, je nachdem, was sonst noch auf dem Bildschirm aktualisiert werden muss.(Wir erlauben sowieso kein direktes Schreiben in die Primäranlage, aus diesem Grund ...Wenn Sie beispielsweise versuchen, auf die DirectDraw Primary zuzugreifen, schaltet sich das DWM aus, bis der Zugriff auf Anwendung ausgeht.

War es hilfreich?

Lösung

Sie können nicht auf die von Ihnen beschriebene Weise außerhalb Ihres Fensters zeichnen.

Wenn Sie mit der rechten Maustaste auf Ihren Desktop klicken, gehen Sie zu Eigenschaften/Darstellung/Effekte und deaktivieren Sie „Schatten unter Menüs anzeigen“ ...Du wirst den Schatten nicht mehr haben.

Unterm Strich ist dies ein Produkt des Fenstermanagers, nicht Ihres Programms.

Andere Tipps

Q:Wie zeichnet man außerhalb eines Fensters?A:Zeichne hinein ein anderer Fenster!

Als erstes ist zu beachten, dass es sich tatsächlich um die Tooltip-Klasse handelt tut Benutze die CS_DROPSHADOW Stil - aber beachten Sie, dass dies ein ist Klasse Stil, nicht ein Fenster Stil, also muss man sich das ansehen Klasse Klicken Sie im Eigenschaftendialog von Spy++ auf die Registerkarte, um es zu finden.Sie werden sehen, dass die tooltips_class32 Windows hat dies tatsächlich – und einige andere.

Aber das führt nur zur nächsten Frage: Wie funktioniert das? Das arbeiten?Nun, es scheint, dass Windows dies implementiert, indem es ein Hilfs-HWND zum Zeichnen des Schattens erstellt. Vermutlich erstellt es ein weiteres Popup-Fenster mit der gleichen Größe und Form wie das, das es schattiert, füllt es mit Grau, platziert es direkt unter dem Hauptfenster und stellt es ein es als WS_EX_LAYERED Fenster so, dass der Schatten transparent ist und mithilfe von Alpha-Blending an den Rändern ausgeblendet wird.Und nichts hindert Sie daran, dieselben oder ähnliche Techniken selbst anzuwenden, wenn Sie einem Ihrer eigenen Fenster einen anderen Schatteneffekt hinzufügen möchten.

Also, lange Rede, kurzer Sinn: Wenn Sie außerhalb Ihres eigenen Fensters zeichnen möchten, erstellen Sie ein transparentes Hilfsfenster in dem allgemeinen Bereich, in dem Sie zeichnen möchten, und zeichnen Sie stattdessen in diesem Hilfsfenster.

--

Wenn Sie nun versuchen, eines dieser Hilfsschattenfenster in Spy++ zu finden, werden Sie nicht viel finden.im Gegensatz zu den tooltip_class32 Fenster, die langlebig sind und sich bei Bedarf einfach verstecken/zeigen, diese Schattenfenster sind eine schwer fassbare Kreatur:Sie werden nur so lange wie nötig erstellt, sodass Sie Spy++ aktualisieren müssen, während ein Tooltip, ein Popup-Menü oder ein anderes Fenster mit dem vorhandenen Schatten vorhanden ist – und das ist schwierig, da die meisten Tooltips und Menüs verschwinden, sobald Sie das verschieben Maus, um zu Spy++ zu wechseln.Es stellt sich jedoch heraus, dass die Tooltips in der Symbolleiste von Spy++ erhalten bleiben:Starten Sie also Spy++, bewegen Sie den Mauszeiger über ein Element in der Symbolleiste und klicken Sie F5 um den HWND-Baum zu aktualisieren, während Tooltip und Schatten vorhanden sind.Scrollen Sie nun nach unten, und Sie sollten sehen, dass der dritte und vierte sichtbare HWND in der Baumstruktur der Tooltip selbst sind, und gleich danach a SysShadow Fenster.Da der Tooltip und der Schatten inzwischen verschwunden sind, wird beim Versuch, das Eigenschaftendialogfeld für dieses HWND aufzurufen, leider ein leeres Eigenschaftendialogfeld mit der Meldung „Ungültiges Fenster“ angezeigt.Wenn Sie wirklich herumstöbern und sehen möchten, wie SysShadow funktioniert, welche Stile es selbst verwendet usw., können Sie eine Ziel-App mit einem langlebigen Popup erstellen, das verwendet CS_DROPSHADOW die Sie dann in Spy++ in aller Ruhe erkunden können.

(Beachten Sie abschließend, dass diese Schatten etwas völlig anderes sind als die Schatten, die Sie sehen, wenn sich seit Vista ein App-Fenster über einem anderen über einem anderen befindet:Diese Art von Schatten ist Teil des Aero Glass-Modus und wird von diesem verarbeitet Desktop-Kompositionsmanager Dadurch wird der gläserne Titelleisteneffekt hinzugefügt, und es werden keine Hilfsfenster verwendet oder benötigt, um die Schatten zu implementieren.)

Es würde mich nicht wundern, wenn dieser Schatten eng mit dem Fenstermanager selbst verbunden wäre.Es ist schließlich der Fenstermanager, der entscheidet Was Fenster darf gestrichen werden welche Teile von sich selbst und Wann es kann es tun.Ich halte es nicht für ein Hexenwerk, diesen Schatten zu malen, wenn man die Kontrolle über alles erlangt, was der Fenstermanager hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top