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