Animate Window

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Animate Window

Beitrag von Fluid Byte »

Vielleicht nützt es ja wem.

Code: Alles auswählen

; ***********************************************
; *                                             *
; *      'Animate Window.pb'                    *
; *                                             *
; * Author: Fluid Byte                     *
; * Version: PureBasic V4.02                    *
; * E-Mail: fluidbyte@web.de                   *
; *                                             *
; ***********************************************

Declare WindowCallback(hWnd.l,Msg.l,wParam.l,lParam.l)

;-Varibales
Enumeration
    #BTN_Animate
    #FRM_Type
    #OPT_Blend
    #OPT_Slide
    #STR_Time
    #TXT_Time
    #TXT_Millisecs
    #FRM_Direction
    #OPT_Top
    #OPT_BottomRight
    #OPT_BottomLeft
    #OPT_Bottom
    #OPT_TopRight
    #OPT_Right
    #OPT_Left
    #OPT_TopLeft
    #OPT_Center
    #FRM_Visibility
    #OPT_Hide
    #OPT_Activate
EndEnumeration

#HIDE_DELAY = 400
#SHOW_DELAY = 300

Global Flags.l
Global AnimTime.w

;-Application Window
OpenWindow(0,233,45,327,225,"Animate Window",#WS_CAPTION | #WS_SYSMENU | #WS_MINIMIZEBOX | 1)

CreateGadgetList(WindowID(0))

Frame3DGadget(#FRM_Type,10,10,150,80,"Animation Type")
OptionGadget(#OPT_Slide,25,30,110,20,"Sliding Animation")
OptionGadget(#OPT_Blend,25,60,110,20,"Blending Animation")

Frame3DGadget(#FRM_Visibility,10,100,150,80,"Window Visibility")
OptionGadget(#OPT_Hide,25,120,90,20,"Hide Window")
OptionGadget(#OPT_Activate,25,150,100,20,"Activate Window")

Frame3DGadget(#FRM_Direction,175,10,140,135,"Slide Direction")
OptionGadget(#OPT_Top,235,35,15,15,"")
OptionGadget(#OPT_BottomRight,265,105,15,15,"")
OptionGadget(#OPT_BottomLeft,205,105,15,15,"")
OptionGadget(#OPT_Bottom,235,116,15,15,"")
OptionGadget(#OPT_TopRight,265,45,15,15,"")
OptionGadget(#OPT_Right,275,75,15,15,"")
OptionGadget(#OPT_Left,195,75,15,15,"")
OptionGadget(#OPT_TopLeft,205,45,15,15,"")
OptionGadget(#OPT_Center,235,75,15,15,"")

StringGadget(#STR_Time,255,160,35,20,"600",#PB_String_Numeric)
TextGadget(#TXT_Time,175,163,75,14,"Animation Time:")
TextGadget(#TXT_Millisecs,295,163,18,14,"Ms")

ButtonGadget(#BTN_Animate,10,190,310,29,"Animate Window")

;-Various
dwStyle = GetWindowLong_(GadgetID(#OPT_Blend),#GWL_STYLE)
SetWindowLong_(GadgetID(#OPT_Blend),#GWL_STYLE,dwStyle - #WS_TABSTOP)

dwStyle = GetWindowLong_(GadgetID(#OPT_Activate),#GWL_STYLE)
SetWindowLong_(GadgetID(#OPT_Activate),#GWL_STYLE,dwStyle - #WS_TABSTOP)

For i = #OPT_Top To #OPT_Center
    dwStyle = GetWindowLong_(GadgetID(i),#GWL_STYLE)
    
    SetWindowLong_(GadgetID(i),#GWL_STYLE,dwStyle - #WS_TABSTOP)
Next

SetGadgetState(#OPT_Slide,1)
SetGadgetState(#OPT_Hide,1)
SetGadgetState(#OPT_Left,1)

SetWindowCallback(@WindowCallback())

; ------------------------------------------------------------------------------------------------------
; MAIN LOOP
; ------------------------------------------------------------------------------------------------------

Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_Gadget
        Select EventGadget()
            Case #BTN_Animate
            AnimType = GetGadgetState(#OPT_Slide)
            Visibility = GetGadgetState(#OPT_Hide)
            
            If GetGadgetState(#OPT_Bottom) : Direction = 0 : EndIf
            If GetGadgetState(#OPT_BottomLeft) : Direction = 1 : EndIf
            If GetGadgetState(#OPT_BottomRight) : Direction = 2 : EndIf
            If GetGadgetState(#OPT_Left) : Direction = 3 : EndIf
            If GetGadgetState(#OPT_Right) : Direction = 4 : EndIf
            If GetGadgetState(#OPT_Top) : Direction = 5 : EndIf
            If GetGadgetState(#OPT_TopLeft) : Direction = 6 : EndIf
            If GetGadgetState(#OPT_TopRight) : Direction = 7 : EndIf
            If GetGadgetState(#OPT_Center) : Direction = 8 : EndIf
            
            If AnimType : Flags | #AW_SLIDE : Else : Flags | #AW_BLEND : EndIf 
            If Visibility : Flags | #AW_HIDE : Else : Flags | #AW_ACTIVATE : EndIf
            
            Select Direction
                Case 0 : Flags | #AW_VER_POSITIVE
                Case 1 : Flags | #AW_VER_POSITIVE | #AW_HOR_NEGATIVE
                Case 2 : Flags | #AW_VER_POSITIVE | #AW_HOR_POSITIVE
                Case 3 : Flags | #AW_HOR_NEGATIVE
                Case 4 : Flags | #AW_HOR_POSITIVE
                Case 5 : Flags | #AW_VER_NEGATIVE
                Case 6 : Flags | #AW_VER_NEGATIVE | #AW_HOR_NEGATIVE
                Case 7 : Flags | #AW_VER_NEGATIVE | #AW_HOR_POSITIVE
                Case 8 : Flags | #AW_CENTER
            EndSelect
            
            AnimTime = Val(GetGadgetText(#STR_Time))
            
            If Visibility
                SetTimer_(WindowID(0),0,AnimTime + #HIDE_DELAY,0)
                
                AnimateWindow_(WindowID(0),AnimTime,Flags) : Flags = 0
            Else
                ShowWindow_(WindowID(0),#SW_HIDE)
                
                SetTimer_(WindowID(0),0,#SHOW_DELAY,0)
            EndIf                        
        EndSelect
    EndIf    
Until EventID = #PB_Event_CloseWindow

; ------------------------------------------------------------------------------------------------------
; FUNCTIONS
; ------------------------------------------------------------------------------------------------------

Procedure WindowCallback(hWnd.l,uMsg.l,wParam.l,lParam.l)
    Result = #PB_ProcessPureBasicEvents

    Select uMsg
        Case #WM_TIMER
        If Flags & #AW_ACTIVATE
            KillTimer_(WindowID(0),0)
            
            AnimateWindow_(WindowID(0),AnimTime,Flags) : Flags = 0

            InvalidateRect_(GadgetID(#STR_Time),0,0) 
            SetWindowPos_(GadgetID(#STR_Time),0,0,0,0,0,#SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED) 
        Else
            KillTimer_(WindowID(0),0)
        
            ShowWindow_(WindowID(0),#SW_SHOW)
        EndIf
    EndSelect
    
    ProcedureReturn Result 
EndProcedure
Zuletzt geändert von Fluid Byte am 22.01.2017 15:23, insgesamt 5-mal geändert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Vielleicht nützt es ja wem.
Kannst du Gedanken lesen? Bild

Ist das hier alles?
> ShowWindow_(WindowID(0),#SW_SHOW)


Außerdem funktioniert deine "Methode" auch nicht vollständig: Nach deiner Blending Animation+Activating (dauer: 600 ms) ist dein StringGadget verschwunden. :o
Es erscheint erst wiede,r wenn man mit der Maus drüber fährt. und selbst dann auch nur sein Umriss. Es ist erst wieder zu 100% da, wenn man reinklickt.

Soll ich dir nen Vidoe davon schicken?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Soll ich dir nen Vidoe davon schicken?
Nö lass ma', Ich kenn' den Fehler. Habs korrigiert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Ich würde evtl. deine Email-Addy ausm Code verfälschen, wenn du ned unbedingt mit Müll vollgekackt werden willst.
(Es sei denn du stehst drauf... kann ja sein ;) )
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Mein Spamfilter funktioniert herrvorragend. Von 100 emails kommt genau eine durch und wird auch noch als "verdächtig" makiert. Bild
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Idee: Es gibt doch einen Befehl, um ein Fenster transparent zu machen, man übergibt einen Wert von 1 bis 255.
In PBSOL oder Doopys Lib hieß der Befehl SetWindowsTransparency(). Dann zähl ich das mit ner FOR-Schleife hoch. Wenn das funktioniert, wie ich mir das vorstelle, dann brauch ich keinen Refresh.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

SetLayeredWindowAttributes_()
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

So ein Quatsch :lol:

Aber ich find's cool :mrgreen:

:allright: :allright: :allright:
Kinder an die Macht http://scratch.mit.edu/
Antworten