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:

Hintergrundfarbe mit COLOR vom Modus abhängig?
Gehe zu Seite 1, 2, 3  Weiter
 
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
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 15.12.2013, 00:44    Titel: Hintergrundfarbe mit COLOR vom Modus abhängig? Antworten mit Zitat

So, und noch eine Frage:

Kurzfassung: Wie erreiche ich in Screen-Modi >0 dass die mit COLOR gesetzte Hintergrundfarbe nur in dem Bereich angewandt wird, in dem ich mit PRINT etwas ausgebe?


Langfassung:
Ich habe ein Programm (reine Textausgabe), das ursprünglich als reine "Konsolenfenster" bzw. im Screen-Modus 0 läuft. Würde mir prinzipiell auch reichen, aber dort kann ich z.B. "CTRL-C" nicht abfangen.

Wenn ich nun z.B. mit SCREEN 9 einen vergleichbaren Modus aufrufe, verhält sich der COLOR unterschiedlich:

Im Konsolenmodus kann ich z.B. mit Color 7,0 gefolgt von Print " Hallo " den Text "Hallo" in hellgrau ausgeben, der Hintergrund von "Hallo" einschließlich der beiden Leerzeichen davor und danach ist schwarz. Der Rest des Bildschirm bleibt unverändert. Ich kann also beliebig bunten Text mit unterschiedlichen Hintergrundfarben auf ein und derselben Bildschirmseite ausgeben.

Nach z.B. SCREEN 9 wechselt bei jedem COLOR-Befehl die Hintergrundfarbe des gesamten sichtbaren Bildschirms...


Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 15.12.2013, 00:56    Titel: Antworten mit Zitat

In diesem Fall würde ich (den sowieso flexibleren Befehl) SCREENRES empfehlen:
Code:
screenres 640, 350
color 1, 12
print "Hallo";
color 12, 1
print "Welt!"

getkey

Besser noch im 32bit-Farbmodus.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 15.12.2013, 01:11    Titel: Antworten mit Zitat

Danke lächeln

Einige Dinge werden zwar immer noch anders dargestellt als im Konsolenmodus, aber da versuche ich erstmal mich durchzuarbeiten...

Grüße
Raiener
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 15.12.2013, 18:33    Titel: Antworten mit Zitat

Ich werde noch irre mit dem Kopf durch die Mauer wollen

Vom reinen Konsolenmodus wollte ich eigentlich weg, da ich dort CTRL-C etc. nicht abfangen kann.
Mit SCREEN 9 (o.ä.) hatte ich das o.g. Problem mit den Hintergrundfarben...
Also der Versuch mit SCREENRES.
Soweit so gut, nur muss ich jetzt feststellen , dass ich in diesem Grafikmodus keinen blinkenden Cursor bekomme...
(In meinem Adressen-Programm können die Felde wie z.B. Name editiert werden, und da will ich natürlich sehen, wo ich gerade bin -> Cursor nötig).

Dafür eine Lösung zu basteln (abwechselnd in bestimmtem Zeitintervall bisheriges Zeichen ohne Cursor und mit Cursor anzeigen) erscheint mir wirklich zuviel des Guten... ich will ja bloß eine Cursor.

Also zurück auf Screen 0 - setze ich mit
Code:
screen 0, , 3

- also Bildschirmmodus 0, Bittiefe Standard, 3 Videseiten

Gleichzeitig arbeite ich aber mit mehreren "Videoseiten". Ein nachfolgender Befehl
Code:
SCREENSET 2, 0: COLOR 7, 1: CLS

bringt mir das Programm zum Absturz...

Ich will:
- Einen Bildschirmmodus mit mehreren Seiten (ich kann dann z.B. Seite 1 auf Seite 2 kopieren, auf Seite 2 eine Warnmeldung ausgeben und Seite 2 anzeigen, und danach wieder auf Seite 1 zurückwechseln)
- unterschiedliche Zeichen-Hintergrundfarben auf einer Seite verwenden
- einen (möglichst blinkenden) Cursor z.B. mit LOCATE anzeigen lassen
- wenn's geht dem Prgramm die Kontrolle über CTRL-C etc. geben. Notfalls verzichte ich auf Letzeres.

Wie bekomme ich das hin?

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 15.12.2013, 19:49    Titel: Antworten mit Zitat

Ich glaube nicht, dass mehrere Bildschirmseiten im Konsolenmodus unterstützt werden. Sicher bin ich aber nicht (dein Absturz spricht jedoch auch dagegen).

Ich könnte dir eine selbstgebaute Eingaberoutine als INPUT-Ersatz anbieten: InputUsing. Seit kurzem ist da im Grafikmodus auch ein blinkender Cursor dabei; ansonsten kannst du festlegen, welche Zeichen bei der Eingabe erlaubt sind, wie lang die Eingabe sein darf, und einiges mehr. Für Fragen zur Funktion stehe ich natürlich gern zur Verfügung.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 15.12.2013, 20:43    Titel: Antworten mit Zitat

Danke, habe ich natürlich gleich angesehen und ausprobiert.

nemored hat Folgendes geschrieben:
...Seit kurzem ist da im Grafikmodus auch ein blinkender
Cursor dabei


Wenn ich oben in das Codebeispiel für InputUsing ein SCREENRES 640, 350 einfüge, habe ich keinen Cursor.
Geht das nur in bestimmten Modi?

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 15.12.2013, 20:56    Titel: Antworten mit Zitat

Öhm - ich war mir sicher, dass ich die Seite aktualisiert hätte, aber der Cursor war tatsächlich noch nicht drin. Tut mir Leid - aber jetzt ist er da lächeln

Der Cursor verwendet übrigens die aktuell eingestellte Vorder- und Hintergrundfarbe.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 15.12.2013, 22:31    Titel: Antworten mit Zitat

Nur so zur Info nebenbei: Ctrl+C abzufangen ist durchaus möglich. Ich hab vor 3 Jahren folgendes Beispiel aus der MSDN in FB umgesetzt:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms685049.aspx
Code:
#include "windows.bi"
 
Function CtrlHandler(fdwCtrlType As Integer) As Integer
   
   Select Case fdwCtrlType
      
    ' Handle the CTRL-C signal.
      case CTRL_C_EVENT
      Print !"Ctrl-C event\n"
      Beep_(750, 300)

      Case Else
      Return FALSE
      
   End Select
   
   Return TRUE
   
End Function

If SetConsoleCtrlHandler(Cast(PHANDLER_ROUTINE, @CtrlHandler), TRUE) Then
  Print !"\nThe Control Handler is installed.\n"
  Print !"\n -- Now try pressing Ctrl+C"
  Print !"\n(...waiting in a loop for events...)\n\n"
 
  Do
     
  Loop 'Until InKey = Chr(27)
 
Else
  print !"\nERROR: Could not set control handler"
   Sleep
EndIf

_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 15.12.2013, 23:49    Titel: Antworten mit Zitat

@nemored: Cool, jetzt blinkt es auch bei mir zwinkern
Den getimerten Cursorteil könnte ich in meine Routine einbauen.

Und jetzt jammern auf hohem Niveau: In meiner alten QB-Routine kann ich mit der Einfg-Taste zwischen "Einfügemodus" (Standard) und "Überschreiben" wechseln. Wobei der Cursor von klein (Einfügen) zu groß (Überschreiben) wechselt, wie halt ein "ganz normaler" Cursor.
Das dürfte wohl nicht so einfach hinzubekommen sein.

@St_W: Danke, das ist interessant (und schön kurz).
Wäre ja ein Grund, den Konsolenmodus zu verwenden, aber da gibt es nur eine Bildschirmseite...

Seltsam daran ist, dass im "lang qb" Modus auch mit SCREEN 0 mehrere Bildschirmseiten zu Verfügung gestellt werden. Ich verstehe nicht, warum das nicht auch in FB geht...
Mein erstes zu portiendes Programm hatte ich nämlich nur soweit angepasst, dass es mit "lang qb" läuft, das ist wesentlich einfacher.
Beim zweiten wollte ich es "besser" machen, aber da stolpere ich von einer Falle in die Nächste... weil A in FB nicht mehr geht ändere ich B, und dafür geht jetzt C nicht mehr usw.

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 16.12.2013, 10:20    Titel: Antworten mit Zitat

Einen Seitenpuffer fürs Konsolenfenster kannst du dir auch selber basteln:
Code:
ReDim Shared As String bildschirm(0), farben(0)

Declare Sub BildschirmRett
Declare Sub BildschirmRueck

Sub BildschirmRett
  'bildschirminhalt retten
    Dim As Integer x, y, zeilen, anfang
   
    anfang = UBound(bildschirm) 'bisherige größe des pufferspeichers ermitteln
    zeilen = 25 'zusätzlicher speicherplatz   
    ReDim Preserve bildschirm(anfang+zeilen+2) 'pufferspeicher vergrößern
    ReDim Preserve farben(anfang+zeilen+2)
   
    For y = 1 To zeilen 'bildschirmzeilen
      For x = 1 To 80 'bildschirmspalten
        bildschirm(anfang+y) += Chr$(Screen(y,x,0))
        farben(anfang+y) += Chr$(Screen(y,x,1))
      Next
    Next
    'cursorposition
    bildschirm(anfang+zeilen+1) = Chr$(CsrLin)
    bildschirm(anfang+zeilen+2) = Chr$(Pos)
End Sub

Sub BildschirmRueck
   Dim As Integer x, y, zeilen, anfang, farbwechsel
   
   zeilen = 25
   anfang = UBound(bildschirm) - zeilen - 1
   
   Cls
   For x = anfang To anfang + zeilen-1
    farbwechsel = 0
    For y = 1 To 79
       If farben(x)[y] <> farben(x)[0] Then 'farbwechsel in der zeile
          farbwechsel = 1
          Exit For
       EndIf
    Next
    If farbwechsel Then
       For y = 0 To 79
           Color LoByte(farben(x)[y]), HiByte(farben(x)[y])
         Print Chr$(bildschirm(x)[y]);
       Next
    Else 'ohne farbwechsel
       Color LoByte(farben(x)[0]), HiByte(farben(x)[0])
       Print bildschirm(x);
    EndIf
   
   Next
   Locate Asc(bildschirm(anfang+zeilen)), Asc(bildschirm(anfang+zeilen+1)) 'cursor zurücksetzen
  ReDim Preserve bildschirm(anfang-1) 'nicht benötigten pufferspeicher freigeben
  ReDim Preserve farben(anfang-1)
 
End Sub
So wie die Subs da stehen, arbeiten sie wie ein Stack im "LiFo"-Modus, für deine Zwecke müsstest du sie so anpassen, daß du gezielt auf eine bestimmte Seite zugreifen kannst. Die Handhabung ist etwas umständlicher als mit SCREEN, dafür ist die Anzahl der Seiten nur durch deinen Hauptspeicher beschränkt.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 16.12.2013, 14:11    Titel: Antworten mit Zitat

Ja, das ist eigentlich nicht so aufwendig, vor allem wenn sich schon jemand anderes überlegt hat wie man einen Seitenpuffer realisieren kann zwinkern

Dann könnte ich beim Konsolenfenster bzw. SCREEN 0 bleiben, habe einen blinkenden Cursor, und fange mit dem Code von St_W CTRL-C ab.

Soweit so gut. Aber wenn ich "#include "windows.bi" angebe um mit St_Ws Beispiel CTRL abzufangen, bekomme ich beim Kompilieren Fehlermeldungen:

Zitat:
Compiler output:
D:\programs\FreeBASIC\adr26_32_fb-0.bas(511) error 4: Duplicated definition, Max in 'DIM as Integer RO, Anz, i, A, Y, YY, YPos, YPosA, E, EE, Start, Max'
D:\programs\FreeBASIC\adr26_32_fb-0.bas(526) error 41: Variable not declared, MAX in 'LOCATE RO, 1: Start = 1: MAX = Anz: 'GOSUB DRUCKADR'
...
error 125: Too many errors, exiting


Sehe ich es richtig, dass in einer der "includeten" Dateien Variablen definiert werden, die ich mit gleichem Namen dummerweise selber verwende?
Ich fürchte nur, wenn ich die ersten Variablen bei mir umbenenne, dass dann die nächsten Fehlermeldungen kommen...

Oder doch im Grafikmodus, mit einer zusätzlichen "Cursorroutine", die mir den Bildschirmspeicher in Größe eines Zeichens ausliest, und periodisch mit einem Cursor-Strich wieder ausgibt?

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 16.12.2013, 19:21    Titel: Antworten mit Zitat

TimesChange hat Folgendes geschrieben:
...vor allem wenn sich schon jemand anderes überlegt hat wie man einen Seitenpuffer realisieren kann...
Die Subs sind schon uralt (wie man an den "$" sieht, noch unter QB geschrieben), mit Pointern liesse sich das sicher viel eleganter (und auch schneller) realisieren.

TimesChange hat Folgendes geschrieben:
Ich fürchte nur, wenn ich die ersten Variablen bei mir umbenenne, dass dann die nächsten Fehlermeldungen kommen...
Das ist alles nur eine Frage der Vorgehensweise. Ich empfehle folgendes: Zuerst in der alten Version -ohne #include- mit der "Ersetzen"-Funktion der IDE alle fraglichen Variablen umbenennen, also beispielsweise MAX in MAX_. Dann #include wieder hineinnehmen und sehen, was passiert.
Und noch ein Tip: Kümmere dich immer nur um die erste Fehlermeldung und beseitige den Fehler. Die folgenden Meldungen verschwinden dann meistens von ganz alleine. lächeln

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 16.12.2013, 20:50    Titel: Antworten mit Zitat

TimesChange hat Folgendes geschrieben:
Seltsam daran ist, dass im "lang qb" Modus auch mit SCREEN 0 mehrere Bildschirmseiten zu Verfügung gestellt werden. Ich verstehe nicht, warum das nicht auch in FB geht...

Also zumindest unter Windows hat die Konsole keinen direkten Backbuffer (technisch also nicht direkt möglich), und unter Linux ist das AFAIK auch nur optional - da hat ein Terminal noch nicht mal gezwungenermaßen einen Framebuffer.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 16.12.2013, 23:42    Titel: Antworten mit Zitat

Ok, so schlimm war es nicht:
Nach "#include windows.bi" waren es nur zwei Variablen (MIN und MAX) die doppelt belegt waren.
Dann werde ich mal mit "ScreenCopy à la Grindstone" weitermachen - bis demnächst lächeln

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 18.12.2013, 16:33    Titel: Antworten mit Zitat

Nachdem ich so großspurig behauptet habe, daß das Ganze mit Pointern elegenter zu lösen wäre, habe ich einmal (aus reiner Neugierde) versucht, diese Behauptung in die Tat umzusetzen - mit mäßigem Erfolg. Es ist mir bisher nicht gelungen, einen Pointer auf den Speicherbereich zu ermitteln, an dem die Character- und Farbwerte des Konsolenfensters abgelegt sind. Falls da jemand entsprechende Kenntnisse (oder auch nur eine Idee) hat, bitte melden.

Bei meiner Suche bin ich jedoch auf die WinAPI - Funktionen CreateConsoleScreenBuffer(... und SetConsoleActiveScreenBuffer(... gestoßen, mit denen sich (fast) beliebig viele Konsolenfenster - Seiten erstellen und anzeigen lassen. Allerdings gibt es damit ein anderes Problem: Wenn ich dort Text hineinschreiben will, geht das nur mit WriteConsole(.... Ich habe versucht, den "Print" - Befehl mit SetStdHandle(STD_OUTPUT_HANDLE,...) auf den neuen Screenbuffer umzuleiten, allerdings ohne Erfolg. Für C habe ich hier ein Beispiel gefunden, allerdings wird dort die Funktion _open_osfhandle verwendet, die mir hier in FB (soweit ich weiß) nicht zur Verfügung steht. Kann mir jemand weiterhelfen?

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 18.12.2013, 19:18    Titel: Antworten mit Zitat

TimesChange hat Folgendes geschrieben:
Ok, so schlimm war es nicht:
Nach "#include windows.bi" waren es nur zwei Variablen (MIN und MAX) die doppelt belegt waren.
Dann werde ich mal mit "ScreenCopy à la Grindstone" weitermachen - bis demnächst lächeln

Grüße
Rainer

Das ist in vielen Projekten ein Problen und deswegen gibt es auch (zumindest in der C-Version der WinAPI) die Möglichkeit, vor dem inkludieren ein #define NOMINMAX anzugeben.

Bezüglich der "_open_osfhandle"-Problematik, ich glaube nicht, dass du bei FB einfach StdIO-Handles direkt umleiten kannst, weswegen es keine solche Funktion gibt. FB hat zwar auch CRT-Header (also evtl auch io.h), aber diese können vmtl nicht verwendet werden, um das Standard-Verhalten von FB zu ändern.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 19.12.2013, 02:37    Titel: Antworten mit Zitat

@jojo: das "#define NOMINMAX" würde ich im FB-Quellcode einfach vor "include..." schreiben?

@Grindstone: ich finde deine jetzige Lösung auch nicht "unelegant".
Ich habe die Subs in mein Programm eingefügt, funktioniert auch "im Prinzip", nur habe ich beim Zurückschreiben des gesicherten Bildschirm den unerwünschten Effekt, dass der Hintergrund auf einmal schwarz ist.
Ich habe bloß noch keine Zeit gehabt mir das näher anzusehen; ich werde schon herausfinden wo der Fehler entsteht.
(Ja, ich vermisse den Debug-Modus von Quickbasic immer noch sehr lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 19.12.2013, 08:44    Titel: Antworten mit Zitat

Zitat:
das "#define NOMINMAX" würde ich im FB-Quellcode einfach vor "include..." schreiben?

Im Prinzip ja, nur steht das in den FreeBASIC-Headern, soweit ich das sehe, nicht zur Verfügung. Wenn dein eigenes MIN und MAX allerdings definiert ist, bevor du die WinAPI einbindest, werden die entsprechenden WinAPI-Funktionen ignoriert.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1211
Wohnort: Ruhrpott

BeitragVerfasst am: 19.12.2013, 10:09    Titel: Antworten mit Zitat

TimesChange hat Folgendes geschrieben:
...nur habe ich beim Zurückschreiben des gesicherten Bildschirm den unerwünschten Effekt, dass der Hintergrund auf einmal schwarz ist.

Das liegt daran, daß der "Cls"-Befehl den Bildschirm auf die aktuell eingestellte Hintergrundfarbe setzt. Wenn du eine andere Farbe haben möchtest, mußt du sie vor Aufruf von "Cls" mit "Color..."auf den gewünschten Wert setzen.

TimesChange hat Folgendes geschrieben:
Und jetzt jammern auf hohem Niveau: In meiner alten QB-Routine kann ich mit der Einfg-Taste zwischen "Einfügemodus" (Standard) und "Überschreiben" wechseln. Wobei der Cursor von klein (Einfügen) zu groß (Überschreiben) wechselt, wie halt ein "ganz normaler" Cursor.
Das dürfte wohl nicht so einfach hinzubekommen sein.
Ist es doch! zwinkern Probier mal das hier:
Code:
#Include "windows.bi"
Dim As CONSOLE_CURSOR_INFO cci
cci.dwSize = 100
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),@cci)
Locate 1,1,1
Die Zahl hinter cci.dwSize ist die Größe des Cursors in % der Zeichenhöhe, der Wert darf zwischen 1 und 100 liegen. Standard ist 25.

@Jojo: Weißt du denn zufällig, wohin der "Print"-Befehl seine Ausgabe schickt? Vielleicht könnte man da etwas umleiten. Einen eigenen Befehl zu programmieren, der in den neuen Screenbuffer schreiben kann und die volle Funktionalität des Print-Befehls hat, scheint mir doch etwas aufwendig.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 20.12.2013, 00:52    Titel: Antworten mit Zitat

@nemored & Jojo:
mit " #define NOMINMAX" habe ich gar nicht mehr herumprobiert, wenn man es weiß kann man ja damit leben, dass diese beiden Namen belegt sind.

Der schwarze Hintergrund bei grindstones Bildschirmpuffer lag an etwas anderem: Im Konsolenmodus ist das mit SCREEN erhaltene Farbattribut nur ein 8-Bit-Wert.
In der Sub "Bildschirmrueck" muss es hier also statt
Code:
Color LoByte(farben(x)[y]), HiByte(farben(x)[y])

heißen:
Code:
Color farben(x)[y] AND 15, farben (y)[y] shr 4

Dann klappt's auch wieder bunt.

Frage dazu: Kann mir jemand sagen, ob das Grafikformat unter 64-Bit Windows das selbe ist (Palette mit 4 Bits / pixel)?
Sinn und Zweck der ganzen Übung ist ja, dass das Programm auch künftig z.B. unter Windows 7 / 8 /... in 64-Bit-Version läuft.
Ich wüsste auch nicht, wie ich das abfragen kann, denn SCREENINFO liefert mir auch im Konsolen-Modus meine normale Farbtiefe von 32 Bit zurück...

@grindstone: Dein Cursortipp mit SetConsoleCursorInfo war super Daumen rauf!

Jetzt habe ich endlich alles beieinander: Eingabe mit Alt-Taste, einen Bildschirmpuffer, CTRL-C wird abgefangen (dank St_W), und einen Einfüge-Cursor habe ich bei Bedarf auch!

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
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
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
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