Προς το περιεχόμενο

(Console) Scroll Text on Screen - Do not wrap ?


Προτεινόμενες αναρτήσεις

Δημοσ.

Γνωρίζει κάποιος πως μπορώ να κάνω ένα κείμενο όταν φτάσει στα όρια της κονσόλας να μην πηγαίνει από κάτω? απλά να εξαφανίζεται.

 

φανταστείτε 1 τρένο να ξεκινάει από αριστερά προς δεξιά στην οθόνη, θέλω να μετακινηθεί δεξιά μέχρι να μείνει το τελευταίο βαγόνι στην οθόνη.

 

το πρόβλημα είναι ότι αν πχ έχω 3 βαγόνια, θα φτάσει το 1ο βαγόνι στα όρια και θα αναδηπλωθεί, αυτό θα χαλάσει όλο το σχήμα

 

θέλω να προσομοιώσω την λειτουργία του τρένου, κάθε φορά το τρένο θα αφήνει το τελευταίο βαγόνι!

- Θεωρώ ότι το τρένο ξεκινάει από τέρμα αριστερά και τέρμα δεξιά είναι η αφετηρία του τελευταίου βαγονιού.

 

 

 

 

		for(int i=0; i < WIDTH; i++)
		{
			SetWidth(i);   // Let some space on left side on each print

			for( int k=0; k < 4; k++)
			{	
				StackPop(OutputStack, city, &x);
				printf("    %s   ", city);
			}

			printf("\n");
			SetWidth(i); // Let some space on left side on each print

			for( int k=0; k < 4; k++)
				printf("  -----------------  ");

			printf("\n");
			SetWidth(i); // Let some space on left side on each print
	
			for(int k=1; k < 4; k++)
				printf("  |               |  "); 
				printf("  |               |  \n");

                        SetWidth(i); // Let some space on left side on each print
			for(int k=1; k < 4; k++)
				printf("  |   o       o   |  "); 
				printf("  |   o       o   |  \n");
				
			Sleep(500);
			system("cls");
			
		}

 

 



το πρόβλημα με τον πάνω κώδικα είναι ότι όταν φτάσει στα όρια της κονσόλας αναδηπλώνεται και χαλάει όλο το σχήμα! αν μπορούσαμε να το κάνουμε απλά να συνεχίζει δεξιά, να κρύβεται δηλαδή θα ήμουν ευτυχισμένος.

Δημοσ.

Σκέφτηκα να αναπαραστήσω την κονσόλα με έναν πίνακα Width * Height και πολύ απλά να δουλέψω πάνω στον πίνακα και στο τέλος να κάνω Draw (Print) τον πίνακα.

 

- Αν θέλω να μετακινήσω κάποιο κείμενο, πολύ απλά θα το ρίξω έξω από τα όρια της "Γραμμης"

 

έστω ότι θέλω να scrollarw αυτό το κείμενο, να αφήσω μόνο το H στην οθόνη

[][Η][Ε][Λ][Λ][Ο][][][][]

 

 

Αυτό που θα κάνω είναι να μετακινήσω τους δείκτες

 

[][][][][][][][][][Η]ello

 

όπου [] είναι ο πίνακας, ότι είναι εκτός [] σημαίνει ότι δεν υπάρχει πλεον στον πίνακα, άρα δεν θα γίνονται Print!



Πολύ ωραία! αυτό θα μπορούσε να είναι extra άσκηση! κάνω 2 ασκήσεις σε 1, τι να κάνω όμως! είναι αναγκαίο για την προσομοίωση :P

Δημοσ.

Καλημέρα!

 

Αν κατάλαβα καλά, δουλεύεις με plain C κώδικα χωρίς να χρησιμοποιείς κάποια GUI βιβλιοθήκη (π.χ. Win32 subsystem) που θα σου επέτρεπε να ρυθμίσεις κατάλληλα το παράθυρο του τερματικού (ή αν δεν ήταν τερματικό αλλά GUI application, κάποιο εσωτερικό text field control όπου θα τυπώνονταν τα μηνύματά σου) για να μην κάνει text wrap.

 

Λογικά δεν πρέπει να έχεις ούτε και έλεγχο στο πλάτος γραμμής του τερματικού σου. Πάντως το default των τερματικών σε Windows και σε Linux είναι συνήθως 80x25. Δηλαδή 25 γραμμές με πλάτος 80 χαρακτήρων έκαστη.

 

Θα μπορούσες λοιπόν να τυπώνεις μόνο τους πρώτους 80 χαρακτήρες από κάθε line string ώστε να εξομοιώσεις τη λειτουργία που θέλεις. Τώρα, τί θα γίνει σε περίπτωση που κάποιος κάνει resize το παράθυρο του τερματικού είναι άλλη ιστορία...

Δημοσ.

Ναι αυτό θα κάνω!

 

για την ώρα έχω το παράθυρο (Console32) 110Χ45 και δεν έχει πρόβλημα, μπορώ να εμφανίσω εως και 110 χαρακτήρες στην σειρά.

 

Για να κάνω την ζωή μου εύκολη, πολύ απλά θα δουλεύω γραμμή γραμμή, δηλαδή θα έχω έναν πίνακα 110 θέσεων και όταν θελήσω να κάνω Scroll το Text δεξιά, απλά γεμίζω αριστερά με κενά τον πίνακα.



Εδώ είναι μια πολύ γρήγορη-μπακαλίστικη υλοποίηση που δουλεύει

#include "stdafx.h"
#include <string>
#include <Windows.h>

using namespace std;

#define CONSOLE_WIDTH 80

void ShiftText(string str, int times)
{
	string pStr = "";
	
	// Initialize string with spaces
	for(int i=0; i < CONSOLE_WIDTH; i++)
		pStr += " ";

	// Put our text on the right position on array
	for(int i=0; i < str.size(); i++)
		pStr[i + times] = str[i];

	// This will cut last position (each character go out of Χ-Axis 80) 
	pStr.resize(CONSOLE_WIDTH);

	printf("%s", pStr.c_str()); 
}

int _tmain(int argc, _TCHAR* argv[])
{
	for(int i=0; i < CONSOLE_WIDTH; i++)
	{
		ShiftText("Hello How Are You", i);
		Sleep(50);
		system("cls");
	}

	return 0;
}

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...