Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

SCREENCONTROL

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 545
Wohnort: Jüterbog

BeitragVerfasst am: 30.01.2021, 16:40    Titel: SCREENCONTROL Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4391
Wohnort: ~/

BeitragVerfasst am: 30.01.2021, 17:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 545
Wohnort: Jüterbog

BeitragVerfasst am: 30.01.2021, 18:13    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1060
Wohnort: Ruhrpott

BeitragVerfasst am: 30.01.2021, 23:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4391
Wohnort: ~/

BeitragVerfasst am: 31.01.2021, 11:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1060
Wohnort: Ruhrpott

BeitragVerfasst am: 31.01.2021, 17:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 545
Wohnort: Jüterbog

BeitragVerfasst am: 31.01.2021, 18:24    Titel: Antworten mit Zitat

@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 lächeln

Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1060
Wohnort: Ruhrpott

BeitragVerfasst am: 31.01.2021, 19:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4391
Wohnort: ~/

BeitragVerfasst am: 31.01.2021, 21:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 545
Wohnort: Jüterbog

BeitragVerfasst am: 01.02.2021, 06:56    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1060
Wohnort: Ruhrpott

BeitragVerfasst am: 01.02.2021, 14:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4391
Wohnort: ~/

BeitragVerfasst am: 01.02.2021, 16:00    Titel: Antworten mit Zitat

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. grinsen

(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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 545
Wohnort: Jüterbog

BeitragVerfasst am: 01.02.2021, 18:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz