MouseDown-Problem mit Bild-Öffnen-Dialog

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Gina

Betreff: MouseDown-Problem mit Bild-Öffnen-Dialog

BeitragMi, Nov 19, 2014 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Ihr Lieben,

ich bräuchte mal bitte Eure Hilfe. Für mein aktuelles kleines Projektchen (geschrieben mit Blitz3D) war ich auf der Suche nach einem Bild-Öffnen/Speichern-Dialog und wurde über das Forum hier fündig bei EPS. Der Aufruf funktioniert einwandfrei. Nachdem jedoch der Dialog wieder geschlossen wird (egal mit welchem Button), ist in meinem Programm MouseDown(1) aktiv. Und zwar so lange, bis ich mit der Maus irgendwo hinklicke. Ich speichere MouseDown(1) bei jedem Schleifendurchlauf ganz brav in einem Feld. Dieses Feld auf 0 zu setzen, nützt leider gar nichts. Es ist so, als wenn meine Maustaste klemmen würde. Ich habe auch schon FlushMouse() probiert. Erfolglos. Crying or Very sad Und wenn man mit dem aktiven MouseDown(1) über die Programmoberfläche schweift, wird entsprechend alles Mögliche ausgelöst...

Als erstes habe ich natürlich den Aufruf des Dialogs einzeln getestet, um eigene Fehler auszuschließen. Ihr müsst Euch also nicht mit meinem kompletten Quellcode zur Erstellung von Häkelmustern rumquälen... Very Happy

BlitzBasic: [AUSKLAPPEN]
If GfxModeExists(1024,768,32) Then
Graphics 1024,768,32,2
Else
Print "dumm gelaufen"
WaitKey()
End
End If
AppTitle "Bild2Filet"

SetBuffer BackBuffer()

Rx = 100
Ry = 100
Rw = 200
Rh = 50

While Esc = 0
Cls
MausX = MouseX() ;xPos der Maus merken
MausY = MouseY() ;yPos der Maus merken
MlMT = MouseHit(1) ;Klick linke Maustaste merken
MdlMT = MouseDown(1) ;Merken linke Maustaste gedrückt
Esc = KeyHit(1)

Color 225,0,255
Rect Rx,Ry,Rw,Rh
Color 225,225,255
Text Rx+Rw/2,Ry+Rh/2,"Drück Mich",1,1

If MausX => Rx And MausX <= Rx+Rw And MausY => Ry And MausY <= Ry+Rh Then
If MlMT Then
Bild$ = eps_ImageDialog$(True, "Bilder (*.jpg;*.bmp;*.png)|*.jpg;*.bmp;*.png", 1, "", "", "", False )
;Bild$ = RequestFile("Select a filename to save as","png;*.jpg;*.bmp,*",False,"default.png")
MdlMT = False
FlushMouse()
End If
End If
Text 100,40,"Mx/My: "+Mausx+"/"+Mausy
Text 300,40,"MD "+MdlMT
Flip 1
Wend

(Die Deklaration der verwendeten Variablen habe ich mir mal gespart, damits nicht zu lang wird Wink )

Die auskommentierte Zeile ruft den Datei-Dialog mit Blitz+ auf, aber da geht meine Framerate so extrem runter. Ansonsten funktioniert dieser ohne MouseDown-Problem.

Den Autor der dll habe ich bereits kontaktiert und wir mussten feststellen, dass er unter Win7 dieses Problem nicht hat und wir haben beide keine Idee, woran das liegen könnte. Ich benutze Win 8.1. In meiner Verzweiflung habe ich in mühevoller Kleinstarbeit selbst eine dll in Delphi geschrieben, die mir die Dialoge zur Verfügung stellt. Als sie dann endlich lief, musste ich leider feststellen, das mit ihr das gleiche MouseDown-Problem auftritt. Seine und auch meine dll benutzen den gleichen klassischen Dialog der WinApi (den aus XP-Zeiten, nicht den neuen seit Vista). Meine Vermutung ist daher, dass es irgendetwas mit der Kombination dieses "alten" Dialoges auf Win 8.1 in Verbindung mit Blitz3D zu tun hat.

Hat jemand von Euch schonmal das gleiche Problem gehabt und kennt eine Lösung dafür? Oder hat irgendeine Idee, die ich noch ausprobieren könnte?
Oder kennt jemand eine dll, die mir den "neuen" (Vista,Win7/8) Bild-Öffnen/Speichern-Dialog liefern würde?

Ich danke Euch ganz dolle. Bis bald.

LG, Gina.
www.jk-spiele.de

Xeres

Moderator

BeitragMi, Nov 19, 2014 1:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde das Fenster nach dem Schließen des Dialogs wieder per WinAPI aktivieren (oder ein Mausklick senden, wenn es anders nicht geht).
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Gina

BeitragMi, Nov 19, 2014 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Xeres,

Danke für Deine schnelle Antwort. Wie meinst Du das mit dem Fenster aktivieren bitte? Soll ich in der dll noch etwas hinzufügen, das mein BlitzBasic-Programm-Fenster wieder aktiviert? Dazu müsste ich wohl erstmal herausfinden "wer" die dll aufgerufen hat... Oder soll ich im BlitzBasic-Code noch etwas hinzufügen, was das erledigt?

Das mit dem simulierten Mausklick habe ich auch schon überlegt. So ganz wohl ist mir dabei jedoch nicht. Schließlich scheint ja irgendetwas nicht in Ordnung zu sein und ob der Klick wirklich alles wieder ins Reine bringt...? Das würde ich als allerletzten Ausweg in Betracht ziehen.

LG, Gina.
www.jk-spiele.de

DAK

BeitragMi, Nov 19, 2014 10:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest ein Maus-Loslassen simulieren.

Bei dem Befehl der den Mausklick simuliert musst du ja zuerst einen Mausdruck simulieren und dann ein Mausloslassen. Probier mal ob es reicht in der DLL nur das Mausloslassen zu simulieren.
Gewinner der 6. und der 68. BlitzCodeCompo

Xeres

Moderator

BeitragMi, Nov 19, 2014 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte an sowas wie SetActiveWindow (msdn) - aber du kennst dich mit der WinAPI besser aus.
Entweder wird die Mausinput nur richtig abgefragt, wenn das Fenster aktiv ist, oder ein Mausklick-event bringt - was auch immer da aus dem Lot gerät - wieder in Ordnung.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Gina

BeitragDo, Nov 20, 2014 1:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi DAK,

vielen Dank für Deinen Tipp. Ich habe das gleich mal ausprobiert, nur leider zeigt das keine Wirkung. Das Problem scheint zeitlich erst danach aufzutreten, so dass ich es mit diesem Trick nicht lösen kann. Sad Das Loslassen müsste wohl eher in meinem BB-Programm aufgerufen werden, aber das erscheint mir irgendwie "unschön"...

Hi Xeres,

ah, ok, danke. Ich hab mich mal ein wenig dazu belesen und bin doch tatsächlich auf einen Artikel gestoßen, der genau mein Problem beschreibt. Mit meinen alten Suchbegriffen wäre ich nie dort gelandet. Es scheint etwas mit dem Wechsel des Focus zu tun zu haben. Ein Konflikt entsteht immer genau dann, wenn ein "manueller" Focuswechsel mit einem "automatischen" zusammen trifft. Win 8.1 scheint ja in einigen Dingen sehr empfindlich zu sein und mein Bauchgefühl sagt mir, dass das bei mir zutrifft. Deshalb wirkt auch der Tipp von DAK nicht, weil der zweite Focuswechsel erst nach dem Schließen des Dialogs auftritt und damit nach Verlassen der dll. Wenn ich den Focus an das aufrufende Programm zurück geben will, brauche ich dessen Namen. Ich könnte den Namen natürlich fix vorgeben oder ihn als Parameter anfordern... hmmm... *grübel*

Ich muss mir die vorgeschlagene Lösung im o.g. Artikel nochmal genau durch den Kopf gehen lassen. Jetzt bin ich dafür zu müde. War ein anstrengender Arbeitstag und es ist ja auch schon spät... Confused

Herzlichen Dank Euch beiden. Ich meld mich wieder. Für weitere Vorschläge bin ich natürlich immer zu haben... Wink Nachti.

LG, Gina.
www.jk-spiele.de

DAK

BeitragDo, Nov 20, 2014 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannstas doch eh sauber aus dem BB-Code raus machen. Mach in BB eine Art Wrapper-Funktion, die zuerst den Dialog über die DLL aufruft und direkt danach den Maustrick macht. Im Programm selbst rufst du dann immer die Wrapper-Funktion auf, und nicht die DLL-Funktion. Das sollte eigentlich eh sauber genug sein.

Ich hab das auch immer so gemacht, wenn ich was mit DLLs machen wollte, wo ich mit Blitz in Konflikt geraten bin.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group