2009-02-13 9 views
26

Czy ktoś może polecać opakowanie C++ dla ncurses?C++ wrappery dla ncurses?

+0

Jestem ciekaw, dlaczego trzeba owijarki C++? Dlaczego nie skorzystać bezpośrednio z API C? Po prostu zastanawiam się :) – hhafez

+15

Oczywiście, jeśli opakowania nie istnieją. Ale jeśli opakowania istnieją, dlaczego nie korzystać z nich. Podejrzewam, że po prostu używasz asemblera do wszystkiego? – BubbaT

+5

jest trochę trudniej porównywać przechodzenie z C do C++ z przechodzeniem z C do asemblera, prawda? – hhafez

Odpowiedz

1

pisałem moje kilka lat wstecz ... Zrobiłem tak, ponieważ ncurses zgodny biblioteka została zainstalowana w systemie Linux, ale nie pod Win32. (Mógłbym używać PDCurses, ale w tym czasie nie mogłem uniemożliwić PDC_breakout() od zatrzymania operacji refresh() bez otwierania kodu źródłowego.)

To opakowanie zostało napisane w ciągu 7 dni, w ramach szybkiego rozwój. W związku z tym ma kilka (wymiennych) zależności od typów danych innych niż wejścia/wyjścia specyficzne dla programu, ale można je bezpiecznie usunąć.

Zasadniczo mam dwie główne funkcje - inicjalizację, która wywołuje wszystkie funkcje inicjowania curses i definicje kolorów, których później nie planuję poprawić, oraz funkcję odświeżania, która przenosi "wewnętrzny" bufor wyświetlania na wyjście .

Ogólnie rzecz biorąc, może czuć się bardziej komfortowo stworzenie w karcie indeksu lub oszukiwać arkusz zawierający "initscr(); cbreak(); noecho(); ruch (y, x); addch (CH); endwin(); ", ale jeśli chcesz użyć mojego opakowania, możesz wysłać do mnie wiadomość lub pobrać ją z here, o ile przestrzegasz licencji Creative Commons.

+0

Dziękuję, ale nie. To jest osobisty projekt i zacząłem pisać wersję opartą na strumieniach. Zająć mi tylko kilka godzin, żeby zrobić podstawowy szkielet. – BubbaT

13

sama ncurses zawiera zestaw wiązań C++. Nie wiem, czy któraś z głównych dystrybucji zawiera powiązania C++, ale jeśli uzyskasz ncurses source, znajdziesz je w katalogu C++.

Nie wiem, czy koniecznie zaleciłbym je, ale prawdopodobnie są najlepsze wiązania C++ i obejmuje powiązania dla rozszerzeń formularzy, paneli i menu. Są trochę szorstkie na krawędziach i nie ma zbyt wiele dokumentacji.

+0

Rzeczywiście. Czy znasz jakąkolwiek dokumentację dotyczącą wiązań? Nie mogę znaleźć takiej rzeczy w Internecie i wolałbym nie czytać źródła -_- – alkar

+0

O ile mi wiadomo tylko to, co jest w katalogu C++ w źródle ncurses. Spędziłem dużo czasu na czytaniu źródła. – Craig

+0

W katalogu docs nie ma nawet najmniejszej wskazówki. Chyba potrwa to trochę. Każda rada, od czego zacząć? – alkar

1

Kilka lat temu, kiedy go potrzebowałem, przejrzałem kilka plików przekleństw, które dostarczają przekleństw C++. Chociaż "działali" dobrze, byłem rozczarowany - ten nowy kod wprowadza jeszcze więcej "przeklętych makr". Nie rozpoznałem żadnej próby odgradzania makr (bez przestrzeni nazw, tylko kilka klas). Przypuszczam, że to nie był ich cel.

W końcu zdecydowałem, że makra te są również stapowane na zbyt wielu użytecznych symbolach, tak jak robią to tylko makra. Zakończyłem refaktoryzację mojego kodu, aby zminimalizować ekspozycję na te makra.

Zasadniczo przeniosłem kilka moich metod aplikacji, które wyświetlają rzeczy do 2 nowych plików. To refaktoryzacja stworzyła również kilka małych nowych metod, które zostały dodane do 2 nowych plików "display". (11 plików rozszerzonych do 13)

Jak mówię, działają dobrze, mój kod nie został zmieniony przez zmiany, komentarze w cursesw.h sugerują, że zmienia makra na in-lines, i znajduję klasy w tam.

cursesf.h posiada klasy używane gdzie indziej, jak cursesm.h (dla menu), cursesw.h (dla okien), curseslk.h (dla zestawu klawiszy z etykietami miękkimi), wszystkie rzeczy których jeszcze nie używałem.

Nie podobało mi się cursesapp.h - może to jest Windows?


Czy mogę polecić to? Cóż, wolę ten kod od poprzednich przekleństw, mimo że ograniczam, aby zachować zawarte makra.

-1

Być może można przewinąć własne opakowania w języku C++?

... Stworzyłem kilka wrapperów C++ dla niektórych ncurses oraz funkcji i obiektów CDK.

Jednakże, tylko stworzyłem opakowania dla funkcji i struktur jako potrzebne wsparcie dla mojego własnego małego projektu, który używa CDK i ncurses dla swojego GUI. Ale mogą dać ci pomysły na tworzenie własnych pakietów CDK w języku C++ i ncurses, których potrzebujesz.

Zasadniczo użyłem ich, aby uniknąć przecieków pamięci, ponieważ destruktory C++ usuwają wszystkie dynamicznie tworzone ciągi znaków * lub używają ciągów std::string zamiast char* i tym podobnych.

Tutaj jest bardzo skromny przykład:

class RXL_ncurses { 

public: 
    static void draw(WINDOW * pWin, int y, int x, std::string lineOfText); 
}; 

void RXL_ncurses::draw(WINDOW * pWin, int y, int x, std::string lineOfText) { 
    // 
    // Draw a std::string into the WINDOW*, starting at y,x 
    // 
    chtype letter; 
    unsigned int i; 
    unsigned int xPos; 
    unsigned int yPos; 

    for(i = 0; i < lineOfText.size(); i++) { 
    letter = (chtype) lineOfText[i]; 

    xPos = i + x; 
    yPos = y; 
    mvwaddch(pWin, yPos, xPos, letter); 
    } 
} 

http://mrflash818.geophile.net/software/nc_834v5010generator/