Seite 1 von 1

ResizeWindow und Gadgets (Fensterbewegung)

Verfasst: 02.03.2011 18:12
von Bisonte
Hallo.

Ich habe da ein klitzekleines Problemchen und brauche daher Fachkundigen Beistand ;)

Ich möchte einen Effekt a'la Toolbar unter XP basteln. (Man fährt mit der Maus an den Desktoprand
und das Fenster geht auf)

Ich habe dies auch schon funktionsfähig am laufen, aber irgendwie sieht es falsch aus.
Wenn das Fenster aufgeht, sind eventuelle Gadgets erst sichtbar, wenn das Fenster komplett
"ausgefahren" ist. Beim "verschwinden" sind sie immer sichtbar.

Ich hatte da nun den bösen Eventfresser While WindowEvent():Wend eingebaut, aber das ist ja
verpönt... gibt es eine andere (systemkonformere) Lösung um ein Fenster auszuklappen als meine
gebaute Variante ?

Ah und falls WindowsApi im Spiel sein sollte, ab WinXP soll es lauffähig sein.

Hier mein Beispiel:

Code: Alles auswählen

ExamineDesktops()
dw = DesktopWidth(0)
dh = DesktopHeight(0)

ww = 200 : wh = 100
wx = dw-ww : wy = (dh/2) - (wh/2)

Show = 0

Win = OpenWindow(#PB_Any,wx+ww-5,wy,ww,wh,"Window",#PB_Window_BorderLess)
StickyWindow(Win,1)
SetWindowColor(Win,RGB(255,0,255))
SetWindowLongPtr_(WindowID(Win),#GWL_EXSTYLE,GetWindowLongPtr_(WindowID(Win),#GWL_EXSTYLE) | #WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(Win), RGB(255,0,255), 0, 1)

SmartWindowRefresh(Win, 1) 

ButtonGadget(0,6,20,100,20,"Hallo")

Repeat
  
  Event = WaitWindowEvent(15)
  
  mx = WindowMouseX(Win)
  my = WindowMouseY(Win)
  
  If Event = #PB_Event_CloseWindow
    Quit = 1
  EndIf
  
  Select show
    Case 0
      If mx>-1
        For x= wx+ww-5 To wx Step -1
          ResizeWindow(Win,x,wy,ww,wh)
          ;While WindowEvent() : Wend
          Delay(1)
        Next x
        show=1
      EndIf
    Case 1
      If mx<=-1
        For x = wx To wx+ww-5
          ResizeWindow(Win,x,wy,ww,wh)
          ;While WindowEvent() : Wend
          Delay(1)
        Next x
        show=0
      EndIf
  EndSelect
  
Until Quit = 1

Re: ResizeWindow und Gadgets (Fensterbewegung)

Verfasst: 02.03.2011 18:32
von Kiffi
such mal nach AnimateWindow_()

(beispielsweise hier: http://www.purebasic.fr/german/viewtopi ... 18#p149318)

Alles andere ist IMO entweder stark Augenkrebsverursachend oder unnötig
umständlich in PB zu programmieren.

(Ich lass mich aber auch gerne eines besseren belehren ;-))

Grüße ... Kiffi

Re: ResizeWindow und Gadgets (Fensterbewegung)

Verfasst: 02.03.2011 18:35
von RSBasic
Das Problem, das du hast, kann ich leider bei mir nicht nachvollziehen, weil dieses bei mir leider nicht auftritt. Vielleicht liegt es an meinem klassisch. Design.
Und da ich also nicht weiß, woran das liegen könnte, kann ich höchstens zwei WinAPIs posten, falls es hift:
SendMessage_(hwnd,#WM_NCPAINT,1,0)
Oder:
InvalidateRect_(hwnd, #Null, #True)

\\Edit:
Die Lösung von Kiffi schaut gut aus, ist auch das, was du brauchst, um Fenster zu animieren. ;)

Re: ResizeWindow und Gadgets (Fensterbewegung)

Verfasst: 02.03.2011 19:55
von Rudi
Da würde ich doch Kiffis Vorschlag verfolgen, Beispiel:

Code: Alles auswählen

Procedure OpenWindow_Window_1()
  If OpenWindow(0, (GetSystemMetrics_(#SM_CXSCREEN)/2)-50, 0, 150, 40, "", #PB_Window_Invisible|#PB_Window_BorderLess|#WS_POPUPWINDOW)
    ButtonGadget(0, 25, 10, 100, 20, "Button")
    StickyWindow(0, 1)
    AnimateWindow_(WindowID(0), 2000, #AW_VER_POSITIVE|#AW_SLIDE|#AW_ACTIVATE)
  EndIf
EndProcedure

OpenWindow_Window_1()
Auf die Kombination der Flags achten! Das Beispiel von Bisonte macht bei mir garnichts!

Re: ResizeWindow und Gadgets (Fensterbewegung)

Verfasst: 02.03.2011 20:00
von RSBasic
Rudi hat geschrieben:Das Beispiel von Bisonte macht bei mir garnichts!
Deine Maus muss auch am rechten Rand deines Bildschirms sein, so dass das Fenster eingeblendet wird.

Re: ResizeWindow und Gadgets (Fensterbewegung)

Verfasst: 02.03.2011 20:48
von Rudi
Jetzt hab' ich es auch gesehen. Die Maus muss sich also ziemlich in der Mitte am rechten Rand befinden...

Re: ResizeWindow und Gadgets (Fensterbewegung)

Verfasst: 02.03.2011 21:23
von Bisonte
Also ich nutze hier grad Win7 und dort tritt der Fehler auf, dass das Gadget nicht angezeigt wird beim
aufklappen.
Wenn man allerdings das While..... auskommentiert, dann funktioniert es...

Das Beispiel von Kiffi (äh FluidByte) sieht ganz gut aus (Hat allerdings Ruckler), ist aber INNERHALB eines Fensters.
Ich bräuchte ja das komplette ganze, nicht den Inhalt.

Aber die Funktion AnimateWindow muss ich mir jetzt mal genauer anschauen, das sah vielversprechend aus ;)