Seite 1 von 1

Schlagschatten für Fenster/Objekte?

Verfasst: Di, 14. Feb 2006 16:43
von Tom
Huhu.

Es muß eine Möglichkeit (ab Windows 2000) geben, Fenster mit einem Schlagschatten zu versehen. Ich finde die API-Funktion(en) dafür aber nicht. Kennt sie jemand?

Verfasst: Di, 14. Feb 2006 17:12
von thomas
Hallo Tom.

Schau doch mal hier nach. http://msdn.microsoft.com/library/deu/d ... nlp_rp.asp

Gruß

Thomas

Verfasst: Di, 14. Feb 2006 17:33
von Tom
Hallo, Thomas.

:lol: Das hatte ich auch schon gefunden, aber ich will nicht auf die API von Visual FoxPro zugreifen, sondern auf die Windows-API. :?:

Verfasst: Di, 14. Feb 2006 17:33
von Manfred
Hi Tom,

öhm, was ist ein Schlagschatten?

Verfasst: Di, 14. Feb 2006 17:43
von Tom
Hallo, Manfred.

Ein halbtransparenter Schatten an einem Fenster/Objekt. Wie in diesem Beispiel hier:

Bild

Verfasst: Di, 14. Feb 2006 17:51
von Manfred
Hi Tom,

danke für die Mühe, aber ich kann keinen halbtransparenten Schatten erkennen. Brille habe ich geputzt, hat aber nicht geholfen.

Vielleicht liegt es am Firefox.

Egal, war nur ne Frage so am Rande. Mach Dir keine weitere Mühe.

Verfasst: Di, 14. Feb 2006 17:53
von Tom
@Manfred: Hinter dem eingekreisten Tooltip.

Verfasst: Di, 14. Feb 2006 17:54
von Manfred
das hatte ich vermutete, dass es sowas ist, aber ich habe es zum Verrecken nicht gesehen. Altersmuff..... :evil:

Hm, mit den Tools geht das auf Textbasis. Schade

Verfasst: Mi, 15. Feb 2006 9:58
von Lewi
Die Anzeige von Schlagschatten für Menüs ist unter XP einstellbar. Das es Schlagschatten auch für Dialoge bzw. Fenster geben soll, ist mir neu. Zumindest habe dafür noch keine Einstellung unter Windows finden können.

Wird über XP die Anzeige von Schlagschatten aktiviert, gilt dies auch für xbase-Programme.

Verfasst: Mi, 15. Feb 2006 10:03
von boddy
Hallo Tom,

soweit ich gehört (gelesen) habe, sind Fenster seit Windows XP mit Schlagschatten ausgestattet.

Steuern kann man sie mit SetClassLong (SetClassLongA) bzw. GetClassLong (GetClassLongA) aus der user32.dll über den GCL_STYLE Parameter.

gruß
boddy

Verfasst: Mi, 15. Feb 2006 15:32
von Tom
Danke, Boddy, das waren sie. :)

Also, API-Funktionen gefunden. Das ist der Korpus:

Code: Alles auswählen

#define GCL_STYLE -26
#define CS_DROPSHADOW 0x20000

DLLFUNCTION GetClassLongA( hWnd, nIndex ) ;
USING STDCALL FROM USER32.DLL
DLLFUNCTION SetClassLongA( hWnd, nIndex, dwNewLong ) ;
USING STDCALL FROM USER32.DLL

FUNCTION SetDropShadow(nHandle)
LOCAL nNewStyle
IF !"Windows XP" $ Os() // läuft nur mit XP
  RETURN nil
ENDIF
SetClassLongA(nHandle,GCL_STYLE,0) // Reset des Styles
nNewStyle := GetClassLongA(nHandle,GCL_STYLE)+CS_DROPSHADOW // Dropshadow-Wert ermitteln
SetClassLongA(nHandle,GCL_STYLE,nNewStyle) // Dropshadow setzen
RETURN nil
Aufruf:

Code: Alles auswählen

... neues Fensterobjekt erzeugen

nHandle := oDlg:GetHwnd()
SetDropShadow(nHandle)
oDlg:Show()
Das funktioniert auch ganz gut, aber offensichtlich "erben" alle im Folgenden entstehenden Fensterobjekte diesen Style, und das ist nicht im Sinne des Erfinders. Sieht jemand den Fehler? :?

Edit: Außerdem verlangsamt sich die Applikation (Fensteraufbau) spürbar. Irgendwas ist da noch im Busch...

Verfasst: Mi, 15. Feb 2006 17:47
von olaf870
Hi Tom,
bei deinem Code habe ich ein ganz anderes Problem. Der Rahhmen verschwindet von alleine wieder. Auf den folgenden ist er auch nicht zu sehen.

Wenn das bei Dir nicht passiert, dann mußt Du ihn wohl manuell ausschalten. Z.B. ev. mit:

Code: Alles auswählen

#define SPI_SETDROPSHADOW	0x1025
SystemParametersInfo(SPI_SETDROPSHADOW, ,.F. )
Gruß
Olaf

Verfasst: Mi, 15. Feb 2006 17:50
von Tom
Hallo, Olaf.

Ich glaube, ich habe die Ursache gefunden; nachher mehr.

Der Vorschlag, quasi die Systemsteuerung zu übernehmen/überschreiben, ist zwar originell, aber geht m.E. ein bißchen zu weit. Trotzdem danke!