SkinnedWindow verschiebbar machen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

SkinnedWindow verschiebbar machen

Beitrag von bluejoke »

Hallo!

Kann man ein Skinned Window irgendwie komfortabel verschiebbar machen?
Am besten mit einem einzigen Befehl und keiner Eventabfrage...

Danke
Simon
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

hier siehst du an einem kleinen beispiel wie du das machen kannst

Code: Alles auswählen

wnd = OpenWindow(0,0,0,200,200,#WS_POPUP,"")
CreateGadgetList(WindowID())
ButtonGadget(0,10,10,100,20,"Close")


Repeat
  GetCursorPos_(MousePos.POINT) 
  If WindowFromPoint_(MousePos\x,MousePos\y)=wnd 
    ReleaseCapture_() 
    SendMessage_(wnd,#WM_NCLBUTTONDOWN, #HTCAPTION,0) 
  EndIf
  Event = WaitWindowEvent()
  If Event = #PB_Event_Gadget
    gadget = EventGadgetID()
    If gadget = 0
      Quit = 1
    EndIf
  EndIf
Until Quit = 1
hoffe das hilft
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Das ist genau das, was ich gesucht habe! Danke!

Ich hab aber noch ein Problem, das nur dann auftritt, wenn man die kompilierte Exe aufruft:
Wenn man beim laden des Programms bereits mit der Maus über den Bereich des Fensters fährt, ohne die Maus zu drücken, dann wird das Fenster auch verschoben, was sehr eigenartig wirkt, wenn plötzlich das Fenster ganz rechts unten in der Ecke ist...
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

dann setz doch einfach direkt nach OpenWindow() ein HideWindow(deineWindowID,1)
und eine zeile über repeat einfach wieder HideWindow(deineWindowID,0)
das dürfte helfen und dein fenster wird erst gezeigt wenn es aufgebaut is
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

hab ich ja schon... ich probiers mal so, dass das HideWindow erst dann aufgehoben wird, wenn die Schleife einmal durchgelaufen ist...

EDIT: Also der Fehler tritt immer noch auf, aber nicht mehr so häufig...
Wie kann man denn Abfragen (in einer normalen Windows-Apllikation) ob die Maustaste gedrückt ist? Oder falls das nicht geht, ob die Maustaste gedrückt wurde und wann sie wieder losgelassen wurde...
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

ok dann versuch es mal so

Code: Alles auswählen

left=#VK_LBUTTON+GetSystemMetrics_(#SM_SWAPBUTTON) 
wnd = OpenWindow(0,0,0,200,200,#WS_POPUP,"") 
CreateGadgetList(WindowID()) 
ButtonGadget(0,10,10,100,20,"Close") 

Repeat 
  GetCursorPos_(MousePos.POINT)
  If WindowFromPoint_(MousePos\x,MousePos\y)=wnd And GetAsyncKeyState_(left)
    ReleaseCapture_() 
    SendMessage_(wnd,#WM_NCLBUTTONDOWN, #HTCAPTION,0) 
  EndIf 
  Event = WaitWindowEvent() 
  If Event = #PB_Event_Gadget 
    gadget = EventGadgetID() 
    If gadget = 0 
      Quit = 1 
    EndIf 
  EndIf 
Until Quit = 1
hoffe das das jetzt dein prob beseitigt
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Das ist echt komisch...
Also das ganze tritt nur auf, wenn man sich bereits über der Position befindet, an der das Fenster erscheint. Das Fenster wird zuerst so verschoben, dass die linke obere Ecke unter dem - jetzt beschäftigt- cursor ist. Das Fenster wird dann mitgenommen...

Ich mach mal einen Screenshot wie das dann aussieht.

So:
Bild

Im Editor tritt das Problem übrigens nicht auf, da funzt alles einwandfrei.

EDIT: Also im Editor tritt das Problem doch auf, das hab ich bloß nicht gemerkt, weil ich da alles über die F-Tasten mach...
Der Code nimmt also auch den Tastendruck auf, der nicht für ihn, sondern fürs Icon gedacht ist... Ich denke man kann das umgehen, wenn man diese "Verschiebfunktion" die ersten 2 Sekunden deaktiviert. Das mach ich dann einfach mit ElapsedMilliseconds() - oder gibts einen besseren Weg?
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Antworten