  | 
					
						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 | 
	 
	
		oldirty
 
  
  Anmeldungsdatum: 04.08.2005 Beiträge: 65
 
  | 
		
			
				 Verfasst am: 04.08.2005, 16:55    Titel: Anzahl der Bildschirmseiten in Erfahrung bringen? | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
 
besteht die Möglichkeit über eine(n) Befehl/Funktion in Erfahrung zu bringen, ob der mit dem Befehl Screen(Grafik) erstellte Bildschirm mehr als 1 Seite besitzt? 
 
Mit Screeninfo kann man die Breite, Höhe, Bittiefe usw. aber nicht die Zahl  der Bildschirmseiten erfahren, oder irre ich mich?
 
 
Danke im Vorraus.
 
 
CU
 
OlDirty | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Mecki Igel
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
  | 
		 | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		oldirty
 
  
  Anmeldungsdatum: 04.08.2005 Beiträge: 65
 
  | 
		
			
				 Verfasst am: 04.08.2005, 18:41    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Habe nochmal eine alte Offline Referenz auf meiner HD gefunden, die mit folgendem Code Screeninfo erläutert:
 
 
 	  | Code: | 	 		  
 
TYPE SCREENINFOTYPE
 
driver_name AS STRING
 
w AS INTEGER
 
h AS INTEGER
 
depth AS INTEGER
 
pitch AS INTEGER
 
bpp AS INTEGER
 
mask_color AS INTEGER
 
num_pages AS INTEGER
 
flags AS INTEGER
 
END TYPE
 
DIM info AS SCREENINFOTYPE PTR
 
 
SCREEN 15, 32
 
' Obtain info about current mode
 
 
info = SCREENINFO
 
PRINT "Bildschirmmodus:"
 
PRINT STR$(info->w) + "x" + STR$(info->h) + "x" + STR$(info->depth);
 
 
 
PRINT " über " + info->driver_name + "-Treiber"
 
 
 
SLEEP
 
 | 	  
 
 
 
Mit FB 0.14b geht das Bsp. leider nicht mehr. 
 
Syntax-Fehler in der Zeile info = SCREENINFO.
 
Screeninfo jetzt Anweisung: SCREENINFO [w][,[h][,[depth][,[bpp][,[pitch][,[rate][,driver]]]]]
 
 
Bitte um Hilfe, wie der Code umgeschrieben werden muss.
 
 
Danke. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Dusky_Joe
 
  
  Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
  | 
		
			
				 Verfasst am: 04.08.2005, 20:45    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ich vermute mal, dass diese Information nicht mehr zur Verfügung steht, weil du als Programmierer immer selbst festlegst, wie viele Seiten du verwenden willst. Dass diese anzahl einmal unbekannt ist, kann eigentlich nicht sein.
 
Du kannst vor der initialisierung des Modus i.d.R. immer die Seitenzahl in einer (globalen) Variable zwischenspeichern, und fertig.
 
 
... oder mir das gegenteil beweisen  
 
Wozu bräuchtest du diese Info denn? (Codeauszug?) _________________ fully biological degradable
 
 
Once, the big wave arrives, you've got two ways, you can go:
 
Either, you ride it, or you don't do.
 
But, if you don't ride, you'll never know wether you'd have gone wet. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Michael712 aka anfänger, programmierer
 
  Anmeldungsdatum: 26.03.2005 Beiträge: 1593
 
  | 
		
			
				 Verfasst am: 04.08.2005, 20:48    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo.
 
Ich habe gerade mal was rumprobiert, und habe den Ansatz der Lösung gefunden:
 
 
 	  | Code: | 	 		  
 
screen 18,32,5,0
 
TYPE SCREENINFOTYPE 
 
 driver_name AS STRING 
 
 w AS INTEGER 
 
 h AS INTEGER 
 
 depth AS INTEGER 
 
 pitch AS INTEGER 
 
 bpp AS INTEGER 
 
 mask_color AS INTEGER 
 
 num_pages AS INTEGER 
 
 flags AS INTEGER 
 
END TYPE
 
 
dim info as SCREENINFOTYPE
 
 
with info
 
    screeninfo .w,.h,.depth
 
end with
 
 
print info.w,info.h,info.depth
 
sleep
 
 
 | 	  
 
 
Wie man sieht, wird die Auflösung und die Tiefe angezeigt.
 
 
Mfg
 
Michael
 
 
 
EDIT:
 
So ists einfacher und umfangreicher:
 
 
 	  | Code: | 	 		  
 
screen 18,32,5,0
 
 
SCREENINFO w,h,depth,bpp,pitch,rate,driver$
 
 
print w;" *";h;" *";depth;",";bpp;",";pitch;",";rate;",";driver$
 
sleep
 
 | 	 
  _________________
  	  | Code: | 	 		  | #include "signatur.bi" | 	 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Dusky_Joe
 
  
  Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
  | 
		
			
				 Verfasst am: 04.08.2005, 21:00    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Interessant... 
 
 
ScreenInfoType hat auch eine Adresse, die mit @ScreenInfoType herausgefunden werden kann. Evtl kann man sie so weit dereferenzieren, dass die vergessene Seitenanzahl auftaucht? _________________ fully biological degradable
 
 
Once, the big wave arrives, you've got two ways, you can go:
 
Either, you ride it, or you don't do.
 
But, if you don't ride, you'll never know wether you'd have gone wet. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		oldirty
 
  
  Anmeldungsdatum: 04.08.2005 Beiträge: 65
 
  | 
		
			
				 Verfasst am: 04.08.2005, 21:40    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
 
habe eine ganz einfache Sub-Routine geschrieben, um die Befehle AREA und AREAFILL zu implementieren (Befehle aus der AmigaBasic-Zeit). Da die FÜll-Routine mit Paint bei überlappenden bereichen nicht ganz füllt,  habe ich das zeichnen in der 2. Bildebene durchgeführt, mit Get kopiert und anschließend mit Put auf die aktuelle, d. h. sichtbare Bildschirmseite kopiert und mit "or" verbunden. 
 
 
Da ich die Sub-Routine in verschiedenen Programmen verwenden will, soll eine Überprüfung stattfinden, ob der Screen mehr als eine Bildebene hat und ggf. einen Hinweis ausgeben. Im Moment ist alles nur für den Eigengebrauch, aber man weis ja nie.
 
 
Hier mal der Code:
 
 	  | Code: | 	 		  
 
'Area und Areafill bereitstellen
 
'
 
'*** Es müssen 2 Bildschirmebenen vorhanden sein, damit richtig funktioniert
 
'
 
'OlDirty 03/08/2005
 
 
dim shared ax,ay,adx,ady,amaxx,amaxy,aminx,aminy,azxy,apx,apy,adurchlauf as integer
 
declare sub Area(x,y as integer)    'Area-Befehl bereitstellen
 
declare sub Areafill()              'Areafill-Befehl bereitstellen
 
dim shared ar(1000*1000*32)         'Speicher für gezeichnetes Area reservieren
 
                                    '1000x * 1000y * 32 Bit
 
adx=0           'Für Mittelpunkt
 
ady=0           'Für Mittelpunkt
 
adxy=0          'Zähler für Mittelwert
 
adurchlauf=0    'Wenn =0 dann Beginn des Area
 
xxx=0
 
aminx=9999      'Wert für kleinste Position X
 
aminy=9999      'y
 
amaxx=0         'Wert für groesste Position X
 
amaxy=0         'Y
 
 
sub Area(ax,ay)
 
    screenset 1,0           'Auf 2. Ebene Zeichnen, 0 = Hauptseite aber anzeigen
 
             '1  = Aktive Seite für Ausgabe (Puffer)
 
             '  0= angezeigte Seite (Hauptseite)
 
    if adurchlauf=0 then
 
        pset (ax,ay)        'Startpunkt 1. Punkt
 
        apx=ax              'Startpunkt x-Achse
 
        apy=ay              'Startpunkt y-Achse
 
        adurchlauf=-1
 
        adx=adx+apx
 
        ady=ady+apy
 
        azxy=1
 
    else
 
        line -(ax,ay)       'Wenn ab 2. Punkt Linie bis...
 
        adx=adx+ax
 
        ady=ady+ay
 
        azxy=azxy+1
 
    end if
 
    if ax<aminx then aminx=ax   'Kleinstes X ermitteln
 
    if ay<aminy then aminy=ay   'Kleinstes Y ermitteln
 
    if ax>amaxx then amaxx=ax   'Groesstes X ermitteln
 
    if ay>amaxy then amaxy=ay   'Groesstes Y ermitteln
 
    screenset 0,0               'Ausgabe wieder auf Hauptseite + Hauptseite zeigen
 
end sub
 
 
sub Areafill
 
    screenset 1,0
 
    line -(apx,apy)         'Polygon schließen
 
    adx=int(adx/azxy)       'Mittelwert berechnen x
 
    ady=int(ady/azxy)       'Mittelwert berechnen y
 
    paint(adx,ady)          'Füllen
 
    GET (aminx,aminy)-(amaxx,amaxy), ar     'Gefülltes Area speichern
 
    cls                     '2. Bildschirm leeren
 
    screenset 0,0           'Auf Hauptbildschirm schalten
 
    put (aminx,aminy), ar ,or   'Gefülltes Area mit vorhandenem Bild kombinieren
 
    adx=0                   'alle Werte auf Anfang
 
    ady=0
 
    azxy=0
 
    apx=0
 
    apy=0
 
    adurchlauf=0
 
    amaxx=0
 
    amaxy=0
 
    aminx=9999
 
    aminy=9999
 
    ax=0
 
    ay=0
 
end sub
 
 
'**************************
 
'Beispielcode, zeichnet stilisierte Pyramide
 
screen 16,,2
 
 
cls
 
color 3,0
 
Area (100,150)  'Zeichnet Polygon(mind. 2 Punkte vorgeben) oder andere Beliebige Form
 
Area (400,150)  'Zweiter Punkt
 
Area (250,20)   'dritter Punkt
 
Areafill        'Füllt anschließend diese Form
 
color 2,0
 
Area (100,150)
 
Area (400,150)
 
Area (200,180)
 
Areafill
 
color 1,0
 
Area (250,20)
 
Area (400,150)
 
Area (450,100)
 
Areafill
 
 
sleep
 
 | 	  
 
 
Danke für die schnellen Antworten. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		psygate
 
 
  Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
  | 
		
			
				 Verfasst am: 05.08.2005, 09:55    Titel: Screenseiten in erfahrung bringen | 
				     | 
			 
			
				
  | 
			 
			
				Die einfachste möglichkeit, die ich auch immer benutze, wäre natürlich, die anzahl selbst fest zu legen.    
 
 
(Weiss nciht ob das jetzt so konstruktiv is...   )
 
 
 	  | Code: | 	 		  
 
screen 20,24,3,&h1
 
'modus: 20
 
'pixelbittiefe: 24bit
 
'Bildschirmseitenanzahl:3
 
'jetzt nur noch screenset und dann ists eigentlich zum arbeiten fertig. | 	 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		oldirty
 
  
  Anmeldungsdatum: 04.08.2005 Beiträge: 65
 
  | 
		
			
				 Verfasst am: 05.08.2005, 12:24    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				| Ich möchte diese Befehle in einer .bas Datei auslagern und ggf. in verschiedenen Programmen über #include "Sub_Area.bas" einbinden. Die eingebundene Datei soll dann selbst ermitteln, ob das Hauptprogramm, in der es eingebunden wurde, den Screen mit mehr als einer Ebene geöffnet hat und ggf. einen Hinweis ausgeben, dass Screen geändert werden muss. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		psygate
 
 
  Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
  | 
		
			
				 Verfasst am: 05.08.2005, 14:45    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				aja, verstehe   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		oldirty
 
  
  Anmeldungsdatum: 04.08.2005 Beiträge: 65
 
  | 
		
			
				 Verfasst am: 07.08.2005, 13:36    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Danke d.j. peters für die Antwort.
 
 
Funktioniert, wie gewünscht. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		oldirty
 
  
  Anmeldungsdatum: 04.08.2005 Beiträge: 65
 
  | 
		
			
				 Verfasst am: 08.08.2005, 15:52    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Um mal wieder in das Programmieren reinzukommen, habe ich alte AmigaBasic Grafik-Bücher rausgekrammt und auf freebasic umgeschrieben. 
 
Unter Freebasic stehen die Funktionen nicht (oder doch?) zur Verfügung. Habe dann eigene Befehle geschrieben. 
 
Über eine Anleitung/Beispiele wäre ich aber dankbar. Sind diese nur über APIs möglich? Gehen diese dann auch auf einen Screen, der nicht übe Apis geöffnet wurde, z. b. mit Screen 16? Bin mit Apis nicht so vertraut, wissen reicht aber zumindest für die Erstellung von MessageBoxen. Grafik- und Fenstersteuerung muss ich noch lernen. Für Anfängerprojekte auch noch nicht erforderlich. Fange erst einmal klein an.
 
 
Woher kommt die C Struct bzw. woher fb_mode (EXTERN fb_mode alias "fb_mode" as MODE ptr)? Hilft vielleicht auch für eigene Recherchen. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		oldirty
 
  
  Anmeldungsdatum: 04.08.2005 Beiträge: 65
 
  | 
		
			
				 Verfasst am: 09.08.2005, 13:08    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Habe noch das Buch von Markt und Technik: 3D-Grafik und Animation.
 
Programmcode in AmigaBasic und tlw. in C.
 
 
Link: 
 
 
http://www.birdys.de/default.php?page=buecher&kat=15&menu=1
 
 
Hier ist ein C-Code enthalten, mit dem man eine Raytracing-Welt rendern lassen kann. | 
			 
		  | 
	 
	
		| 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.
  | 
   
 
     |