Skocz do zawartości


Zdjęcie

[c++] Maksymalizacja okna konsoli


  • Zaloguj się, aby dodać odpowiedź
Brak odpowiedzi do tego tematu

#1 Kai

Kai

    Stały użytkownik

  • 237 postów

Napisano 14 04 2007 - 11:58

Każdy chyba wie, że w programowaniu każdą rzecz można zrobić na kilka, dziesiątki, setki sposobów. W zależności właśnie od zadania. Tak też jest z takim trikiem jak maksymalizacja okna konsoli w c++.
Przedstawię tylko jeden. Resztę znajdziecie sami bo będziecie mieli punkt odniesienie. Ewentualnie możecie spytać, choć osobiście podchodzę z założenie, że ćwiczenie, a co zarazem idzie szukanie czyni mistrza - więc polecam jednak google :]
Reasumując naszym zadaniem będzie utworzenie (w moim przypadku w Dev-C++ 4.9.9.2) wyboru czy zmaksymalizować, czy pozostawić normalne okienko i w wypadku tego pierwszego wyboru dosowskie okienko zostanie zwiększone do rozmiarów ekranu (jak wiadomo standardowo pod dosem można je zwiększyć do połowy i to jeszcze z menu i titleboxem :]).1. na początek wiadomo: File/New/Project... => Console Application => Nazwa => Docelowy Zapis i mamy coś takiego.
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
	system("PAUSE");
	return EXIT_SUCCESS;
}
2. Na początek musicie zaincludeować nowy nagłówek #include <windows.h> i polecam zmienić końcowe system("PAUSE"); na getch();* lub wprowadzenie nowej zmiennej, np. char jeśli jesteś pod Windowsem - w stylu: char wyjdz; cin >> wyjdz;. Zalecam też zmienić na końcu return EXIT_SUCCESS; na return 0;.* z getch(); pod Devem mogą się zrodzić problemy. Jeśli chcesz użyć tej funkcji to musisz zaincludować #include <conio.h>. Niestety jest to borlandowski nagłówek i nie zawsze działa on dobrze pod tym kompilatorem w którym piszemy teraz. Jeśli taki problem by wystąpił należy ściągnąć conio2.h z nofollow paczki, zainstalować, po czym w kompilatorze wejść: Project/Project Options/Parameters/Add Library or Object i w folderze z kompilatorem w lib dodać libconio.a Zamiast includeowania conio.h musiecie wtedy zaincludeować conio2.h.
Tak więc przy standardowym conio.h (zakładam, że jednak będzie działać, jeśli nie - zrób powyższe :]) i po zmianach nasz kod będzie wyglądać tak.
[/list]
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{
	getch();
	return 0;
}
3. Na początek ciała programu należałoby zadeklarować jakąś zmienną która będzie sprawdzać czy użytkownik wybrał opcję zmaksymalizowaną, czy nie. A ponieważ najłatwiej operować jest na liczbach to możemy wrzucić zmienną całkowitą, oczywiście short (2 bitowa) i unsigned (liczby dodatnie tylko). Dodatkowo należało by wyświetlić jakieś pytanie (ja to zrobię na cout'ach, a nie na printf'ach bo będzie to łatwiejsze do zrozumienia) o maksymalizacje i pobranie wyniku (na cin'ach).
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{
	unsigned short int wybor;
	cout << "Czy chcesz zmaksymalizowac okno na starcie? [wpisz 1, aby sie zgodzic] ";
	cin >> wybor;
	getch();
	return 0;
}
4. Jak widać zawarłem już część tego co będziemy robić dalej powyżej. Chodzi o tą jedynkę :] Tak, teraz będzie warunek: jeśli użytkownik wciśnie 1 - nastąpi przekierowanie do funkcji maksymalizującej, jeśli inną cyfrę większą lub równą 0 - okienka pozostanie takie jakie jest. Można to zrobić na kilka sposobów, np. poprzez warunek if (bardziej popularny) i switch (szybszy). Powiedzmy w kwestiach edukacyjnych pokażę obydwa sposoby, gdyż stworzymy sobie dwie funkcje: jedną do sprawdzania wyboru, druga do ustawiania okna. Pierwsza funkcja do sprawdzania wyboru warunkiem if będzie sprawdzać, czy użytkownik wcisnął 1, czy coś innego. W stylu: jeśli użytkownik wcisnął 1, wywołaj kolejną funkcję z argumentem true, jeśli coś innego z argumentem false. Oczywiście w sekcji main musimy wywołać tą funkcję sprawdzania wyboru, a ona sama musi być nad głównym ciałem. Czyli.
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>

using namespace std;

void maksymalizacja(int maks_wybor)
{
	if ( maks_wybor == 1 )
	{
		maksymalizuj(true); // jesli w wybor zostala wpisana 1 - wywolanie maksymalizacji okna z funkcji maksymalizuj
	}
	else {
		maksymalizuj(false); // jesli zostalo wpisane cos innego - pozostawienie okna takiego jakie jest
	}   
}

int main(int argc, char *argv[])
{
	unsigned short int wybor;
	cout << "Czy chcesz zmaksymalizowac okno na starcie? [wpisz 1, aby sie zgodzic] ";
	cin >> wybor;
	maksymalizacja(wybor); // wywołanie powyższej funkcji sprawdzającej wybór (czyli to co zostało pobrane do zmiennej wybor)
	getch();
	return 0;
}
5. No i na koniec funkcja maksymalizuj maksymalizująca lub nie okno. Na switchu rzecz jasna. Jak on działa? Prosta sprawa. Podajemy zmienną którą switch ma sprawdzać i wewnątrz niego poprzez case wyłapywanie wartości. Jeśli zmienna którą sprawdzamy ma wartość w którymś z case'ów to zostaje wykonany kod wewnątrz tego case'a. Na końcu najczęściej dodaje się default, czyli kod wykonywany jeśli żaden z case'ów nie zostanie spełniony. No i pamiętajcie by po każdym bloku dodawać break; - inaczej nawet po spełnieniu warunku program będzie sprawdzał kolejne.
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>

using namespace std;

void maksymalizuj(bool prawda_falsz)
{
	switch ( prawda_falsz )
	{
		case true:
			SetConsoleDisplayMode( GetStdHandle( STD_OUTPUT_HANDLE ), CONSOLE_FULLSCREEN_MODE, NULL); // maksymalizacja
			break;
		default:
			SetConsoleDisplayMode( GetStdHandle( STD_OUTPUT_HANDLE ), CONSOLE_WINDOWED_MODE, NULL); // tryb okienkowy
			break;
	}  
}

void maksymalizacja(int maks_wybor)
{
	if ( maks_wybor == 1 )
	{
		maksymalizuj(true);
	}
	else {
		maksymalizuj(false);	 
	}   
}

int main(int argc, char *argv[])
{
	unsigned short int wybor;
	cout << "Czy chcesz zmaksymalizowac okno na starcie? [wpisz 1, aby sie zgodzic] ";
	cin >> wybor;
	maksymalizacja(wybor);
	getch();
	return 0;
}
6. Sprawa ostateczna. A dokładniej dwie. Użyłem w funkcjach na początku jako deklaracje void, a nie int bo funkcje te nic nie zwracają. Druga sprawa - na 99% program Wam nie działa. Tak? :> Niestety często stosując WinAPI (bo SetConsoleDisplayMode to odwołanie do WinAPI) należy zadeklarować na początku dyrektywę, w tym przypadku stałą preprocesora. W tym wypadku musi ona sprawdzić, czy system na którym działa aplikacja jest z serii NT (a co za tym idzie program będzie działał prawidłowo tylko na tej serii). Czyli nas cały, końcowy kod wygląda tak:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0502
#endif 

#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>

using namespace std;

void maksymalizuj(bool prawda_falsz)
{
	switch ( prawda_falsz )
	{
		case true:
			SetConsoleDisplayMode( GetStdHandle( STD_OUTPUT_HANDLE ), CONSOLE_FULLSCREEN_MODE, NULL);
			break;
		default:
			SetConsoleDisplayMode( GetStdHandle( STD_OUTPUT_HANDLE ), CONSOLE_WINDOWED_MODE, NULL);
			break;
	}  
}

void maksymalizacja(int maks_wybor)
{
	if ( maks_wybor == 1 )
	{
		maksymalizuj(true);
	}
	else {
		maksymalizuj(false);	 
	}   
}

int main(int argc, char *argv[])
{
	unsigned short int wybor;
	cout << "Czy chcesz zmaksymalizowac okno na starcie? [wpisz 1, aby sie zgodzic] ";
	cin >> wybor;
	maksymalizacja(wybor);
	getch();
	return 0;
}

Mam nadzieję, że tutorial jest zrozumiały i prosty. Pytania proszę tutaj.

© m1chu.eu, 2007
Tutorial udostępniony na forum.tweaks.pl. Nie wyrażam zgody na jego przetwarzanie, kopiowanie, wykorzystywanie całości, ani części bez mojej zgody na inne strony lub do innych materiałów niezwiązanych bezpośrednio z serwisem tweaks.pl.


  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych