logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C\C++][Win32] Tryb tekstowy, konsola na pełnym ekranie.

Freeradio 09 Maj 2007 14:47 3909 12
REKLAMA
  • #1 3865735
    Freeradio
    Poziom 15  
    Posty: 194
    Pomógł: 9
    Ocena: 4
    Witam,
    Potrzebuję zrobić zwykły program konsolowy, z tą jednak różnicą, że konsola musi być wyświetlana na pełnym ekranie. Przydało by się by program działał na WinXP, 98, itp.
    Korzystam ze środowiska DevCpp, i najlepiej by wykorzystać tamte biblioteki o ile takie są...
    Ktoś orientuje się w temacie? Byłbym wdzięczny za pomoc.
  • REKLAMA
  • Pomocny post
    #2 3865907
    lord_dagoth
    Poziom 25  
    Posty: 860
    Pomógł: 68
    Ocena: 6
    Nie jestem do końca pewien, ale chyba konsoli nie da się zmaxymalizować na pełen ekran. Możesz natomiast zwiększyć/zmniejszyć jej bufor, czyli np zmieniasz go na 120x120 znaków. Metodą proob i błędów dojdziesz do tego, w jakim ustawieniu będzie zmaxymalizowana.

    Nie pamiętam dokladnie jaka funkcja winApi zmieniała bufor konsoli, ale to możesz łatwo wygooglować ;)
  • #3 3866626
    Freeradio
    Poziom 15  
    Posty: 194
    Pomógł: 9
    Ocena: 4
    Wiesz chodzi o to by to było dosłownie jak w DOSie pod VGA. Czyli chyba rozdzielczość 320x240 czy coś takiego. Widziałem takie programy, tylko nie wiem jak to napisać..
  • REKLAMA
  • Pomocny post
    #4 3866830
    Sagaceil
    Poziom 11  
    Posty: 29
    Pomógł: 2
    Ocena: 1
    trzeba uzyc tryby 13h
    poszukaj w necie, od groma tego jest o tym (nie pamietam dokładnie inicjalizacji - PASCAL asm mov ax, 13h, int 10h , cos takiego)

    Dodano po 3 [minuty]:

    o mam (pamietaj, podaje pod Pascala, nie dobrze wiem, jak sie assamblerem obslugiwac w c++)

    PROCEDURE SetVga; - to włącz tryb 13h
    BEGIN
    ASM
    mov AX, 13h
    int 10h
    END;
    END;

    grafika jest przechowywana w segmecie $A000

    wyłączenie (powrót do txt) :

    PROCEDURE SetTxt;
    BEGIN
    ASM
    mov AX, 0003h
    int 10h
    END;
    END;

    jak umiesz ass pod c++, to powinienes to bez problemu przerobic
  • Pomocny post
    #6 3867134
    Faust
    Poziom 17  
    Posty: 135
    Pomógł: 22
    Ocena: 4
    Freeradio napisał:
    Wiesz chodzi o to by to było dosłownie jak w DOSie pod VGA. Czyli chyba rozdzielczość 320x240 czy coś takiego. Widziałem takie programy, tylko nie wiem jak to napisać..

    To ma być tryb graficzny, na GCC to raczej nie ruszy, potrzebujesz starego kompilatora, tak żeby kompilował programy pod dos'a. Taki kod jaki podał Sagaceil po skompilowaniu kompilatorem 32-bitowym i uruchomieniu pod windowsem uraczy nas błedem Acces Violation.
    Poszukaj jakiejś dobrej biblioteki do obsługi grafiki: Allegro, SDL, itp. Warto się nauczyć, może się przydać na przysłość.
    wiesniak: funkcja SetConsoleDisplayMode chyba nie ruszy na 98, z tego co się orientuje śmiga tylko na XP i Viście.
  • REKLAMA
  • #7 3867266
    lord_dagoth
    Poziom 25  
    Posty: 860
    Pomógł: 68
    Ocena: 6
    do robienia wstawek asemblerowych w C++ służy funkcja asm, poczytaj o niej.

    http://kondel.ko.funpic.de/?pid=27

    A jeżeli chodzi o zrobienie fulscreena, to naprawde z konsolą będzie Ci trudno. Widziałem kiedyś, jak mój kolega napisał swoją "konsole", na potrzeby gry textowej, obsługującej znacznie więcej kolorów i oczywiście możliwość full screena, tyle że on to robił w directX'ie, z odświeżaniem itd
  • #8 3869192
    Freeradio
    Poziom 15  
    Posty: 194
    Pomógł: 9
    Ocena: 4
    -> lord_dagoth
    O Asmi'e w GCC mogę zapomnieć, bo niestety nie jest on w intelowskiej notacji tylko w AT&T przy której głowa boli...
    Ewentualnie mogę spróbować skompilować plik asm i dołączyć go do linkera, ale nie za bardzo wiem jak się to robi w ASM.
    Ja tez taką konsolę napisałem właśnie przy użyciu SDL, ale to nie to ;)

    -> Faust
    Zastanawiałem się nad SDL bo to mam opanowane, ale denerwują mnie DLL'e. Wolałbym mieć to wszystko w jednym pliku.
    No to najwyżej zrezygnuję z Win98.

    -> wiesniak
    Twoje rozwiązanie wydaje mi się najprostsze...
    Ale spróbuję też zrobić to co zaproponował Sagaceil, tylko w osobnym pliku.

    Czy ktoś mógłby mi podpowiedzieć jak napisać w ASM procedurę z tym kodem, tak bym mogł ją wywołać w C ( chodzi o to by linker ją widział )
    Najlepiej pod Netwide Assembler. Byłbym wdzięczny..

    Dzięki wszystkim za pomoc, macie swoje punkty ;)
  • REKLAMA
  • #9 3870168
    Adek336
    Poziom 11  
    Posty: 8
    Rozwiązanie Sagaceila pod Windows nie zadziała- bo opiera się 16bitowym interfejsie BIOSu. Pod Windowsem, Windows zapewnia obsługę grafiki, a przerwanie 10h jest wywoływane przez procesor, w przypadku błędu koprocesora.
  • #10 3872832
    Freeradio
    Poziom 15  
    Posty: 194
    Pomógł: 9
    Ocena: 4
    Niestety podczas kompilacji Mingw wykrzacza się, że nie widzi sygnatury funkcji SetConsoleDisplayMode, mimo że taka jest tam zadeklarowana. Deklaracje poprzedzone są warunkiem #if dla preprocesora, który sprawdza jaką wartość ma leksem _WIN32_WINNT chyba czy cos takiego - odpowiedzialny za wersję Windowsa. Zmieniłem wartość tego na taką jaką pisało na MSDN. Skompilowało się, jednak konsola nie zmieniła rozmiaru...
    Jako wskaźnika konsoli użyłem adresu jaki zwraca funkcja GetConsoleWindow i podałem to jako parametr funkcji SetDis..... poprzedzając operatorem & ;)

    Skoro obydwa rozwiązania nie działają, to może jest jakiś jeszcze sposób? W ogóle czy to jest do zrobienia na 32bitowym kompilatorze..?
  • Pomocny post
    #11 3874579
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    kiedy chciałem pozycjonować dowolnie kursor, korzystałem z funkcji
    void gotoxy(int x, int y)
    {
    	COORD c;
    	c.X = x - 1;
    	c.Y = y - 1;
    	SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), c);
    }

    może też spróbujesz funkcji GetStdHandle z takim samym parametrem?
  • Pomocny post
    #12 3875304
    Faust
    Poziom 17  
    Posty: 135
    Pomógł: 22
    Ocena: 4
    To ustawia konsole na fullscreen:
    
    void FullScr() 
    {
    	typedef BOOL (WINAPI *SCDM)(HANDLE,DWORD,PCOORD);
    	HINSTANCE hLib = LoadLibraryA("KERNEL32.DLL");
    	SCDM uchwyt;
    	COORD xy;
    	xy.X=40;//szerokosc ekranu w znakach mozna wstawic inne, wtedy sie przeskaluje
    	xy.Y=80;//wysokosc w znakach
    	//standard to chyba 40x80 znakow.
    	uchwyt = (SCDM)GetProcAddress(hLib,"SetConsoleDisplayMode");
    	uchwyt(GetStdHandle(STD_OUTPUT_HANDLE),1,&xy);
    	FreeLibrary(hLib);
    }
    

    Wymagany windows XP albo Vista.
  • #13 3894621
    Freeradio
    Poziom 15  
    Posty: 194
    Pomógł: 9
    Ocena: 4
    Dzięki za pomoc, przepraszam że długo nie odpisywałem.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy stworzenia programu konsolowego w C/C++ na platformę Win32, który wyświetlałby konsolę w trybie pełnoekranowym, działającym na systemach Windows XP, 98 i starszych. Użytkownik korzysta z DevCpp i preferuje użycie dostępnych tam bibliotek. Wskazano, że standardowa konsola Windows nie pozwala na pełne maksymalizowanie do trybu pełnoekranowego, ale można manipulować rozmiarem bufora konsoli. Proponowano użycie funkcji WinAPI SetConsoleDisplayMode, jednak działa ona tylko na Windows XP i Vista, a na starszych systemach nie jest wspierana. Alternatywnie zasugerowano przejście do trybu graficznego VGA 13h (320x240, 256 kolorów) za pomocą asemblera, jednak ten sposób jest niekompatybilny z 32-bitowym Windows i nowoczesnymi kompilatorami, powodując błędy dostępu. Wskazano, że pod Windows lepszym rozwiązaniem jest użycie bibliotek graficznych takich jak Allegro lub SDL, choć użytkownik wyraził obawy dotyczące zależności od DLL. Podano przykładową implementację funkcji pełnoekranowej wykorzystującej dynamiczne ładowanie funkcji SetConsoleDisplayMode z kernel32.dll, działającą na Windows XP i Vista. Poruszono także kwestie integracji kodu asemblerowego z C++ przy użyciu Netwide Assembler (NASM) i różnic w notacji asemblera między GCC (AT&T) a Intel. Ostatecznie uznano, że pełnoekranowa konsola tekstowa w stylu DOS jest trudna do osiągnięcia na współczesnych systemach 32-bitowych bez przejścia na tryb graficzny lub użycia specjalistycznych bibliotek.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA