Seite 1 von 1

Maus wieder aus dem Programm nehmen

Verfasst: 05.03.2008 22:28
von Tombi
Ich versuche in einem Fenster ein "Malprogramm" zu erstellen. Zunächst ein kleiner Anfang: Ein klick auf eine Stelle setzt einen Punkt.

Start.pb

Code: Alles auswählen

;Include
IncludeFile "init.pb"
IncludeFile "options.pb"

OpenWindow(0,pX,pY,wX,wY,#PB_Window_MinimizeGadget,"Settings")
OpenWindowedScreen(WindowID(0), 0, 0, wX, wY, 0, 0, 0)

Repeat
FlipBuffers()
ExamineMouse()
  If MouseButton(1)
  MouseX = MouseX()
  MouseY = MouseY()
  FrontColor(0,0,0)
  Plot(MouseX,MouseY)
    EndIf
  
  event=WaitWindowEvent()
  If event = #PB_Event_Gadget
    Id=EventGadgetID()
    Select ID
    
      Case 10
        
  
    EndSelect
  EndIf
Until event = #PB_Event_CloseWindow
Init.pb

Code: Alles auswählen

InitSprite()
InitSound()
InitMouse()
InitKeyboard()
options.pb

Code: Alles auswählen

;Setzen
Global pX.w
Global pY.w

Global wX.w
Global wY.w

Global mouseX.w
Global mouseY.w

;Werte geben
pX = 100
pY = 100

wX = 200
wY = 200
Problem:
Wenn ich einmal draufdrücke, hängt die Maus im Programm drinne, sprich: Sie wird nicht mehr angezeigt, kann nicht mehr benutzt werden.

Und das ganze funktioniert irgendwie eh` nicht...

Mit BlitzBasic war das doch damals so einfach :mrgreen:


- Tombi -

Verfasst: 05.03.2008 22:44
von Kaeru Gaman
wenn du mit nem screen und ExamineMouse() arbeitest, wird die Maus im screen ge-LOCK-t.
damit sie den screen wieder verlassen kann, musst du ReleaseMouse() verwenden,
falls du mit ExamineMouse arbeiten willst.

hier mal ein kleines beispiel:
http://www.purebasic.fr/german/viewtopi ... 760#130760


zusätzlich hast du allerdings noch ein bis zwei denkfehler drin...

1) FlipBuffers() vertauscht front- und back-buffer.
die folge ist, dass du bei deiner anordnung abwechselnd auf die beiden buffer zeichnen wirst.
das wird man vielleicht nicht sofert sehen, weil du lange genug drückst, um auf beide buffer zu malen,
aber wenn du mal zügig ne linie ziehst, wirst du sehen wie sie flackert,
weil immer abwechselnd jeder zweite punkt angezeigt wird.

2) waitwindowevent wartet natürlich, also wirst du in der zeit,
wenn kein event stattfindet, keinen kontinuierlichen programmfluß haben.
bei nem malprogram wohl weniger problematisch, aber bei nem game
würde das bedeuten, dass die gegner stillstehen wenn du nix machst.


> Mit BlitzBasic war das doch damals so einfach
ist ne völlig andere philosofie.
PB ist wirklich nicht schwierig, wenn man sich erstmal vertraut gemacht hat.

Verfasst: 05.03.2008 22:46
von gnasen
Habs mal leicht umgewandelt:

Code: Alles auswählen

;Include 
InitSprite() 
InitSound() 
InitMouse() 
InitKeyboard()

;Setzen 
Global pX.w 
Global pY.w 

Global wX.w 
Global wY.w 

Global MouseX.w 
Global MouseY.w 

;Werte geben 
pX = 100 
pY = 100 

wX = 200 
wY = 200

OpenWindow(0,pX,pY,wX,wY,"Settings",#PB_Window_MinimizeGadget) 
OpenWindowedScreen(WindowID(0), 0, 0, wX, wY, 0, 0, 0) 

Repeat 
  
  While WindowEvent() : Wend 
  
  FlipBuffers() 
  ExamineMouse() 
  ExamineKeyboard()
  
  If MouseButton(1) 
    MouseX = MouseX() 
    MouseY = MouseY() 
    Debug Str(MouseX) + "|" + Str(MouseY)
    StartDrawing(ScreenOutput())
    FrontColor(RGB(255,255,255)) 
    Plot(MouseX,MouseY) 
    StopDrawing()
  EndIf 
  
  Delay(1)

Until KeyboardPushed(#PB_Key_Escape)
Funktioniert bei mir so, wies soll.

Hast du zufällig eine ältere PB Version? Wenn ja, musste die paar Befehle "zurückmachen" ^^

edit: Mit dem angesprochenen Flipbuffers() stimmt natürlich auch, hab ich grad auch ganz übersehen

Verfasst: 05.03.2008 22:49
von Tombi
Ja leider: Version 3.30 (dazu in einem anderen Thread mehr)

- Danke für eure Hilfe -

Verfasst: 07.03.2008 15:50
von Tombi
Jetzt habe ich den oberen Code von gnasen (User), wo muss ich jetzt das ReleaseMouse() reingesetzen damit nach einem Klick ein Punkt da ist UND die maus sichtbar ist?

Verfasst: 07.03.2008 17:39
von Kaeru Gaman
innerhalb des screens ist die maus garnicht "da", da musst du schon einen eigenen mauszeiger zeichnen,
oder du verwendest garnicht ExamineMouse() sondern WindowMouseX()

es wäre unfug, ständig examine/release/examine/release zu wechseln...


in dem thread den ich verlinkt hab, ist ganz am anfang ein beispiel für nen windowedscreen ohne ExamineMouse()

hier isses:
http://www.purebasic.fr/german/viewtopi ... 536#130536

Verfasst: 07.03.2008 18:16
von Tombi
Ah` - Danke!

Kann leider den Code der hinter dem Link steckt nicht nutzen, da ich Version 3.30 benutze (was man, wenn der Banner in der Sigi wieder funktioniert auch sehen kann) und er bei "EnableExplicit" meckert.

Würde mich aber gerade mal interessieren was du da schönes hast.
Wenn du Zeit hast würde ich mich freuen wenn du das in eine Exe packst und mir per PN schickt :)

Verfasst: 07.03.2008 18:20
von Kaeru Gaman
dann probier halt, es umzuschreiben...

das EnableExplicit kannst du einfach rausnehmen, das ist damit er variablen ohne definition anmeckert.
und bei den anderen befehlen schau halt auf die fehlermeldung und dann in die beschreibung wie du sie umschreiben musst.
das wird z.b. bei OpenWindow die reihenfolge der argumente sein,
und bei ClearScreen und sowas erwartet er drei argumente für die farbe statt einem.

setz dich halt mal dran.
ich werd mir jetzt nicht noch mal 3.30 installieren, um für dich das umzuschreiben.
wenn du als lernprojekt ne OS-like oberfläche schreiben wolltest,
dann kannst du doch mindestens ne versionsrückstufung vornehmen.

als exe ist das eher unspektakulär.
nur ein fenster mit nem screen wo die maus rein und raus geht und auf clicks reagiert.
sonst nix.
es geht um den code, wie man das macht.

Verfasst: 07.03.2008 18:28
von Tombi
Jup, war nur eben zu faul.
Wenn du willst kann ich dir als Beweis auch `nen umgeschriebenen 3.30-Code schicken :mrgreen:

Mh, jetzt habe ich doch noch ein Problem:

Im Handbuch habe ich keine Lösung gefunden (auch nicht in der offiziellen Dokumentation).

MouseButton(1) scheint nur bei ExamineMouse() zuwirken, jedoch gibt es wohl auch kein WindowMouseButton(). Was kann man da verwenden?

Verfasst: 07.03.2008 18:48
von Kaeru Gaman
siehe im ersten beispielcode:

Code: Alles auswählen

    MLC = GetAsyncKeyState_(#VK_LBUTTON)
    MRC = GetAsyncKeyState_(#VK_RBUTTON) 
also, die virtual keys direkt über WinAPI

oder aber das entsprechende WindowEvent....