Maus-Interaktion nach ResizeWindow() nicht möglich

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von Mijikai »

Wie wäre es das Fenster mit der Maus zu verändern ohne den Fokus zu verlieren?
-> mit WindowEvent() und #WM_MOUSEMOVE anstatt InitMouse()/ExamineMouse()
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von diceman »

Ich habe die InitMouse()-Variante erwähnt, weil sie mir für den Einstieg intuitiver und einfacher umzusetzen schien. Das war gewissermaßen bekanntes Terrain für mich als Blitzbasic-Fachidiot (also der ganze Kram mit Mauspositionen abfragen, usw). Die ganzen #PB-Konstanten zu googeln schien mir arg mühselig, ich wollte für den Anfang schnelle Ergebnisse, um mich zu motivieren. ;-) Mittlerweile habe ich aber so einiges von dem Drumherum aufschnappen können, und werde wohl früher oder später nicht drumherum kommen, mich auch mit den WindowEvent()-Funktionen zu befassen.
Zuletzt geändert von diceman am 17.02.2018 23:49, insgesamt 1-mal geändert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von Sicro »

@diceman:
Ich habe den Thread jetzt nicht so genau durchgelesen; das man beim ResizeWindow-Befehl manche Parameter nicht angeben muss, weißt du?

Code: Alles auswählen

ResizeWindow(0, #PB_Ignore, #PB_Ignore, new_width, new_height)
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von diceman »

Ja, ich erinnere mich dunkel, sowas in der Hilfe gelesen zu haben. :) Aber da sich bei meiner Minesweeper-Fingerübung je nach Anzahl der Felder auch das Fenster vergrößert oder verkleinert, war ich tatsächlich drauf angewiesen die zentrierten Koordinaten neu zu berechnen. Und der geschicktere Weg scheint es in der Tat zu sein, den Input über WindowEvent() zu regeln. Trotzdem nochmal danke für die Erinnerung - wer weiß, wenn mir #PB_Ignore mal zugute kommt.
So oder so habe ich wieder jede Menge gelernt. :allright:

//EDIT:
Mmmh, mit WindowEvent() scheint es auf den ersten Blick nicht möglich zu sein, abzufragen, ob ein Maus-Button (noch) gehalten wird. Nur Clicks werden registriert. Mit mouseLeft = MouseButton(#PB_MouseButtonLeft) war das dagegen kein Problem, und da ich es bei meinem Minesweeper geschafft habe, die aus der Windows-Version bekannte Komfortfunktion, per gehaltenem Rechtsklick alle umliegenden nicht-geflaggten Felder zu markieren und dann mit Links-Klick gleichzeitig zu öffnen, umzusetzen (worauf ich sehr stolz bin 8), ist die WindowEvent()-Abfrage erstmal keine Alternative für mich.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von Bisonte »

Ich hab da noch ein wenig Hexenwerk für dich : Der WindowCallBack :mrgreen:

Ich hoffe die Kommentare im Quellcode sind ausreichend. Wenn nicht, einfach fragen

Code: Alles auswählen

InitSprite()

Global LeftMouseBtnDown = #False ; Globale Variable damit wir sie in einer Prozedure ändern können

; Hier das Hexenwerk ;)
; Ein sogenannter WindowCallBack. Diese Prozedur wird JEDESMAL von Windows selbst aufgerufen, wenn
; irgendeine Window "Message" anliegt, soll heissen, es gibt noch viel mehr "Events" als PB bereitstellt.
; Diese können wir dann in dieser Prozedur abfragen.
Procedure.i WindowCallBack(hWnd, uMsg, wParam, lParam)
  
  ; Parametererklärung : hWnd - Das ist die WindowID deines Fensters, dem du den Callback zugewiesen hast.
  ;                      uMsg - Das Event, das Windows(das OS) an dein Fenster geschickt hat.
  ;                      wParam & lParam - Hier stehen werte (oder auch nicht) die zu den jeweiligen uMsg's
  ;                                        gehören. Alle Informationen findet man dazu bei MSDN. Die sogenannte 
  ;                                        Windows - API 
  
  Protected Result = #PB_ProcessPureBasicEvents ; Wir wollen die Events nicht verändern sondern nur "filtern"
  
  Select uMsg ; Die Nachricht
    Case #WM_LBUTTONDOWN          ; Es wurde der Linke Mausknopf runtergedrückt
      LeftMouseBtnDown = #True    ; Wir setzen unsere globale Variable auf #True
    Case #WM_LBUTTONUP            ; Es wurde der Linke Mausknopf losgelassen
      LeftMouseBtnDown = #False   ; Wir setzen unsere globale Variable auf #False
  EndSelect
  
  ProcedureReturn Result ; Die originalen Events die reinkamen werden so auch weitergeleitet... Als wäre unser Callback gar nicht da.
    
EndProcedure

; Hier das übliche... nur mal eine Demo wie das angewendet wird.

OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480)


; Hier wird das Fenster mit dem Callback verknüpft.
; Wenn man den 2. Parameter weglässt, gilt deine Zuweisung für ALLE Fenster die du erstellt hast !
SetWindowCallback(@WindowCallBack(), 0)

Repeat
  Event = WindowEvent()
  
  If LeftMouseBtnDown ; Ist zwar jetzt nicht elegant, aber hier zeigen wir ob LMB gedrückt ist....
    Debug "LMB" ; Die Taste ist unten !
  EndIf
  
  ; Das wars schon ;) 
  
  Select Event
    Case #PB_Event_CloseWindow
      Break   
  EndSelect
  
  ; Screen
  If IsScreenActive()
    ClearScreen(0)
    FlipBuffers()
  EndIf
  
  Delay(1)
  
ForEver
Edit: Es ist vielleicht nicht so wirklich ersichtlich, aber ein WindowCallback muss IMMER so

Code: Alles auswählen

Procedure.i Irgendeinprozedurename(hWnd, uMsg, wParam, lParam)
aussehen, da diese Prozedur vom Betriebssystem selbst aufgerufen wird... und da muss man
sich an dessen Regeln halten. Man kann leider auch viel verkehrt machen, und Crossplatform ist
es auch nicht (Nur unter Windows), deshalb sollte man möglichst darauf verzichten. Aber manchmal
geht es einfach nicht anders ;)

P.P.S.: Alle Achtung Sicro.... nun hab auch ich endlich gesehen dass HideWindow() noch Flags hat :D Seit wann eigentlich ?
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von Mijikai »

Bin zu faul für den Callback :wink:

So gehts auch:

Code: Alles auswählen

Event = WindowEvent()
Select Event 
  Case #WM_KEYDOWN
  If EventwParam() = #VK_ESCAPE
    Debug "Escape!!!"
  EndIf 
  ;Case #WM_XYZ...
EndSelect
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von mk-soft »

Aber ohne Garantie...

EventwParam() und EventlParam() sind noch vorhanden aber nicht mehr bestand der offiziellen Dokumentation.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von Bisonte »

Und wenn man schon OS spezifische Sachen nutzt, dann bitte richtig ...

weil auch die #WM_ Konstanten werden nicht alle durchgeschleift.... Da gab es mal eine PB Version, wo nichts mehr von den
OS Events in die PB WindowEvents gebracht wurde.... Da war der Alarm gross, weil auf einmal nichts mehr ging.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von RSBasic »

Bisonte hat geschrieben:nun hab auch ich endlich gesehen dass HideWindow() noch Flags hat :D Seit wann eigentlich ?
+1, ich lese zwar immer die Changelogs, aber irgendwie übersehe ich das trotzdem oder ich nehme das kurz wahr und vergesse das wieder. :D

Um deine Frage zu beantworten:
#PB_Window_NoActivate gibt es seit 5.00 und #PB_Window_ScreenCentered & #PB_Window_WindowCentered gibt es seit 5.20.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Maus-Interaktion nach ResizeWindow() nicht möglich

Beitrag von Mijikai »

Bisonte hat geschrieben:...
weil auch die #WM_ Konstanten werden nicht alle durchgeschleift.... Da gab es mal eine PB Version, wo nichts mehr von den
OS Events in die PB WindowEvents gebracht wurde.... Da war der Alarm gross, weil auf einmal nichts mehr ging.
Einfach PeekMessage_() nutzen wenn es Update sicher sein soll, dann kommt auch Alles an :wink:
Antworten