Автор | Сообщение |
|
| постоянный участник
|
Пост N: 475
Зарегистрирован: 09.10.06
|
|
Отправлено: 14.09.08 16:59. Заголовок: Как переключить консоль в полный экран и обратно (или наоборот) ?
Например, с помощью вот такой функции: 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
[только новые]
|
|
|
| постоянный участник
|
Пост N: 476
Зарегистрирован: 09.10.06
|
|
Отправлено: 14.09.08 17:01. Заголовок: Пример использования
#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 )
|
|
|
|
| постоянный участник
|
Пост N: 478
Зарегистрирован: 09.10.06
|
|
Отправлено: 15.09.08 10:46. Заголовок: Тут мне товарищи подсказали
что функция таки документирована в 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
|
|
|
|
| |
Пост N: 958
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.10.08 17:39. Заголовок: Во время сборки полу..
Во время сборки получаю ошибку 'HB_FHANDLE' cannot start a parameter declaration
|
|
|
|
| модератор
|
Пост N: 875
Зарегистрирован: 25.05.05
|
|
Отправлено: 07.10.08 18:00. Заголовок: Dima пишет: Во врем..
Dima пишет: цитата: | Во время сборки получаю ошибку |
| Замени 'HB_FHANDLE' на просто ' FHANDLE' - это должно помочь
|
|
|
|
| |
Пост N: 959
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.10.08 18:23. Заголовок: gfilatov Заменил , ..
gfilatov Заменил , позли другие ошибки........ Можно привести полный и правильный текст ?
|
|
|
|
| модератор
|
Пост N: 876
Зарегистрирован: 25.05.05
|
|
Отправлено: 07.10.08 18:30. Заголовок: Петр пишет: Тестиро..
Петр пишет: цитата: | Тестировано с Harbour 1.0 + BCC582 |
| Дима! Обрати внимание, что нужен Борланд Си компилятор версии 5.82 У тебя есть такой?
|
|
|
|
| |
Пост N: 960
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.10.08 18:41. Заголовок: gfilatov Виноват ;)..
gfilatov Виноват ;) У меня 5.5.1
|
|
|
|
| модератор
|
Пост N: 877
Зарегистрирован: 25.05.05
|
|
Отправлено: 07.10.08 18:56. Заголовок: Dima пишет: У меня ..
|
|
|
|
| |
Пост N: 963
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.10.08 19:00. Заголовок: gfilatov пишет: Но ..
gfilatov пишет: цитата: | Но размер файла для выкачки около 390 МБ |
| Это не размер ;) я за день выкачиваю десятки гиг.
|
|
|
|
| |
Пост N: 964
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.10.08 19:04. Заголовок: Сходил по ссылке и н..
|
|
|
|
| постоянный участник
|
Пост N: 509
Зарегистрирован: 09.10.06
|
|
Отправлено: 07.10.08 20:11. Заголовок: Можно привести полны..
цитата: | Можно привести полный и правильный текст ? |
| Текст правильный и полный. Только нужен не bcc 5.8.2, а Harbour хотя бы 1.0.1 Вот так, должно работать с xHarbour цитата: | #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 |
| #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 )
|
|
|
|
|
| |
Пост N: 965
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.10.08 20:37. Заголовок: Петр Супер !!! Все ..
Петр Супер !!! Все пашет ! Спасибо !!! ЗЫ Поправка. Работает но не 80 на 25......... Как решить ?
|
|
|
|
| постоянный участник
|
Пост N: 510
Зарегистрирован: 09.10.06
|
|
Отправлено: 07.10.08 20:53. Заголовок: SetConsoleDisplayMod..
SetConsoleDisplayMode(CONSOLE_FULLSCREEN_MODE) SetMode(80, 25) - вот, наверное
|
|
|
|
| |
Пост N: 966
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.10.08 21:00. Заголовок: Петр Работает ! Спа..
Петр Работает ! Спасибо !!! Ты мне здорово помог !!!
|
|
|
|
| постоянный участник
|
Пост N: 512
Зарегистрирован: 09.10.06
|
|
Отправлено: 07.10.08 21:07. Заголовок: Dima пишет: Ты мне ..
Dima пишет: Спасибо за добрые слова!
|
|
|
|
| |
Пост N: 968
Зарегистрирован: 17.05.05
|
|
Отправлено: 09.10.08 20:36. Заголовок: Петр пишет: SetMode..
Петр пишет: цитата: | SetMode(80, 25) - вот, наверное |
| Дружище вот так нужно. SetMode(25, 80) Syntax SetMode( <nRowCount>, <nColCount> ) --> lSuccess Спасибо !
|
|
|
|
| постоянный участник
|
Пост N: 514
Зарегистрирован: 09.10.06
|
|
Отправлено: 09.10.08 21:47. Заголовок: Можно и так :sm12: ..
Можно и так Я почему-то всегда стараюсь написать x, y - забывая, что в Clipper-Harbour нужно писать y, x
|
|
|
|
| |
Пост N: 2864
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.03.13 18:01. Заголовок: Петр пишет: #pragma..
Петр пишет: цитата: | #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 Лезут ошибки во время сборки 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 Как лечить ?
|
|
|
|
| Администратор
|
Пост N: 2788
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.03.13 18:21. Заголовок: Dima пишет: Как леч..
Dima пишет: Надо hb_storni заменить на hb_storvni. hbapi за это время изменился
|
|
|
|
| |
Пост N: 2865
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.03.13 18:24. Заголовок: Pasha пишет: Надо ..
Pasha пишет: цитата: | Надо hb_storni заменить на hb_storvni. hbapi за это время изменился |
| Помогло а с этим что делать ? Dima пишет: цитата: | Call to function 'ISBYREF' with no prototype in function HB_FUN_SETCONSOLEDISPLAYMODE |
|
|
|
|
Ответов - 28
, стр:
1
2
All
[только новые]
|
|