ResizeWindow und Gadgets (Fensterbewegung)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

ResizeWindow und Gadgets (Fensterbewegung)

Beitrag 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
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ResizeWindow und Gadgets (Fensterbewegung)

Beitrag 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
a²+b²=mc²
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ResizeWindow und Gadgets (Fensterbewegung)

Beitrag 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. ;)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: ResizeWindow und Gadgets (Fensterbewegung)

Beitrag 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!
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ResizeWindow und Gadgets (Fensterbewegung)

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: ResizeWindow und Gadgets (Fensterbewegung)

Beitrag von Rudi »

Jetzt hab' ich es auch gesehen. Die Maus muss sich also ziemlich in der Mitte am rechten Rand befinden...
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: ResizeWindow und Gadgets (Fensterbewegung)

Beitrag 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 ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten