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. |
|
jankowalski25 |
» 2016-12-05 11:03:04 Za pomocą funkcji GetLargestConsoleWindowSize 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. |
|
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. |
|
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' HANDLE wHnd = GetStdHandle( STD_OUTPUT_HANDLE ); SMALL_RECT windowSize = { 0, 0, 50, 12 }; SetConsoleWindowInfo( wHnd, 1, & windowSize ); [ cpp ] Z buforem nie pomogę. |
|
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:
HWND uchwytKonsoli = GetConsoleWindow(); COORD maxWielkoscBuforaKonsoli = GetLargestConsoleWindowSize( GetStdHandle( STD_OUTPUT_HANDLE ) ); int szerokoscEkranu = GetSystemMetrics( SM_CXSCREEN ); int wysokoscEkranu = GetSystemMetrics( SM_CYSCREEN );
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. |
|
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 SetConsoleScreenBufferSize. 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 GetWindowRect. Uchwyt do konsoli uzyskasz wywołując funkcję GetConsoleWindow. |
|
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:
HANDLE wHnd = GetStdHandle( STD_OUTPUT_HANDLE ); SMALL_RECT windowSize = { 0, 0, 119, 29 }; COORD dwSize = { 120, 30 }; HWND uchwytKonsoli = GetConsoleWindow();
MoveWindow( uchwytKonsoli, 0, 0, 5000, 5000, TRUE );
SetConsoleWindowInfo( wHnd, 1, & windowSize );
SetConsoleScreenBufferSize( wHnd, dwSize );
|
|
« 1 » |