Systemmauszeiger in "OpenScreen" verwenden

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
oliXon
Beiträge: 21
Registriert: 19.12.2004 11:35
Wohnort: Freiberg
Kontaktdaten:

Systemmauszeiger in "OpenScreen" verwenden

Beitrag von oliXon »

Bis jetzt kenne ich nur die Methode im Vollbildmodus "OpenScreen" per Sprite einen Mausgrafik einzuladen, ist es möglich den Systemauszeiger zu verwenden ?

Wenn nicht es es möglich anstatt *.bmp als Mausgrafiken zuladen, *.cur zu verwenden ?

Danke im vorraus
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

noch nich ausprobiert, aber teste mal, ob "releasemouse" funzt, und du danach per "windowmouseX/Y" die koordinaten abfragen kannst...
unter XP sollte ein fullscreen nur ein window sein, über dem man den normalen zeiger wieder einschalten können sollte.
examinemouse und mousex/y und mousebutton funzen dann natürlich nich mehr...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Code: Alles auswählen

InitSprite() : InitKeyboard()

OpenScreen(640,480,32,"void")

SetClassLong_(ScreenID(),#GCL_HCURSOR,LoadCursor_(0,#IDC_ARROW))

ShowCursor_(1)

Repeat
	ClearScreen($704020)
	
	ExamineKeyboard()
	
	FlipBuffers()
Until KeyboardPushed(1)
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
oliXon
Beiträge: 21
Registriert: 19.12.2004 11:35
Wohnort: Freiberg
Kontaktdaten:

Beitrag von oliXon »

Danke, genau das hab ich gesucht :)

Was mich jetzt noch interessiert, ob damit auch einen bereich damit auswählen kann der transparent/unsichtbar ist

Bild

"davor" ist natürlich der Hintergrund z.b. das die weiße Fläche das Programm beenden soll gibt es da ein ein beispiel ? Auf PureArea.net habe ich leider nix direktes gefunden, ich hoffe ich habe es nicht übersehen.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Ich weiss jetzt nicht genau ob du das Klicken auf eine Fläche meinst oder ob du sowas wie einen Auswahlrahmen ziehen willst. Ich gehe mal von einer Schaltfläche aus und habe folgendes zusammengeschraubt:

Code: Alles auswählen

InitSprite() : InitKeyboard()

OpenScreen(640,480,32,"void")

SetClassLong_(ScreenID(),#GCL_HCURSOR,LoadCursor_(0,#IDC_ARROW))

ShowCursor_(1)

CreateSprite(0,640,480,#PB_Sprite_Memory)
StartDrawing(SpriteOutput(0))
For i=0 To 639
	Box(0,i,640,1,RGB(0,50 + ((i * 205) / 639),230))
Next
StopDrawing()

Repeat
	ClearScreen($704020)
	
	ExamineKeyboard()
	
	GetCursorPos_(pt.POINT)
	
	StartSpecialFX()
	DisplaySprite(0,0,0)
	
	DisplayRGBFilter(50,50,100,250,50,50,50)
	DisplayRGBFilter(50,350,100,100,50,50,50)
	
	If pt\x >= 180 And pt\x < 460 And pt\y >= 50 And pt\y < 300
		DisplayRGBFilter(180,50,280,250,150,50,50)
		
		If GetAsyncKeyState_(#VK_LBUTTON) & $FFFF
			End
		EndIf		
	Else
		DisplayRGBFilter(180,50,280,250,50,50,50)
	EndIf
	
	DisplayRGBFilter(490,50,100,250,50,50,50)
	DisplayRGBFilter(490,350,100,100,50,50,50)   
	StopSpecialFX()
	
	StartDrawing(ScreenOutput())
	DrawText(60,60,"Flaeche #1")
	DrawText(60,360,"Flaeche #2")
	DrawText(190,60,"Beenden")
	DrawText(500,60,"Flaeche #3")
	DrawText(500,360,"Flaeche #4")         
	StopDrawing()
	
	FlipBuffers()
Until KeyboardPushed(1)
Zwei grundlegene Dinge sind hierbei zu beachten:

1.) Der code bedient sich der WinAPI und ist somit nicht crossplatform-kompatibel.

2.) Wenn du den Systemzeiger benutzt kannst nicht mehr die PB Maus Bibliothek benutzen da diese auf DirectInput basiert. Dies wird deutlich wenn du ExamineMouse() in deine Hauptschleife einbindest welches den Systemzeiger verschwinden lässt da DirectInput hier die höhere Priorität hat.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
oliXon
Beiträge: 21
Registriert: 19.12.2004 11:35
Wohnort: Freiberg
Kontaktdaten:

Beitrag von oliXon »

Einfach nur Spitze :)

Ich weiß klingt nach "Gibt man dem Daumen, frisst er die Hand" aber hab da noch was ;)

Ich bin jetzt per klick in das nächste menü

Code: Alles auswählen

   If pt\x >= 60 And pt\x < 190 And pt\y >= 110 And pt\y < 195      
   DisplayRGBFilter(60,110,130,85,50,50,50)
         If GetAsyncKeyState_(#VK_LBUTTON) & $FFFF
         IncludeFile "menu_save_load.pb" 
      EndIf      
   EndIf
1. Bin ich mir überhaupt nicht sicher ob das "verfahren" per include überhaupt richtig ist.

2. Wie kommte ich wieder zurück ? Ich habe zwar wieder ein feld wo man klicken kann aber

Code: Alles auswählen

   If pt\x >= 0 And pt\x < 640 And pt\y >= 0 And pt\y < 480 
      DisplayRGBFilter(0,0,640,480,50,50,50)     
        If GetAsyncKeyState_(#VK_LBUTTON) & $FFFF 
IncludeFile "menu_main.pb"     ; Zurück zum hauptmenü    
      EndIf      
   EndIf
das mag er überhaupt nicht, was mich vermutet lässt das diese Methode extrem unproduktiv ist ;)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> was mich vermutet lässt das diese Methode extrem unproduktiv ist
im grunde sogar total falsch.
> Bin ich mir überhaupt nicht sicher ob das "verfahren" per include überhaupt richtig ist.
ist es nicht.

per Include kannst du code-abschnitte in den hauptcode einfügen, bevor compiliert wird.

sowas ist besonders dann praktisch, wenn du gewisse proceduren auslagern willst.

das mitten in irgendwelchen bedingungen zu machen, ist bestenfalls unkonventionell,
bei dir scheint da ein wirklicher fehler aufzutreten, deshalb nehme ich stark an, dass deine idee dabei grundfalsch ist.

> IncludeFile "menu_main.pb" ; Zurück zum hauptmenü

und ich welchem code befindest du dich da?

ich schätze mal, du fügst den code des save/load menus in den hauptcode ein,
und probierst dann, den hauptcode wiederum in den code des save/load menus einzufügen?

IncludeFile ist kein sprung oder sonstwas...

wie gesagt:
per Include kannst du code-abschnitte in den hauptcode einfügen, bevor compiliert wird.
das bedeutet nicht, dass du andere programm-teile aufrufst.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
oliXon
Beiträge: 21
Registriert: 19.12.2004 11:35
Wohnort: Freiberg
Kontaktdaten:

Beitrag von oliXon »

Gut, momentan probiere ich nur ;)

Das heißt das ich am besten alles in eine Datei schreibe und dann besser im Code "rumspringen" sollte ... ?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ob du nachher alles in eine datei schreibst, oder teile in includes auslagerst, bleibt dir überlassen,
aber meistens lagert man dann sammlungen von procedures aus,
die man dann an den anfang des codes includet.

und "rumspringen" is auch nicht so die show.
du kannst Proceduren aufrufen, oder kleine abschnitte schreibst du direkt dorthin.

hast du denn vorher schon mal in irgendeiner anderen sprache programmiert?
...nur damit ich ne vorstellung hab, was für voraussetzungen bestehen...

mal ein winziges beispiel:

Code: Alles auswählen

Procedure PingOutput(nr)
  Debug "* P I N G * : Nr. = "+Str(nr)
EndProcedure
das speicher mal z.b. als "procs1.pbi"
und das hier nimmst du als hauptprogramm:

Code: Alles auswählen

IncludeFile "procs1.pbi"

For n=0 To 9
  Debug "n = "+Str(n)
    If n > 3 And n < 6
      PingOutput(n)
    EndIf
  Debug "-------"
Next
wenn du jetzt compilierst, wird zuerst das include eingefügt,
der code der compiliert wird, sieht dann so aus:

Code: Alles auswählen

Procedure PingOutput(nr)
  Debug "* P I N G * : Nr. = "+Str(nr)
EndProcedure

For n=0 To 9
  Debug "n = "+Str(n)
    If n > 3 And n < 6
      PingOutput(n)
    EndIf
  Debug "-------"
Next
und das demonstriert dir auch gleichzeitig nen procedure-aufruf innerhalb einer if-bedingung...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
oliXon
Beiträge: 21
Registriert: 19.12.2004 11:35
Wohnort: Freiberg
Kontaktdaten:

Beitrag von oliXon »

O.k, ich hab mich nochmal eingelesen ;)

Jetzt hab ich es per Procedure geschafft und funktioniert wunderbar.

Was mir nun auffiel (kann man an @Fluid Byte code testen), wenn ich irgendwo hinklicke wo keine Fläche deklariert wurde, merkt er sich diesen klick und sobald ich auf das beenden Feld gehe beendet er das Programm, da er sich den klick gemerkt hat.

Liegt es an GetAsyncKeyState_(#VK_LBUTTON) ? Gibt es da eine alternative ?
:: PureBasic v4.02 (Windows - x86)::
Antworten