Fenstergröße festsetzen?



  • Hallo!

    Ich bin gerade dabei, mir ein eigenes kleines Chatprogramm zu schreiben. Dabei würde ich aber gerne verhindern, dass der Nutzer die Fenstergröße verändern kann. Wie geht sowas? 😕

    Anmerkung:
    Mir ist klar, dass das sicherlich nicht die benutzerfreundlichste Variante ist, aber sonst verwurschtelt's mir den ganzen Textkörper. 😉

    MfG S. Krachus



  • Hallo,

    Ansi C kennt keine Fenster. Welches Betriebssystem benutzt du denn?



  • vlt. solltest du mal im WinAPI Forum suchen (ich gehe einfach mal davon aus das du Windows nutzt 😉 )



  • Also ich persönlich verwende Win XP. Ich poste morgen auch den Quellcode, soweit er jetzt fertig ist.

    Dazu muss ich sagen, dass das alles nicht für mich selbst sondern für einen Freund ist, daher dauert's immer ein wenig ... Nur zur Info. (Ich weiß auch nicht, welches OS er primär nutzt, es handelt sich wohl um einen Multi-OS-Hochschulrechner 🙄 )
    Und es soll halt in Ansi C geschrieben werden. Was es mit dem "Fenster" auf sich hat, bekomme ich noch raus und füge das mit zum Quelltext hinzu.

    Soweit ich mir das jetzt denke, ist mit "Fenster" wohl die Konsole gemeint 😕 keine Ahnung.

    Verwendeter Compiler: GCC

    Schon mal Danke für die Mühen 🙂



  • Sellus_Krachus schrieb:

    Ich poste morgen auch den Quellcode, soweit er jetzt fertig ist.

    aber nicht hier! Weil das nichts mit ANSI C zu tun hat. Poste deinen Code im WinAPI Forum,



  • Sellus_Krachus schrieb:

    Hallo!

    Ich bin gerade dabei, mir ein eigenes kleines Chatprogramm zu schreiben. Dabei würde ich aber gerne verhindern, dass der Nutzer die Fenstergröße verändern kann.

    Hast du ein KonsolenProgramm? Oder richtige Windowsfenster? Aber eigentlich isses egal was gehört ins WinAPI Forum 😃



  • Also: Es handelt sich um eine Linux Oberfläche, das wußte ich aber bis gerade eben auch nicht (wie gesagt, poste das nur für einen Freund).

    [Sollte das Thema hier falsch sein, bitte nicht zu böse sein]

    #include <ncurses.h>
    int main(void)
    {
     int i, j, k, l, m;   	// i = Position des Zeichens im Satz; j= benötigt, um Fenster zu löschen
         			// k und l = benötigt, um einzelne Wörter zu bilden
     int breite, hoehe;   	// breite und höhe des Terminal-Fensters
     char *ch, **woerter;  	// StringArray des eingegebenen Satzes
     WINDOW *fenster1, *fenster2;  // Fenster1 zum chatten, Fenster2 zum eingeben des Satzes
    
     if (initscr()==NULL){  //
      fprintf(stderr, "curses init fail!\n");
      exit(1);
     }
    
     hoehe=LINES;   //eigentlich abhängig von Terminalgröße!!
      breite=COLS;
      fenster1=newwin(hoehe-3, breite, 0, 0); //erstes Fenster füllt beinahe gesamte Fenster-Größe aus
      fenster2=newwin(3, breite, hoehe-3, 0); //2. Fenster letzte 3 Zeilen (zum Eingeben des Satzes)
      clear();
      refresh();
    
     if(start_color() == OK) {  //Farben verfügbar?
      init_pair(1, COLOR_WHITE, COLOR_BLACK);  // Farbkombination für 1. Fenster
      init_pair(2, COLOR_WHITE, COLOR_RED); // Farbkombination für 2. Fenster
      init_pair(3, COLOR_GREEN, COLOR_BLACK); // Farbkombi für Nachricht (Fenster1)
      init_pair(4, COLOR_RED, COLOR_BLACK); // Farbkompi für Antwort (Fenster1)
       wattrset(fenster1, COLOR_PAIR(1));  // Farben festlegen für Fenster1
       wattrset(fenster2, COLOR_PAIR(2)); // Farben festlegen für Fenster1
     } 
      else {     //wenn keine Farben verfügbar, dann inverse Darstellung
      wattrset(fenster1, A_REVERSE); 
      wattrset(fenster2, A_REVERSE);
      }
     cbreak();   //Zeilenweise Pufferung ausschalten
     noecho();   //Echo ausschalten (kontrollierte Ausgabe)
    
     scrollok(fenster1, TRUE); //Scrollen für Fenster1 wichtig!
     // fenster1 gibt nur aus (keine Eingabe), Eingabe in Fenster2 kontrolliert -> "keypad" nicht nötig
     // scrollok für fenster2 nicht nötig, da eindeutige Anweisungen für Enter
     wclear(fenster2); //löschen des Fenster2 (auf die Hintergrundfarbe)
      refresh();
    
     do{
    
      ch=(char *)malloc(120);  //Speicherplatz freimachen
      woerter = (char **)malloc(120);
    
      for (i=0; i<20; i++)
      woerter[i]=(char *)malloc(40);
    
      i=0;    //Position im Wort muss immer wieder auf Anfang gesetzt werden
    
      for (j=0; j<breite; j++)   //Inhalt des Fensters2 löschen (statt wcls)
       mvwaddch(fenster2, 1, j, ' ');
      wrefresh(fenster2);
      box(fenster2, ACS_VLINE, ACS_HLINE); //Box um Fenster2 malen
      wmove(fenster2, 1, 1);   //Cursor an 1. Position in Fenster2 setzen
      wrefresh(fenster2);
      refresh;
    
      //neues Wort:
      do{
       if (i<0) i=0;   //Wenn wegen Löschen i kleiner 0, i auf Null setzen
       ch[i]=wgetch(stdscr);  //Zeichen einlesen
       if(ch[i] != '\n') {  //wenn Zeichen nicht Enter
    
        if (iscntrl((int)ch[i])) //Wenn Zeichen Steuerzeichen (backslash oder tab)
         {ch[i]='\0';  //Zeichen im Wort löschen
         mvwprintw(fenster2, 1, i, " ");//Ausgabe: letztes Zeichen löschen
         wrefresh(fenster2);
         i=i-2;   //in Wort 2 Zeichen zurückgehen (wird später um 1 erhöht)
         }
    
        mvwprintw(fenster2, 1, i+1, "%c", ch[i]);//Zeichen an i+1. Stelle ausgeben 
        wrefresh(fenster2);
        refresh;}
       if(i > breite-3) {   //Wenn Ende des Feldes überschritten wurde
        ch[i]='\n';   //automatisch Eingabe beenden
    
        //mögliche Ausgabe in Fenster1:
        //wprintw(fenster1, "Ihre Nachricht ist zu lang\n");
        //wrefresh(fenster1);
        break;}
       i++;    //Zum nächsten Buchstaben des Wortes weitergehen
      } while(ch[i-1] != '\n');  //Bis Wort durch drücken der Enter-Taste beendet wird.
      wattrset(fenster1, COLOR_PAIR(3)); //Nachricht-Farbkombination
      wprintw(fenster1, " Ihre Nachricht: ");
      wattrset(fenster1, COLOR_PAIR(1)); //normal-Farbkombination
      wprintw(fenster1, "%s", ch);  //eingegebenen Satz ausgeben
      wrefresh(fenster1);
      refresh();
    
      l=0; 					//l steht für die Buchstabenstelle im Wort
      m=0; 					//m steht für die Stelle des Wortes im Satz
    
      for (k=0; k<i; k++){ 			//solange wie das Ende des eingegebenen Satzes nicht erreicht wurde:
       if ((ch[k]==' ') || (ch[k]=='\n') || (ch[k]=='.') || (ch[k]=='!') || (ch[k]=='?') || (ch[k]==',')){
       					//Wenn das Zeichen ein Satzzeichen oder Leerzeichen ist, dann
        	if (woerter[m][0] != '\0')	//wenn das Wort m nicht leer ist (was es durch zwei Satz- oder Leerzeichen 
        					//hintereinander sein könnte,
    		m++;			//dann gehe zum nächsten Wort
        	l=0;    			//zum ersten Buchstaben des Wortes
        }
       else {
        woerter[m][l]=ch[k];		//ansonsten schreibe den Buchstaben in das aktuelle Wort und Buchstabe
        l++;  				//und gehe zum nächsten Buchstaben des Wortes
       }
      }
    
      //ANTWORT:
      wattrset(fenster1, COLOR_PAIR(4)); //Antwort-Farbkombination
      wprintw(fenster1, "  Antwort: ");
      wattrset(fenster1, COLOR_PAIR(1)); //normale Farbkombination
        	//Antwort ausgeben:
      	for (i=0; i<=m; i++){
      	wprintw(fenster1, "%s ", woerter[m-i]);
      	}
      	wprintw(fenster1, "\n");  
      wrefresh(fenster1);
      refresh();
     }while (strcmp(ch, "ENDE\n") != 0);  //Solange bis Programm durch Abschied beendet wird
     endwin();   //Fenster schließen
    
     //DEN GANZEN MALLOKIERTEN BEREICH FREIGEBEN!!
     //for (i=0; fld[i]!=NULL; i++)  free (fld[i]);  letztes Feld muss NULL gesetzt worden sein
     // free (fld);
    }
    

    Ich krieg's leider noch nicht mal selber kompiliert, da auf meinem WinXP Rechner einige *.h fehlen ...

    Nun aber nochmal zum Problem:
    Wie kann man es bewerkstelligen, dass die Fenstergröße NICHT verändert werden kann?
    Soweit ich weiß, wird bei jeder Größenänderung der gesamte Textkörper "durcheinandergewurschtelt" - das will ich verhindern.
    Wenn ihr aber - wovon ich ausgehe - eine bessere Variante für o.g. Quelltext habt (also wo ich die Fenstergröße ändern kann, aber der Text lesbar bleibt), her damit!!!!! 😉

    Der Code ist sicher nicht der beste -> blutiger Anfänger 🙂

    Bin für jede Hilfe/Anregung dankbar.

    (Sollte ich hier im falschen Forum sein, bitte weiterleiten 👍 )



  • ncurses ist eine UNIX (eher Posix, sollte in jedem Posix System gehen) Bibliothek, die mit GNU/Linux entwickelt wurde als eine Emmulation von der curses Bibliothek von System V Release 4.0 . Bitte stell deine Fragen im richtigen Forum. Soweit ich weiß, es gibt keine Portierung von ncurses auf Windows.

    ncurses ist keine WindowBib. die unter einer graphischen Oberfläche Fenster erzeugt, sondern Fenster auf eine Konsole.

    Mehr Information darüber erhälst du hier: http://www.gnu.org/software/ncurses/ncurses.html

    Tutorialen dafür: http://www.faqs.org/docs/Linux-HOWTO/NCURSES-Programming-HOWTO.html



  • Es soll ja gar nicht zwingend unter Windows laufen. Das beste wäre ja, dass es plattformübergreifend funktioniert. Und da ist ja wohl Ansi C das beste, oder? (Weil es soll auf jeden Fall C sein, nich Java oder irgendwas anderes)

    Aber gut, ich poste das ganze auch noch mal ins Linux-Forum.

    Danke für die Links 🙂


Anmelden zum Antworten