2015-05-06 15 views
5

Ich muss ein randloses Fenster mit der angegebenen Hintergrundfarbe erstellen. Ich weiß, wie eine nicht Client-Bereich zu entfernen und etwas wie folgt aus:Randloses Fenster. Wie füge ich einen Schatten hinzu und entferne 1px Grenze?

enter image description here

Es ist cool, aber nicht wirklich, was ich will. Wenn man sich ein Aero-Fenster genauer anschaut - es ist ein Schatten um ihn herum (eigentlich ist das kein Schatten, sondern ein bisschen Glühen). Ich fand irgendwo, dass ich diesen Code verwenden, um einen Schatten hinzuzufügen:

const MARGINS shadow_on = { 1, 1, 1, 1 }; 
DwmExtendFrameIntoClientArea(hwnd, &shadow_on); 

Es tut fast es der Aufgabe (dachte, das mir absolut nicht klar ist - Dokumentation sagt nichts über Verhältnis von Schatten und dieser Funktion). Fast. Da ist eine dünne Grenze um das Fenster herum. Es sieht aus wie es ist halbtransparent und es bricht das Look and Feel des Fensters:

enter image description here

Ich weiß, dass es möglich ist - das Visual Studio sogar die Farbe dieser Grenze irgendwie ändern!

Update: wie IInpectable in Kommentaren bemerkt Ich kann negative Margen in DwmExtendFrameIntoClientArea() verwenden. Ich habe Wert -1 und bekam dieses Ergebnis:

enter image description here

Wie Sie sehen können - es ist noch seltsamer. Ich habe versucht, einen Hintergrund mit Farbe zu füllen, aber ohne Glück.

+0

Sie können die Fensterfläche befestigen die Glut zu entfernen. Hast du schon versucht es zu schneiden, um das Glühen zu entfernen? Es kann sein, dass Sie das Glühen nicht loswerden und gleichzeitig Schatten benutzen können. – icbytes

+0

@icbytes nein, du hast es nicht verstanden - ich brauche ein Glühen - ich brauche keinen Rand, der erscheint, wenn ich ein Glühen hinzufüge. – nikitablack

+0

Verwenden Sie dann nicht die erwähnte Funktion. Zeichne es selbst. Ein px Linien, auf allen Seiten, mit einem leichten hellgrün. – icbytes

Antwort

1

Um ein Pixel Grenze zu entfernen, nachdem diese Funktion aufrufen:

const MARGINS shadow_on = { 1, 1, 1, 1 }; 
DwmExtendFrameIntoClientArea(hwnd, &shadow_on); 

Sie benötigen WndProc WM_NCCALCSIZE Nachricht außer Kraft zu setzen, und das Rück 0 als das Ergebnis. Auch müssen Sie Fenster mit WS_CAPTION Stil erstellen. (Unter Windows XP erzeugt dieser Code kein rechteckiges Fenster, aber es gibt keinen Schatten auf WinXP, also sollten Sie unter Windows XP auf Fensterstil zurückgreifen)
Übrigens, um Schatten hinzuzufügen, reicht es, diese Ränder zu verwenden:
const MARGINS shadow_on = { 1, 0, 0, 0 };

ist hier sauber Windows-API Code-Beispiel, wie solche Fenster zu erstellen, ist es auf Delphi geschrieben: https://stackoverflow.com/a/44489430/877099