Transparenz

Moderator: Moderatoren

Antworten
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Transparenz

Beitrag von Rudolf »

Hallo,
ich würde gerne für Überblendung die Transparenz eines Fensterinhalts bzw. eines Static verändern. Habe Rogers Timer Beispiel abgeändert, aber es funktioniert nur mit dem kompletten Fenster. Wie kann ich nur den Fensterinhalt bzw. ein Static verändern ? Ich würde zur Überblendung von 2 Bitmaps zwei Statics erstellen, welche ich dann übereinanderblende (falls das überhaupt geht).
Ausserdem muss ich ein Delay einbauen, da ich sonst eine Fehlermeldung bei bekomme oDlg:gethwnd() : Receiver of message is not an object.
Grüße
Rudolf

Code: Alles auswählen

#INCLUDE "dcdialog.CH"

LOCAL GetList[0], GetOptions, oTimer, oDlg, aBitmaps

aBitmaps := Directory('test*.bmp')

DCGETOPTIONS ;
   WINDOWWIDTH 1024 ;
   WINDOWHEIGHT 800

oTimer := DC_SetTimerEvent():new(200,{||ChangeBackground(@oDlg,aBitmaps)})

DCREAD GUI TITLE 'Rotating Bitmap Backgrounds' PARENT @oDlg OPTIONS GetOptions

oTimer:destroy()

RETURN nil

* -----------

PROC appsys ; RETURN

* -----------

STATIC FUNCTION ChangeBackground( oDlg, aBitmaps )
******************************************************************
STATIC snPointer := 0,lFirst ,oDA
LOCAL oBitmap
local nHandle,nTransparency,i
if empty(lFirst)
     sleep(10)
     lFirst := .f.
endif
nHandle := oDlg:getHwnd()
snPointer++

IF oDlg == nil .OR. oDlg:status() = 0 .OR. Len(aBitmaps) = 0
  RETURN nil
ENDIF

IF snPointer > Len(aBitmaps)
  snPointer := 1
ENDIF

oBitmap := DC_GetBitmap(aBitmaps[snPointer,1])

DC_SetWindowTransparency(nHandle,0)
FOR i := 0 TO 100 STEP 3
  Sleep(1)
  nTransparency := i// weniger transparenz
  DC_SetWindowTransparency(nHandle,nTransparency)
NEXT

DC_SetWindowTransparency(nHandle,100)
oDlg:lockUpdate(.t.)
oDlg:drawingArea:bitmap := oBitmap
oDlg:configure()
oDlg:lockUpdate(.f.)

FOR i := 100 TO 1 STEP -3
  Sleep(1)
  nTransparency := i // weniger transparenz
  DC_SetWindowTransparency(nHandle,nTransparency)
NEXT

DC_SetWin
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Transparenz

Beitrag von AUGE_OHR »

Rudolf hat geschrieben:ich würde gerne für Überblendung die Transparenz eines Fensterinhalts bzw. eines Static verändern.
du kannst die Transparenz eines "Fenster" verändern aber nicht die von einem XbPart.

Nachtrag : du kannst aber anscheint einen XbPart per AnimateWindow verwenden

Code: Alles auswählen

#define AW_HOR_POSITIVE 0x00000001
#define AW_HOR_NEGATIVE 0x00000002
#define AW_VER_POSITIVE 0x00000004
#define AW_VER_NEGATIVE 0x00000008

#define AW_CENTER 0x00000010
#define AW_HIDE 0x00010000
#define AW_ACTIVATE 0x00020000
#define AW_SLIDE 0x00040000
#define AW_BLEND 0x00080000

DLLFUNCTION AnimateWindow(hwnd,dwTime,dwFlags) USING STDCALL FROM USER32.DLL
gruss by OHR
Jimmy
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Transparenz

Beitrag von Rudolf »

Hallo Jimmy,
habs probiert, aber funktioniert nicht. Ich könnte aber auch randlosese Fenster erstellen welche ich mit dem Hauptdialog fix verbinde
Grüße
Rudolf



Code: Alles auswählen

STATIC function animatedlg(oDlg,dwTime,cMode)
******************************************************************
local nHwnd,dwFlags,getlist := {},oGrp1,oGrp2,lOk := .f., dwFlags1, dwFlags2
default dwTime to 5
default cMode to "BLEND"
dwFlags1 := AW_BLEND
dwFlags2 := AW_HOR_POSITIVE
do while .t.
     getlist := {}
     @ 1,1 dcsay "Time" get dwTime pict "9999999" saysize 0
     @ 2,1 dcgroup oGrp1 size 15,6 title "param 1"
     @ 1,1 dcradio dwFlags1 CAPTION "CENTER"    VALUE 0x00000010 parent oGrp1
     @ 2,1 dcradio dwFlags1 CAPTION "HIDE"      VALUE 0x00010000 parent oGrp1
     @ 3,1 dcradio dwFlags1 CAPTION "ACTIVATE"  VALUE 0x00020000 parent oGrp1
     @ 4,1 dcradio dwFlags1 CAPTION "SLIDE"     VALUE 0x00040000 parent oGrp1
     @ 5,1 dcradio dwFlags1 CAPTION "BLEND"     VALUE 0x00080000 parent oGrp1

     @ 9,1 dcgroup  oGrp2 size 15,6 title "param 2"
     @ 1,1 dcradio dwFlags2 CAPTION "HOR_POSITIVE"  VALUE 0x00000001 parent oGrp2
     @ 2,1 dcradio dwFlags2 CAPTION "HOR_NEGATIVE"  VALUE 0x00000002 parent oGrp2
     @ 3,1 dcradio dwFlags2 CAPTION "VER_POSITIVE"  VALUE 0x00000004 parent oGrp2
     @ 4,1 dcradio dwFlags2 CAPTION "VER_NEGATIVE"  VALUE 0x00000008 parent oGrp2

     dcread gui fit addbuttons to lOk
     if !lOk
          exit
     endif
     if !empty(dwFlags1) .and. !empty(dwFlags2)
          altd()
          nHwnd := oDlg:gethwnd()
          dwFlags := dwFlags1 + dwFlags2
          AnimateWindow(nHwnd,dwTime,dwFlags)
     endif
enddo

return .t.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Transparenz

Beitrag von AUGE_OHR »

Rudolf hat geschrieben:habs probiert, aber funktioniert nicht.
Ich könnte aber auch randlosese Fenster erstellen welche ich mit dem Hauptdialog fix verbinde

Code: Alles auswählen

STATIC function animatedlg(oDlg,dwTime,cMode)
   dwFlags1 := AW_BLEND
   dwFlags2 := AW_HOR_POSITIVE

          altd()
          nHwnd := oDlg:gethwnd()
          dwFlags := dwFlags1 + dwFlags2
          AnimateWindow(nHwnd,dwTime,dwFlags)
kein Wunder ... wenn du es nicht AW_HIDE / AW_ACTIVATE (wie o:Hide() / o:Show() ) benutzt was soll es da tun ?

Code: Alles auswählen

   AnimateWindow(oStatic:GetHwnd() ,500,AW_HIDE+AW_CENTER )
   oStatic:SetCaption("schlafe")
   SLEEP(100)
   AnimateWindow(oStatic:GetHwnd() ,500,AW_ACTIVATE+AW_CENTER )

   AnimateWindow(oStatic:GetHwnd() ,500,AW_HIDE+AW_SLIDE+AW_HOR_POSITIVE )
   oStatic:SetCaption("hallo")
   SLEEP(100)
   AnimateWindow(oStatic:GetHwnd() ,500,AW_ACTIVATE+AW_SLIDE+AW_HOR_POSITIVE )
btw.
AW_HOR_POSITIVE
0x00000001

Animates the window from left to right. This flag can be used with roll or slide animation.
It is ignored when used with AW_CENTER or AW_BLEND.
du kannst nicht alle "beliebigen" Kombinationen nehmen siehe https://msdn.microsoft.com/en-us/librar ... 85%29.aspx

nur bei einem "Top-Level" Windows (Dialog) kannst du AW_BLEND benutzen

Code: Alles auswählen

   AnimateWindow(oDlg:GetHwnd() ,500,AW_HIDE+AW_BLEND )
   oStatic:SetCaption("und weg ...")
   SLEEP(100)
   AnimateWindow(oDlg:GetHwnd() ,500,AW_ACTIVATE+AW_BLEND )
Dateianhänge
Animate.zip
(7.93 KiB) 289-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Transparenz

Beitrag von Rudolf »

Hallo Jimmy,
danke, funktioniert jetzt, hab die Doku nicht gelesen. Nur wird der Dialog noch zerstört beim wiedereinblenden, muss suchen wie das vermeide.
Grüße
Rudolf
Dateianhänge
nachher.jpg
nachher.jpg (74.3 KiB) 4640 mal betrachtet
vorher.jpg
vorher.jpg (79.33 KiB) 4640 mal betrachtet
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Transparenz

Beitrag von Rudolf »

Hallo Jimmy,
ein oDlg:configure() löst das Problem. Jetzt kann ich ein paar Dinge eleganter lösen als mit Rogers Beispielen. Mein Programm wird in die Taskbar gelegt wenn der Dialog geschlossen wird, bis jetzt musst ich ihn immer neu aufbauen, nun kann ich das mit hide und activate lösen. Muss nur noch schauen wie ich alle child Fenster auch ausblende.
Grüße
Rudolf
Antworten