Форум » [x]Harbour » Как переключить консоль в полный экран и обратно (или наоборот) ? » Ответить

Как переключить консоль в полный экран и обратно (или наоборот) ?

Петр: Например, с помощью вот такой функции: SetConsoleDisplayMode( nOutHandle, nConsoleMode ) -> nSuccess где nOutHandle - дескриптор консоли вывода, как правило получаем с помощью стандартной [x]Harbour функции Hb_GetStdOut(); nConsoleMode - запрашиваемый режим отображения консоли, может принимать значения CONSOLE_WINDOWMODE или CONSOLE_FULLSCREEN (наверное и другие тоже {:)) CONSOLE_WINDOWMODE - оконный режим (отображение в окне); CONSOLE_FULLSCREEN - полноэкранный режим (отображение во весь экран). Функция возвращает: 0 - в случае успеха, т.е. запрашиваемый режим консоли успешно установлен; 1 - запрашиваемый режим консоли не может быть установлен. Здесь возможны два варианта - или запрашиваемый режим уже установлен и вы пытаетесь его установить повторно, или такой режим работы не поддерживается. -1 - скорее всего ваша ОС не поддерживает возможность переключения режима отображения консоли. Примечание: GTWIN only, Windows NT/2000/XP only {:(. Функция использует недокументированную одноименную функцию BOOL SetConsoleDisplayMode ( HANDLE hOut, // standard output handle DWORD dwNewMode, // specifies the display mode LPDWORD lpdwOldMode // address of variable for previous value of display mode ), экспортируемую из kernel32.dll (не содержится в kernel32.lib!). Тестировано с Harbour 1.0 + BCC582, VC7; WinXP HE SP2, WinXP PRO SP1, SP2 #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" static HANDLE DosToWinHandle( HB_FHANDLE fHandle ); static HANDLE DosToWinHandle( HB_FHANDLE fHandle ) /* from filesys.c */ { if( fHandle == ( HB_FHANDLE ) 0 ) return GetStdHandle( STD_INPUT_HANDLE ); else if( fHandle == ( HB_FHANDLE ) 1 ) return GetStdHandle( STD_OUTPUT_HANDLE ); else if( fHandle == ( HB_FHANDLE ) 2 ) return GetStdHandle( STD_ERROR_HANDLE) ; else return ( HANDLE ) fHandle; } typedef BOOL (WINAPI *PROCSETCONSOLEDISPLAYMODE)(HANDLE,DWORD,LPDWORD); HB_FUNC ( SETCONSOLEDISPLAYMODE ) { PROCSETCONSOLEDISPLAYMODE SetConsoleDisplayMode; HMODULE hKernel32 = GetModuleHandle("kernel32"); if ( hKernel32 != NULL ) SetConsoleDisplayMode = (PROCSETCONSOLEDISPLAYMODE) GetProcAddress( hKernel32, "SetConsoleDisplayMode" ); if ( SetConsoleDisplayMode != NULL ) { DWORD dwOldMode; HANDLE hOut = DosToWinHandle( (HB_FHANDLE) hb_parnint(1) ); hb_retni( SetConsoleDisplayMode( hOut, (DWORD) hb_parnl(2), &dwOldMode) ? (INT) 0 : (INT) 1 ); if ( hb_pcount() > 2 && ISBYREF(3) ) { hb_stornl( (LONG) dwOldMode, 3 ); } } else hb_retni( (INT) -1 ); } #pragma ENDDUMP

Ответов - 28, стр: 1 2 All

Петр: #xtranslate STROUT <arg> => QOut( Hb_AnsiToOem( <arg> ) ) #define CONSOLE_WINDOWMODE 0 #define CONSOLE_FULLSCREEN 1 PROCEDURE main local nStdOut := Hb_GetStdOut() local nResult := -1 STROUT "Устанавливаем полноэкранный режим" nResult := SetConsoleDisplayMode(nStdOut, CONSOLE_FULLSCREEN) STROUT iif( nResult == 0, "Ok {:)", "что-то не получилось {:(" ) Inkey( 3.00 ) STROUT "затем переходим в оконный режим.." nResult := SetConsoleDisplayMode(nStdOut, CONSOLE_WINDOWMODE) STROUT iif( nResult == 0, "Ok {:)", "что-то не получилось {:(" ) Inkey( 3.00 ) STROUT "и опять возвращаемся в полноэкранный режим" nResult := SetConsoleDisplayMode(nStdOut, CONSOLE_FULLSCREEN) STROUT iif( nResult == 0, "Ok {:)", "что-то не получилось {:(" ) Inkey( 3.00 )

Петр: что функция таки документирована в MSDN и обьявлена в wincon.h . Правда как удалось установить bcc551, bcc582, PellesC 4.5, PellesC 5.0.1, MSVC 6, MSVC 7.1 ничего об этом не подозревают Для MSVC 9 (MSVS 2008) функция обьявлена как BOOL WINAPI SetConsoleDisplayMode( __in HANDLE hConsoleOutput, __in DWORD dwFlags, __out_opt PCOORD lpNewScreenBufferDimensions ); где dwFlags может принимать значения #define CONSOLE_FULLSCREEN_MODE 1 #define CONSOLE_WINDOWED_MODE 2 Необходимо внести изменения и в реализацию самой функции, а именно if ( SetConsoleDisplayMode != NULL ) { COORD coord; HANDLE hOut = DosToWinHandle( (HB_FHANDLE) hb_parnint(1) ); hb_retni( SetConsoleDisplayMode( hOut, (DWORD) hb_parnl(2), &coord) ? (INT) 0 : (INT) 1 ); if ( hb_pcount() > 2 && ISBYREF(3) ) { hb_storni( coord.X, 3, 1 ); hb_storni( coord.Y, 3, 2 ); } } Для других компиляторов Open Watcom 1.7a + Open Watcom W32API Headers Version 0.3 #if (_WIN32_WINNT >= 0x0500) WINBASEAPI BOOL WINAPI SetConsoleDisplayMode( HANDLE, DWORD, PCOORD ); MingW 3.4.5 + w32api-3.11 #if (_WIN32_WINNT >= 0x0501) WINBASEAPI BOOL WINAPI SetConsoleDisplayMode( HANDLE, DWORD, PCOORD ); Как следует из MSDN функция поддерживается также Windows Vista, Server 2003/2008

Dima: Во время сборки получаю ошибку 'HB_FHANDLE' cannot start a parameter declaration


gfilatov: Dima пишет: Во время сборки получаю ошибку Замени 'HB_FHANDLE' на просто 'FHANDLE' - это должно помочь

Dima: gfilatov Заменил , позли другие ошибки........ Можно привести полный и правильный текст ?

gfilatov: Петр пишет: Тестировано с Harbour 1.0 + BCC582 Дима! Обрати внимание, что нужен Борланд Си компилятор версии 5.82 У тебя есть такой?

Dima: gfilatov Виноват ;) У меня 5.5.1

gfilatov: Dima пишет: У меня 5.5.1 Тогда бегом на http://cc.codegear.com/free/turbo за свободной лицензией. Но размер файла для выкачки около 390 МБ

Dima: gfilatov пишет: Но размер файла для выкачки около 390 МБ Это не размер ;) я за день выкачиваю десятки гиг.

Dima: Сходил по ссылке и не очень понял что именно качать. Линк в студию ;) !!! Вот это ? http://cc.codegear.com/Free.aspx?id=24724

Петр: Можно привести полный и правильный текст ? Текст правильный и полный. Только нужен не bcc 5.8.2, а Harbour хотя бы 1.0.1 Вот так, должно работать с xHarbour [pre2]#pragma BEGINDUMP #include <windows.h> #include "hbapi.h" typedef BOOL (WINAPI *PROCSETCONSOLEDISPLAYMODE)(HANDLE,DWORD, PCOORD); HB_FUNC ( SETCONSOLEDISPLAYMODE ) { PROCSETCONSOLEDISPLAYMODE SetConsoleDisplayMode; HMODULE hKernel32 = GetModuleHandle("kernel32"); if ( hKernel32 != NULL ) SetConsoleDisplayMode = (PROCSETCONSOLEDISPLAYMODE) GetProcAddress( hKernel32, "SetConsoleDisplayMode" ); if ( SetConsoleDisplayMode != NULL ) { COORD coord; HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE ); hb_retni( SetConsoleDisplayMode( hOut, (DWORD) hb_parnl(1), &coord) ? (INT) 0 : (INT) 1 ); if ( hb_pcount() > 1 && ISBYREF(2) ) { hb_storni( coord.X, 3, 1 ); hb_storni( coord.Y, 3, 2 ); } }else hb_retni( (INT) -1 ); } #pragma ENDDUMP [/pre2] [pre2] #xtranslate STROUT <arg> => QOut( Hb_AnsiToOem( <arg> ) ) #define CONSOLE_FULLSCREEN_MODE 1 #define CONSOLE_WINDOWED_MODE 2 PROCEDURE main () local nResult := -1 STROUT "Устанавливаем полноэкранный режим" nResult := SetConsoleDisplayMode(CONSOLE_FULLSCREEN_MODE) STROUT iif( nResult == 0, "Ok {:)", "что-то не получилось {:(" ) Inkey( 3.00 ) STROUT "затем переходим в оконный режим.." nResult := SetConsoleDisplayMode(CONSOLE_WINDOWED_MODE) STROUT iif( nResult == 0, "Ok {:)", "что-то не получилось {:(" ) Inkey( 3.00 ) STROUT "и опять возвращаемся в полноэкранный режим" nResult := SetConsoleDisplayMode(CONSOLE_FULLSCREEN_MODE) STROUT iif( nResult == 0, "Ok {:)", "что-то не получилось {:(" ) Inkey( 3.00 )[/pre2]

Dima: Петр Супер !!! Все пашет ! Спасибо !!! ЗЫ Поправка. Работает но не 80 на 25......... Как решить ?

Петр: SetConsoleDisplayMode(CONSOLE_FULLSCREEN_MODE) SetMode(80, 25) - вот, наверное

Dima: Петр Работает ! Спасибо !!! Ты мне здорово помог !!!

Петр: Dima пишет: Ты мне здорово помог !!! Спасибо за добрые слова!

Dima: Петр пишет: SetMode(80, 25) - вот, наверное Дружище вот так нужно. SetMode(25, 80) Syntax SetMode( <nRowCount>, <nColCount> ) --> lSuccess Спасибо !

Петр: Можно и так Я почему-то всегда стараюсь написать x, y - забывая, что в Clipper-Harbour нужно писать y, x

Dima: Петр пишет: #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" typedef BOOL (WINAPI *PROCSETCONSOLEDISPLAYMODE)(HANDLE,DWORD, PCOORD); HB_FUNC ( SETCONSOLEDISPLAYMODE ) { PROCSETCONSOLEDISPLAYMODE SetConsoleDisplayMode; HMODULE hKernel32 = GetModuleHandle("kernel32"); if ( hKernel32 != NULL ) SetConsoleDisplayMode = (PROCSETCONSOLEDISPLAYMODE) GetProcAddress( hKernel32, "SetConsoleDisplayMode" ); if ( SetConsoleDisplayMode != NULL ) { COORD coord; HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE ); hb_retni( SetConsoleDisplayMode( hOut, (DWORD) hb_parnl(1), &coord) ? (INT) 0 : (INT) 1 ); if ( hb_pcount() > 1 && ISBYREF(2) ) { hb_storni( coord.X, 3, 1 ); hb_storni( coord.Y, 3, 2 ); } }else hb_retni( (INT) -1 ); } #pragma ENDDUMP Harbour 3.2 BCC 55 Лезут ошибки во время сборки [pre2] Warning W8065 test.prg 1142: Call to function 'ISBYREF' with no prototype in function HB_FUN_SETCONSOLEDISPLAYMODE Error E2227 test.prg 1144: Extra parameter in call to hb_storni in function HB_FUN_SETCONSOLEDISPLAYMODE Error E2227 test.prg 1145: Extra parameter in call to hb_storni in function HB_FUN_SETCONSOLEDISPLAYMODE [/pre2] Как лечить ?

Pasha: Dima пишет: Как лечить ? Надо hb_storni заменить на hb_storvni. hbapi за это время изменился

Dima: Pasha пишет: Надо hb_storni заменить на hb_storvni. hbapi за это время изменился Помогло а с этим что делать ? Dima пишет: Call to function 'ISBYREF' with no prototype in function HB_FUN_SETCONSOLEDISPLAYMODE



полная версия страницы