eingabe in der consolen mitte



  • so nach dem motto ➡ x[Achse ist Wert] y[Achse ist Wert] währ schön.
    Gibts da eine Mögichkeit ?



  • Die Anfangsposition für einen String str der Länge len bekommst du die Koordinaten für den Beginn der Ausgabe über folgende Berechnungen:

    string str = "Hello World";
    int len = str.length();
    
    int xbegin = (xges/2)-(len/2)
    int ybegin = (yges/2)
    
    gotoxy(xbegin,ybegin)
    cout << str;
    

    Die unbekannten Variablen xges und yges und die fehlende Funktion gotoxy() kannst du mit Hilfe der Improved Console einbinden: http://ic.c-plusplus.net

    MfG SideWinder



  • wie ist das eigentlich mit der improved console und Dev C++ ?
    gibts da probleme die auf mich zukommen könnten ?



  • Ja, es kriselte immer schon etwas. Jetzt wo der Compatibility-Mode weggefallen ist könnte es tatsächlich nicht mehr funktionieren. Das hängt ganz davon ab, ob der DevC++ eine neueren Port der WinAPI hat, oder nicht.

    Am besten startest du einen Versuch und kommst mit etwaigen Fehlern hier an und wir versuchen zu helfen.

    Im absoluten Notfall empfehle ich den VC 2005 Express Edition (Ganz abgesehen davon, dass dies wahrscheinlich sowieso für dich der bessere Compiler ist).

    MfG SideWinder



  • Ich würde sowieso vom DevC++ abraten...



  • Ich muss ehrlich gesagt für meinen Teil sagen, dass ich einen anderen Weg empfehle: nimm den BorlandC++5.5 als Kommandozeilenversion, lässt sich falls notwenig auch in IDEs nutzen und hat die conio.h für DOS/Windows. Dadurch bleibt das Programm imho portabler. Hab mir mittlerweile einen Wrapper für conio/curses selbst gebastelt und für das Verständnis finde ich das auch sinnvoll. Ist ja kein so großes Projekt für eine Person... 😉



  • Folgendes:

    Ich füge die datei(n) zu meinem Projekt hinzu.
    Dann Drück ich [F9] und es gibt Diese Meldung aus:

    in Member Funktion `void ic::Console::setWndSize(int,int)`:
    "min" wurde nicht erklärt (nutze erst diese Funktion)
    [Build>Error]exe:*** [path/to/prjkt/ic.o
    

    Benutze: Dev C++ version 4.9.9.2



  • Jetzt weiß ich wieder, volkard, warum ich damals min() nicht verwenden wollte. Damit ich DevC++-Kompatibilität erreiche 🙂

    So, also zurück zum Thema. Du gehst in die Datei "ic.cpp" und fügst dort am Beginn (über den Includes) folgende Zeile ein:

    #define min(a, b) (((a) < (b)) ? (a) : (b))
    

    MfG SideWinder



  • Immer noch der selbe Error



  • Im schlimmsten Fall steht in dienem WinAPI-Port irgendwo "#undef min" ungeschützt drin, also versuch die oben gepostete Zeile unter den Includes anzubringen.

    MfG SideWinder



  • hmm ➡ neue funktionen wollen auch erklärt sein.
    so weit ich verstehe fehlt dar noch code
    Welche Daten gehören zu:

    string a = ?;
    string b = ?;
    


  • Daten, huh? Das was du hier siehst ist keine Funktion sondern ein Makro, es wird vom Präcompiler ersetzt. Das ist zwar unter C++ kein guter Programmierstil wird aber in der WinAPI (Die in C geschrieben ist) oftmals benützt. Da dir das in der WinAPI fehlt hab ich dir meine Version des Makros aus der WinAPI gegeben.

    Schreibst du im Code nun:

    min(5,4);
    

    führt der Präcompiler eine Textersetzung durch und der Compiler sieht nur noch:

    (((5) < (4)) ? (5) : (4))
    

    Die vielen Klammern sind in diesem speziellen Fall unnötig, damit aber nichts passieren kann wenn man "min(5-4,3-2)" aufruft, sollte man sie unbedingt lassen 🙂

    BTW: Funktioniert es jetzt? Die ganze IC unter deinem Compiler?

    MfG SideWinder



  • Noch nicht ganz ...

    "((void)5 ,4)" kann man nicht als Funktion nutzen
    


  • Zeile? min(5,4) wird doch nirgends aufgerufen, min wird doch in einem ganz anderem Kontext verwendet, du sollst nur die Zeile von vorher unter die Includes (in der ic.cpp!) schreiben, sonst nix 😕

    MfG SideWinder



  • bin halt a bisserl plan los ... sorry



  • namenlos schrieb:

    bin halt a bisserl plan los ... sorry

    Einfach genauer lesen 😉 Funktionierts jetzt oder nicht? 🙂

    MfG SideWinder



  • will aber immer noch a und b wissen
    und meint Wörtlich in zeile 248(ich habs hoffentlich richtig plaziert):Each undeclared identifier is reported only once for each funktion it appears in



  • Zeig mal deine ic.cpp her, da stimmt ja was nicht 🙂

    MfG SideWinder



  • ///// Includes /////////////////////////////////////////////////////////////////
        #include "ic.hpp"
        ////////////////////////////////////////////////////////////////////////////////
        #define min (a, a) (((a) < (b)) ? (a) : (b))
        namespace ic
        {
            ///// Console //////////////////////////////////////////////////////////////
            const COORD Console::origin = {0,0};
    
            Console::Console ()
                : hWnd(GetConsoleWindow())
                , hConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE))
                , wndBufMode(false)
            {
                HMODULE kernel32 = GetModuleHandle(TEXT("kernel32.dll"));
                SetConsoleDisplayMode = reinterpret_cast<SETCONSOLEDISPLAYMODE>(GetProcAddress(kernel32,"SetConsoleDisplayMode"));
    
                disableWndBufMode();
                setWndPos(100,100);
                setWndSize(80,25);
                clear();
            }
    
            Console::~Console ()
            {
                enableWndBufMode();
            }
    
            Console& Console::getInstance ()
            {
                static Console instance;
                return instance;
            }
    
            void Console::hide ()
            {
                ShowWindow(hWnd,SW_HIDE);
            }
    
            void Console::show ()
            {
                ShowWindow(hWnd,SW_SHOW);
            }
    
            void Console::minimize ()
            {
                ShowWindow(hWnd,SW_MINIMIZE);
            }
    
            void Console::maximize ()
            {
                ShowWindow(hWnd,SW_MAXIMIZE);
            }
    
            void Console::restore ()
            {
                ShowWindow(hWnd,SW_NORMAL);
            }
    
            void Console::clearColor (Color color)
            {
                DWORD attrsWritten;
                FillConsoleOutputAttribute(hConsoleOutput,color,getWndBufSizeX()*getWndBufSizeY(),origin,&attrsWritten);
            }
    
            void Console::clearText (TCHAR character)
            {
                DWORD charsWritten;
                FillConsoleOutputCharacter(hConsoleOutput,character,getWndBufSizeX()*getWndBufSizeY(),origin,&charsWritten);
            }
    
            void Console::clear (Color color, TCHAR character)
            {
                clearColor(color);
                clearText(character);
            }
    
            TextColor Console::getTextColor () const
            {
                return getTextColor(getCSBI().wAttributes);
            }
    
            void Console::setTextColor (TextColor color)
            {
                SetConsoleTextAttribute(hConsoleOutput,color|getBgColor());
            }
    
            BgColor Console::getBgColor () const
            {
                return getBgColor(getCSBI().wAttributes);
            }
    
            void Console::setBgColor (BgColor color)
            {
                SetConsoleTextAttribute(hConsoleOutput,getTextColor()|color);
            }
    
            Color Console::getColor () const
            {
                return getCSBI().wAttributes;
            }
    
            void Console::setColor (Color color)
            {
                SetConsoleTextAttribute(hConsoleOutput,color);
            }
    
            int Console::getCurPosX () const
            {
                return getCSBI().dwCursorPosition.X;
            }
    
            int Console::getCurPosY () const
            {
                return getCSBI().dwCursorPosition.Y;
            }
    
            void Console::setCurPos (int x, int y)
            {
                COORD pos;
                pos.X = x;
                pos.Y = y;
                SetConsoleCursorPosition(hConsoleOutput,pos);
            }
    
            int Console::getCurSize () const
            {
                CONSOLE_CURSOR_INFO cci = getCCI();
    
                if(!cci.bVisible)
                    return 0;
    
                return cci.dwSize;
            }
    
            void Console::setCurSize (int size)
            {
                CONSOLE_CURSOR_INFO cci;
    
                if(size > 0)
                {
                    cci.bVisible = TRUE;
                    cci.dwSize = size;
                }
                else
                {
                    cci.bVisible = FALSE;
                    cci.dwSize = 100;
                }
    
                SetConsoleCursorInfo(hConsoleOutput,&cci);
            }
    
            bool Console::isWndBufMode () const
            {
                return wndBufMode;
            }
    
            void Console::enableWndBufMode ()
            {
                SetConsoleMode(hConsoleOutput,ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT);
                wndBufMode = true;
            }
    
            void Console::disableWndBufMode ()
            {
                SetConsoleMode(hConsoleOutput,ENABLE_PROCESSED_OUTPUT);
                setWndBufSize(getWndSizeX()+1,getWndSizeY()+1);
                wndBufMode = false;
            }
    
            bool Console::isWndFSMode () const
            {
                DWORD flags;
                GetConsoleDisplayMode(&flags);
    
                return flags & CONSOLE_FULLSCREEN_MODE;
            }
    
            void Console::enableWndFSMode ()
            {
                COORD newScreenBufferDimensions;
                SetConsoleDisplayMode(hConsoleOutput,CONSOLE_FULLSCREEN_MODE,&newScreenBufferDimensions);
            }
    
            void Console::disableWndFSMode ()
            {
                COORD newScreenBufferDimensions;
                SetConsoleDisplayMode(hConsoleOutput,CONSOLE_WINDOWED_MODE,&newScreenBufferDimensions);
            }
    
            int Console::getWndPosX () const
            {
                RECT rect;
                GetWindowRect(hWnd,&rect);
    
                return rect.left;
            }
    
            int Console::getWndPosY () const
            {
                RECT rect;
                GetWindowRect(hWnd,&rect);
    
                return rect.top;
            }
    
            void Console::setWndPos (int x, int y)
            {
                SetWindowPos(hWnd,0,x,y,0,0,SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
            }
    
            int Console::getWndBufSizeX () const
            {
                return getCSBI().dwSize.X;
            }
    
            int Console::getWndBufSizeY () const
            {
                return getCSBI().dwSize.Y;
            }
    
            void Console::setWndBufSize (int x, int y)
            {
                if(!wndBufMode)
                    return;
    
                COORD size;
                size.X = x;
                size.Y = y;
                SetConsoleScreenBufferSize(hConsoleOutput,size);
            }
    
            int Console::getWndSizeX () const
            {
                return getCSBI().srWindow.Right - getCSBI().srWindow.Left + 1;
            }
    
            int Console::getWndSizeY () const
            {
                return getCSBI().srWindow.Bottom - getCSBI().srWindow.Top + 1;
            }
    
            void Console::setWndSize (int x, int y)
            {
    	    min (5, 4)
                if(!wndBufMode)
                {
                    zeroWndSize();
    
                    COORD bufSize;
                    bufSize.X = min(x,getMaxWndSizeX());
                    bufSize.Y = min(y,getMaxWndSizeY());
                    SetConsoleScreenBufferSize(hConsoleOutput,bufSize);
                }
    
                SMALL_RECT wndSize;
                wndSize.Top = 0;
                wndSize.Left = 0;
                wndSize.Right = min(x,getMaxWndSizeX()) - 1;
                wndSize.Bottom = min(y,getMaxWndSizeY()) - 1;
                SetConsoleWindowInfo(hConsoleOutput,TRUE,&wndSize);
            }
    
            int Console::getMaxWndSizeX () const
            {
                return GetLargestConsoleWindowSize(hConsoleOutput).X;
            }
    
            int Console::getMaxWndSizeY () const
            {
                return GetLargestConsoleWindowSize(hConsoleOutput).Y;
            }
    
            std::basic_string<TCHAR> Console::getTitle () const
            {
                const int MAX_TITLE_LEN = 64 * 1024;
    
                TCHAR title [MAX_TITLE_LEN];
                GetConsoleTitle(title,MAX_TITLE_LEN);
    
                return title;
            }
    
            void Console::setTitle (const std::basic_string<TCHAR>& title)
            {
                SetConsoleTitle(title.c_str());
            }
    
            CONSOLE_CURSOR_INFO Console::getCCI () const
            {
                CONSOLE_CURSOR_INFO cci;
                GetConsoleCursorInfo(hConsoleOutput,&cci);
    
                return cci;
            }
    
            CONSOLE_SCREEN_BUFFER_INFO Console::getCSBI () const
            {
                CONSOLE_SCREEN_BUFFER_INFO csbi;
                GetConsoleScreenBufferInfo(hConsoleOutput,&csbi);
    
                return csbi;
            }
    
            void Console::zeroWndSize ()
            {
                COORD bufSize;
                bufSize.X = 1;
                bufSize.Y = 1;
                SetConsoleScreenBufferSize(hConsoleOutput,bufSize);
    
                SMALL_RECT wndSize;
                wndSize.Top = 0;
                wndSize.Left = 0;
                wndSize.Right = 0;
                wndSize.Bottom = 0;
                SetConsoleWindowInfo(hConsoleOutput,TRUE,&wndSize);
            }
    
            Console& con = Console::getInstance();
            ////////////////////////////////////////////////////////////////////////////
        }
    


  • #define min (a, a) (((a) < (b)) ? (a) : (b))
    // Muss so heißen:
    #define min(a, b) (((a) < (b)) ? (a) : (b))
    

    MfG SideWinder


Anmelden zum Antworten