Maus-Interaktion nach ResizeWindow() nicht möglich
Re: Maus-Interaktion nach ResizeWindow() nicht möglich
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()
-> mit WindowEvent() und #WM_MOUSEMOVE anstatt InitMouse()/ExamineMouse()
Re: Maus-Interaktion nach ResizeWindow() nicht möglich
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.
And we're out of Beta, we're releasing on time.
Re: Maus-Interaktion nach ResizeWindow() nicht möglich
@diceman:
Ich habe den Thread jetzt nicht so genau durchgelesen; das man beim ResizeWindow-Befehl manche Parameter nicht angeben muss, weißt du?
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)
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
Re: Maus-Interaktion nach ResizeWindow() nicht möglich
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.
//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 , ist die WindowEvent()-Abfrage erstmal keine Alternative für mich.
So oder so habe ich wieder jede Menge gelernt.
//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 , 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.
And we're out of Beta, we're releasing on time.
Re: Maus-Interaktion nach ResizeWindow() nicht möglich
Ich hab da noch ein wenig Hexenwerk für dich : Der WindowCallBack
Ich hoffe die Kommentare im Quellcode sind ausreichend. Wenn nicht, einfach fragen
Edit: Es ist vielleicht nicht so wirklich ersichtlich, aber ein WindowCallback muss IMMER so
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 Seit wann eigentlich ?
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
Code: Alles auswählen
Procedure.i Irgendeinprozedurename(hWnd, uMsg, wParam, lParam)
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 Seit wann eigentlich ?
PureBasic 6.10 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
Re: Maus-Interaktion nach ResizeWindow() nicht möglich
Bin zu faul für den Callback
So gehts auch:
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
Re: Maus-Interaktion nach ResizeWindow() nicht möglich
Aber ohne Garantie...
EventwParam() und EventlParam() sind noch vorhanden aber nicht mehr bestand der offiziellen Dokumentation.
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Maus-Interaktion nach ResizeWindow() nicht möglich
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.
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.10 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
Re: Maus-Interaktion nach ResizeWindow() nicht möglich
+1, ich lese zwar immer die Changelogs, aber irgendwie übersehe ich das trotzdem oder ich nehme das kurz wahr und vergesse das wieder.Bisonte hat geschrieben:nun hab auch ich endlich gesehen dass HideWindow() noch Flags hat Seit wann eigentlich ?
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.
Re: Maus-Interaktion nach ResizeWindow() nicht möglich
Einfach PeekMessage_() nutzen wenn es Update sicher sein soll, dann kommt auch Alles anBisonte 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.