|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 30.01.2021, 16:40 Titel: SCREENCONTROL |
|
|
Hallo @all.
Nach langer Zeit hab ich mal wieder ne Frage.
Ich versuch grad einen screen via SCREENCONTROL per drag'n drop
zu verschieben.
da ich eine recht unheilige Kombination eines 15" Laptops mit UHD Panel habe und somit mit einer Skalierung von 250% arbeite, dachte ich das Problem liegt darin.
Aber auch das Herunterschrauben der Auflösung/Skalierung 100% hat das gleiche Ergebnis.
Bleibt bei euch das Fenster beim Verschieben unter der Maus?
Dies ist das leicht geänderte Beispiel aus der Portal-Referenz
lediglich der SplashScreen ist entfernt worden:
Code: | #INCLUDE "fbgfx.bi"
USING FB
DIM AS EVENT e
DIM AS INTEGER x, y, pressed, col
DIM AS ANY PTR img
' Splashscreen (durchsichtiges Fenster) erzeugen
SCREENRES 384, 64, 32
img = IMAGECREATE(48, 8)
' graphischen Schriftzug erzeugen
DRAW STRING img, (0, 0), "GfxLib"
FOR y = 0 TO 63
FOR x = 0 TO 383
col = POINT(x \ 8, y \ 8, img)
IF (col <> RGB(255, 0, 255)) THEN
col = RGB((x + y) AND &hFF, (x + y) AND &hFF, _
(x + y) AND &hFF)
END IF
PSET (x, y), col
NEXT x
NEXT y
pressed = 0
DO
IF SCREENEVENT(@e) THEN
SELECT CASE e.type
CASE EVENT_MOUSE_BUTTON_PRESS
' Druck der Maustaste merken
pressed = -1
CASE EVENT_MOUSE_BUTTON_RELEASE
' Loslassen der Maustaste merken
pressed = 0
CASE EVENT_MOUSE_MOVE
IF pressed THEN
' Fenster verschieben
SCREENCONTROL GET_WINDOW_POS, x, y
SCREENCONTROL SET_WINDOW_POS, x + e.dx, y + e.dy
END IF
END SELECT
END IF
SLEEP 5
LOOP WHILE NOT MULTIKEY(1) ' Ende bei Druck der ESC-Taste |
Mutton |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 30.01.2021, 17:59 Titel: |
|
|
Wenn ich das Fenster (durch Klick innerhalb des Fensters) verschiebe, bleibt das Fenster im Prinzip schon unter der Maus, allerdings nicht exakt - das Fenster bewegt sich etwas langsamer als die Maus (d. h. wenn ich sehr weit schiebe, befindet sich das Fenster danach nicht mehr unter der Maus). Ist es das, was du meinst?
Ich halte es schon für möglich, dass da die Skalierung unter Windows zuschlägt, auch wenn die bei 100% liegt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 30.01.2021, 18:13 Titel: |
|
|
@nemored: genau diesen "Effekt" meine ich. Das Umsetzten der screeninternen Maus-Delta-x/-y in die entsprechende Position auf dem Desktop Screen.
Da bei mir, bei nativer Res, der FB-Screen generell skaliert dargestellt ist, nahm ich an, daß die Fehlerquelle darin liegt.
Zumindest konntest du das nachvollziehen, hilft mir erst einmal weiter.
Mit bestem Dank
Mutton |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 30.01.2021, 23:11 Titel: |
|
|
Das hat nichts mit der Skalierung zu tun, es ist ein Timingproblem. Wenn du das Sleep 5 am Ende der Schleife auskommentierst, bleibt der Cursor an seinem Platz.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 31.01.2021, 11:16 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Das hat nichts mit der Skalierung zu tun, es ist ein Timingproblem. |
Stimmt, das ist interessant. Sollte SCREENEVENT nicht trotzdem alle Veränderungen puffern? Oder protokolliert das die Änderungen, die während der SLEEP-Phase passieren, nicht mit? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 31.01.2021, 17:19 Titel: |
|
|
Ein FB - Konsolenprogramm läuft -laut ProcessHacker- mit 1 Thread, der Aufruf von ScreenRes startet 2 zusätzliche Threads. Meine Vermutung ist, daß Sleep nur auf den Thread des Hauptprogramms wirkt, so daß in der Folge ein Synchronisationsproblem entsteht.
Gruß
grindstone
EDIT:
Meine Vermutung scheint richtig zu sein, das Problem lässt sich ebenfalls beseitigen, indem man das Innere der Do/Loop - Schleife in ScreenLock / ScreenUnLock einschliesst, wobei das ScreenUnLock unbedingt hinter dem Sleep 5 stehen muss. _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 31.01.2021, 18:24 Titel: |
|
|
@grindstone: mal abgesehen das ich deine Empfehlung so in meinem Projekt nicht mehr umsetzten kann, zu viele Umbauarbeiten wären da nötig.
Aber ein SLEEP in(!) einem SCREENLOCK ist nicht das, was mir hier beigebracht wurde
Mutton |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 31.01.2021, 19:00 Titel: |
|
|
Sleep außerhalb des ScreenLock - Blocks funktioniert aber nicht. Und das Sleep ganz wegzulassen führt zu 100% Kernauslastung. Irgendwie scheint die ganze SCREEN - Geschichte noch Verbesserungspotential zu haben.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 31.01.2021, 21:31 Titel: |
|
|
Möglich wäre noch so etwas:
Code: | DIM AS INTEGER count
DO
count += 1
IF SCREENEVENT(@e) THEN
' [...]
END IF
IF (count mod 1000) = 0 THEN SLEEP 5
LOOP WHILE NOT MULTIKEY(1) ' Ende bei Druck der ESC-Taste |
Sieht bei mir sowohl von der Auslastung als auch von der Synchronisation her gut aus. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 01.02.2021, 06:56 Titel: |
|
|
@nemored: das sieht interessant aus
... mal etwas off topic:
betrifft das Abfragen von .x .y eines ScreenEvents während
gedrückter Maustaste.
sind .x und .y wirklich integer?
#INCLUDE "fbgfx.bi"
Code: |
DIM e AS FB.EVENT
dim as short MouseX,MouseY
dim as integer pressed
SCREENRES 640, 480
WIDTH 640\8, 480\16
DO
IF SCREENEVENT(@e) THEN
SELECT CASE e.type
CASE FB.EVENT_MOUSE_MOVE
'MouseX/Y sind short und nicht integer!
'diese "Kastrierung" ermöglicht während FB.EVENT_MOUSE_BUTTON_PRESS .x/y zu erfragen
'und liefert dann sogar ausserhalb des Screens korrekte Ergebnisse
MouseX=e.x
MouseY=e.y
PRINT "Maus Position " & e.x & ", " & e.y & _
" (MouseX/Y " & MouseX & ", " & MouseY & ")" & _
" (delta " & e.dx & ", " & e.dy & ")"
CASE FB.EVENT_MOUSE_BUTTON_PRESS
print "pressed"
pressed=1
CASE FB.EVENT_MOUSE_BUTTON_RELEASE
print "released"
pressed=0
CASE FB.EVENT_WINDOW_CLOSE
END
END SELECT
END IF
SLEEP 10
LOOP
|
Mutton |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 01.02.2021, 14:24 Titel: |
|
|
Durch Zufall habe ich etwas seltsames entdeckt: Sobald ich in Firefox die Seite meiner Sparkasse aufrufe -ich brauche mich nicht einloggen, es reicht, die Homepage aufzurufen- bleibt das Fenster unter dem Cursor, auch beim unveränderten Code aus dem ersten Post. Der Effekt bleibt auch, wenn ich den entsprechenden Tab lösche und andere Seiten aufrufe, erst wenn ich Firefox beende, ist alles wieder beim alten.
Im internationalen Forum ist vor ca. einem halben Jahr darüber diskutiert worden, daß einige Browser das Timing der Windows - internen Threadverwaltung verändern, ich weiß aber nicht mehr, im Zusammenhang mit welchem Thema.
Gruß
grindstone
EDIT:
So lässt sich unter Windows die Zeitkonstante auf 1 ms setzen (gilt dann allerdings systemweit): Code: | #Include "fbgfx.bi"
#Include "windows.bi"
#Include "win\mmsystem.bi"
timeBeginPeriod(1)
Using FB
... | Die Gegenprobe habe ich auch gemacht. Bei 15 ms verlässt der Cursor wieder das Fenster. _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 01.02.2021, 16:00 Titel: |
|
|
Muttonhead hat Folgendes geschrieben: | betrifft das Abfragen von .x .y eines ScreenEvents während
gedrückter Maustaste.
sind .x und .y wirklich integer? |
Das UDT FB.Event wird in der fbgfx.bi deklariert:
Code: | type EVENT field = 1
type as long
union
type
scancode as long
ascii as long
end type
type
x as long
y as long
dx as long
dy as long
end type
button as long
z as long
w as long
end union
end type |
Von daher: nein, .x und .y sind keine INTEGER, sondern LONG. Nach dieser Definition kann ich mir aber nicht vorstellen, wie .button und .x gleichzeitig funktionieren sollen, ohne sich gegenseitig in die Quere zu kommen.
Das Screen-Event sollte ja "Taste wird gedrückt" oder "Taste wird losgelassen" sein und nicht "Taste ist weiterhin gedrückt" - oder irre ich mich da?
Nochmal zur Klarstellung: Du bekommst entweder eine Änderung des Mausbuttons gemeldet oder eine Änderung der Position (oder auch was ganz anderes).
edit: Ich sehe gerade, dass die fbgfx.bi nicht mit der Referenz übereinstimmt. Da muss die fbgfx.bi wohl korrigiert werden.
(editedit: Referenzeintrag wurde korrigiert) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 01.02.2021, 18:05 Titel: |
|
|
edit:
also nochmal bezugnehmend zum ersten Beispiel: ich vermute Multikey ist der Übeltäter
Alle Mausbewegungen werden gepuffert.
Selbst bei SLEEP 50 und wenn man lang genug die Maustaste hält, "traced" das Fenster die Mausbewegung und es landet pixelgenau unter dem Mauszeiger:
Code: |
#INCLUDE "fbgfx.bi"
using fb
DIM e AS FB.EVENT
DIM AS INTEGER x, y,pressed,scrnx,scrny
screenres 100,100,32
screeninfo scrnx,scrny
for i as integer=0 to scrnx step 25
line(i,0) - (i,scrny-1)
next i
for i as integer=0 to scrny step 25
line(0,i) - (scrnx-1,i)
next i
DO
IF SCREENEVENT(@e) THEN
SELECT CASE e.type
CASE FB.EVENT_MOUSE_MOVE
if pressed then
SCREENCONTROL GET_WINDOW_POS, x, y
SCREENCONTROL SET_WINDOW_POS, x + e.dx, y + e.dy
end if
CASE EVENT_MOUSE_BUTTON_PRESS
' Druck der Maustaste merken
pressed = -1
CASE EVENT_MOUSE_BUTTON_RELEASE
' Loslassen der Maustaste merken
pressed = 0
CASE FB.EVENT_WINDOW_CLOSE
END
END SELECT
END IF
SLEEP 5
LOOP |
gut, ein paar Ausreißer gibt es, aber im großen Ganzen funzt es doch
Mutton |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|