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:

Anzahl der Bildschirmseiten in Erfahrung bringen?

 
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
oldirty



Anmeldungsdatum: 04.08.2005
Beiträge: 65

BeitragVerfasst am: 04.08.2005, 17:55    Titel: Anzahl der Bildschirmseiten in Erfahrung bringen? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mecki
Igel


Anmeldungsdatum: 10.09.2004
Beiträge: 985
Wohnort: Niederbayern

BeitragVerfasst am: 04.08.2005, 18:21    Titel: Antworten mit Zitat

Hi oldirty!

Doch, ScreenInfo kann das sehr wohl - siehe Befehlsreferenz auf www.FreeBASIC.de

Grüßle,
Mecki
_________________
» Yodl.de: So sucht man gestern. verwundert
» Geld verdienen im Netz + ICQ.
» Firefox!
» 100€ zu gewinnen
» FreeBASIC.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
oldirty



Anmeldungsdatum: 04.08.2005
Beiträge: 65

BeitragVerfasst am: 04.08.2005, 19:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 04.08.2005, 21:45    Titel: Antworten mit Zitat

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 zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 04.08.2005, 21:48    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 04.08.2005, 22:00    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 04.08.2005
Beiträge: 65

BeitragVerfasst am: 04.08.2005, 22:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 05.08.2005, 10:55    Titel: Screenseiten in erfahrung bringen Antworten mit Zitat

Die einfachste möglichkeit, die ich auch immer benutze, wäre natürlich, die anzahl selbst fest zu legen. lachen

(Weiss nciht ob das jetzt so konstruktiv is... peinlich )

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



Anmeldungsdatum: 04.08.2005
Beiträge: 65

BeitragVerfasst am: 05.08.2005, 13:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 05.08.2005, 15:45    Titel: Antworten mit Zitat

aja, verstehe grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
oldirty



Anmeldungsdatum: 04.08.2005
Beiträge: 65

BeitragVerfasst am: 07.08.2005, 14:36    Titel: Antworten mit Zitat

Danke d.j. peters für die Antwort.

Funktioniert, wie gewünscht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
oldirty



Anmeldungsdatum: 04.08.2005
Beiträge: 65

BeitragVerfasst am: 08.08.2005, 16:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
oldirty



Anmeldungsdatum: 04.08.2005
Beiträge: 65

BeitragVerfasst am: 09.08.2005, 14:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
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