On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник


Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 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 )


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 958
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.10.08 17:39. Заголовок: Во время сборки полу..


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


Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 875
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 07.10.08 18:00. Заголовок: Dima пишет: Во врем..


Dima пишет:

 цитата:
Во время сборки получаю ошибку


Замени 'HB_FHANDLE' на просто 'FHANDLE' - это должно помочь

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 959
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.10.08 18:23. Заголовок: gfilatov Заменил , ..


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

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 876
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 07.10.08 18:30. Заголовок: Петр пишет: Тестиро..


Петр пишет:

 цитата:
Тестировано с Harbour 1.0 + BCC582


Дима!
Обрати внимание, что нужен Борланд Си компилятор версии 5.82
У тебя есть такой?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 960
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.10.08 18:41. Заголовок: gfilatov Виноват ;)..


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

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 877
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 07.10.08 18:56. Заголовок: Dima пишет: У меня ..


Dima пишет:

 цитата:
У меня 5.5.1


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 963
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.10.08 19:00. Заголовок: gfilatov пишет: Но ..


gfilatov пишет:

 цитата:
Но размер файла для выкачки около 390 МБ


Это не размер ;)
я за день выкачиваю десятки гиг.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 964
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.10.08 19:04. Заголовок: Сходил по ссылке и н..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост 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 )



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 965
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.10.08 20:37. Заголовок: Петр Супер !!! Все ..


Петр
Супер !!!
Все пашет !
Спасибо !!!

ЗЫ
Поправка.
Работает но не 80 на 25.........
Как решить ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 510
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 07.10.08 20:53. Заголовок: SetConsoleDisplayMod..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 966
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.10.08 21:00. Заголовок: Петр Работает ! Спа..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 512
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 07.10.08 21:07. Заголовок: Dima пишет: Ты мне ..


Dima пишет:

 цитата:
Ты мне здорово помог !!!


Спасибо за добрые слова!


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 968
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.10.08 20:36. Заголовок: Петр пишет: SetMode..


Петр пишет:

 цитата:
SetMode(80, 25) - вот, наверное


Дружище вот так нужно.
SetMode(25, 80)

Syntax
SetMode( <nRowCount>, <nColCount> ) --> lSuccess

Спасибо !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 514
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 09.10.08 21:47. Заголовок: Можно и так :sm12: ..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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


Как лечить ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2788
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 23.03.13 18:21. Заголовок: Dima пишет: Как леч..


Dima пишет:

 цитата:
Как лечить ?



Надо hb_storni заменить на hb_storvni. hbapi за это время изменился


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 28 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 115
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет