Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Dokładna wielkość okna i bufora konsoli

Ostatnio zmodyfikowano 2016-12-05 23:14
Autor Wiadomość
MohoMofi
Temat założony przez niniejszego użytkownika
[C] Dokładna wielkość okna i bufora konsoli
» 2016-12-05 01:22:03
Witam,
chciałbym dowiedzieć się, czy jest metoda, najlepiej w WinAPI, a dokładne ustawienie wielkości okna i wielkości bufora konsoli. Nie chodzi mi tylko o zmianę tych parametrów, bo to jest względnie proste, ale o ich dokładną kalibrację, niezależnie od rozdzielczości ekranu. Ponieważ, napisałem funkcję, która wykrywa wielkość bufora ina jego podstawie ustawia, kalibruje, wielkość konsoli, ale gdy uruchomię aplikację na komputerze kogoś innego, o innej wielkości ekranu i rozdzielczości, to okazuje się, że jego jedna pozycja bufora, zajmuje więcej/mniej pixeli niż u mnie. Stąd SetConsoleScreenBufferSize i MoveWindow nie stanowią panaceum na mój problem. Jest jakiś algorytm, który na podstawie rozdzielczości ekranu i innych czynników (który zapewne jeszcze nie znam), wylicza ilość pixeli przypadająca na jedną pozycję bufora i ustawia konsolę do odpowiednich dla mnie rozmiarów? Chodzi mi tutaj o dokładny rozmiar 120x30. Nie może być 121x30, czy 120x31.

Jak już tu jestem. Czy da się dostać do dokładnych stawień konsoli, takich jak "Zawiń tekst wyjściowy przy zmianie rozmiaru", które znajdują się w zakładce 'układ', ustawień konsoli.

Dziękuję z góry za pomoc.
P-154521
jankowalski25
» 2016-12-05 11:03:04
Za pomocą funkcji » WinAPIGetLargestConsoleWindowSize możesz otrzymać maksymalne rozmiary okna przy obecnie ustawionej czcionce i rozdzielczości ekranu. Jeśli weźmiesz na przykład połowę tego rozmiaru, to teoretycznie na dowolnym monitorze konsola będzie zajmowała mniej więcej taką samą część ekranu.
P-154528
MohoMofi
Temat założony przez niniejszego użytkownika
GetLargestConsoleWindowSize
» 2016-12-05 11:39:34
Z góry dziękuję za odpowiedź.

Teoretycznie. W praktyce to nie do końca chce działać. Ale teraz mnie naszło. Jakbym użył funkcji MoveWindow, żeby przemieszczać konsolę w kierunku prawego, dolnego, ekranu pulpitu, a potem czytać maxymalny możliwy rozmiar konsoli przy pomocy GetLargestConsoleWindowSize, to w końcu otrzymam to, czego potrzebuję. Szkoda, że takimi okrężnymi i spryciarskimi metodami. A więc, nie kończąc poprzedniego wątku, warto byłoby zastanowić się, czy jest może inna biblioteka, która pozwala specjalistycznie przystosowywać konsolę do własnych potrzeb? Chodzi mi np. o takie pierdoły jak ww. "Zawiń tekst wyjściowy przy zmianie rozmiaru".


EDIT.
Głupie wnioski. Bo ta funkcja zwraca największą wielkość konsoli, a nie największą, od punktu położenie lewego, górnego rogu.
P-154529
sinq
» 2016-12-05 19:51:09
Mam taką próbkę ale merytorycznie niestety nie pomogę :(
Wiem tyle. 50 to szerokość w 'spacjach'. 12 wysokość w 'enterach'
C/C++
HANDLE wHnd = GetStdHandle( STD_OUTPUT_HANDLE ); //chyba chodzi o miejsce w którym jest lewy górny róg okna konsoli. Może istnieje jakiś SetStdHandle()? :)
SMALL_RECT windowSize = { 0, 0, 50, 12 }; //deklaracja wielkosci okna
SetConsoleWindowInfo( wHnd, 1, & windowSize ); //ustaw wielkosc okna
[ cpp ]

Z buforem nie pomogę.
P-154555
MohoMofi
Temat założony przez niniejszego użytkownika
SetConsoleWindowInfo
» 2016-12-05 20:35:26
Ta funkcja jest mi znana, ale wolałbym jej nie stosować, gdyż jest dla mnie dość nieobliczalna i niezrozumiała. ;) Bo raz działa, a innym razem nie. Więc dlatego temat był założony w celu znalezienia informacji na temat patentu, wzoru obliczeniowego, który by sobie z tym poradził. ;) HANDLE wHnd = GetStdHandle( STD_OUTPUT_HANDLE );, to uchwyt okna. Czyli tak na ludzki rozum, systemowy, jednoznaczny numer identyfikacji okna w systemie. Każde okno ma uchwyt. Napisałem coś takiego:


C/C++
//**************************************************************

HWND uchwytKonsoli = GetConsoleWindow(); // zmienna przechowuje uchwyt do okna konsoli
COORD maxWielkoscBuforaKonsoli = GetLargestConsoleWindowSize( GetStdHandle( STD_OUTPUT_HANDLE ) ); //struktura przechowuje dane na temat maksymalnej wielkosci konsoli, jaka mozna wywolac przy naszej rozdzielczosci (zwraca wielkosc bufora, bez przewijania)
int szerokoscEkranu = GetSystemMetrics( SM_CXSCREEN ); // pobiera szerokosc ekranu w pixelach
int wysokoscEkranu = GetSystemMetrics( SM_CYSCREEN ); // pobiera wysokosc ekranu w pixelach

//**************************************************************


// ustawianie szerokosci i wysokosci konsoli
MoveWindow( uchwytKonsoli, 100, 100,( szerokoscEkranu / maxWielkoscBuforaKonsoli.X ) * 120,( wysokoscEkranu / maxWielkoscBuforaKonsoli.Y ) * 30, TRUE );

Lecz i to jest błędne. Bo jak się okazało, co jest dość oczywiste, okno nie składa się z samego bufora i jego wyświetlacza, ale i paska aplikacji, scrolla, ramki i pewnie są jakieś mikro przerwy pomiędzy literami.

Więc mój problem dalej nie jest rozwiązany...

Lecz dziękuję bardzo za chęci.
P-154557
jankowalski25
» 2016-12-05 21:11:42
Wiem tyle. 50 to szerokość w 'spacjach'. 12 wysokość w 'enterach'
Nie 50x12, tylko 51x13. To są współrzędne lewego górnego i prawego dolnego rogu. Aby otrzymać rozmiar 50x12, trzeba podać punkty (0;0) i (49;11), a nie (50;12).
Ta funkcja jest mi znana, ale wolałbym jej nie stosować, gdyż jest dla mnie dość nieobliczalna i niezrozumiała.
Czy nie zapominasz o tym, żeby zmienić rozmiar samego bufora? Na przykład za pomocą funkcji » WinAPISetConsoleScreenBufferSize.
i pewnie są jakieś mikro przerwy pomiędzy literami
Jeśli sam takich przerw nie dokładałeś jakimś dziwacznym kodem, to teoretycznie nie powinno ich być. Zazwyczaj czcionka ma stałą szerokość i każdy znak zajmuje tyle samo pikseli.
Bo jak się okazało, co jest dość oczywiste, okno nie składa się z samego bufora i jego wyświetlacza, ale i paska aplikacji, scrolla, ramki
Spróbuj użyć funkcji » WinAPIGetWindowRect. Uchwyt do konsoli uzyskasz wywołując funkcję » WinAPIGetConsoleWindow.
P-154559
MohoMofi
Temat założony przez niniejszego użytkownika
jankowalski25
» 2016-12-05 23:14:41
Super. O to mi chodziło. Nie wiem, jak mogłem to przeoczyć, bo zdawało mi się, że przeanalizowałem wszystkie funkcje WinAPI dostępne na cpp0x. Dziękuję Tobie i wszystkim, którzy udzielali się w temacie. ;) Wesołych świąt!

Oto kod:

C/C++
//funkcja MoveWindow zostala ponizej uzyta, pniewaz zle dziala skalowanie konsoli z malego okna do duzego, a dobrze z duzego do maleg
//stad zeby zapobiec ewentualnym problemom, postanowilem ja maksymanie powiekszyc

//**************************************************************

HANDLE wHnd = GetStdHandle( STD_OUTPUT_HANDLE ); // uchwyt do okna konsoli
SMALL_RECT windowSize = { 0, 0, 119, 29 }; // strunktura przechowujaca koordynaty lewego gornego rogu i prawego dolnego, konsoli
COORD dwSize = { 120, 30 }; // struktura przechowuje wielkosc bufora
HWND uchwytKonsoli = GetConsoleWindow(); // zmienna przechowuje uchwyt do okna konsoli

//**************************************************************

//ustawia maxymalny rozmiar konsoli
MoveWindow( uchwytKonsoli, 0, 0, 5000, 5000, TRUE );

//zmiana wielkosci okna konsoli
SetConsoleWindowInfo( wHnd, 1, & windowSize );

//zmiana wielkosci bufora konsoli
SetConsoleScreenBufferSize( wHnd, dwSize );
P-154565
« 1 »
  Strona 1 z 1