Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 106, средняя оценка - 4.90
Andruchka
0 / 0 / 0
Регистрация: 23.02.2011
Сообщений: 26
#1

[ С++ ] Изменить шрифт в консольном приложение ( программно ) - C++

31.07.2011, 18:58. Просмотров 16028. Ответов 24
Метки нет (Все метки)

Нашел только что можно изменить шрифт с помощью, не документированной функции SetConsoleFont, так же есть документированная функция SetCurrentConsoleFontEx, но так как Я новичок Я не понимаю, как ими пользоваться. Ни кто не может показать, как ими пользоваться на конкретном примере?!
ОС: Windows.

Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2011, 18:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [ С++ ] Изменить шрифт в консольном приложение ( программно ) (C++):

Изменить размер шрифта в консольном приложении (программно) - C++
Как изменить размер шрифта консоли, только размер, сам шрифт остаётся родной. ОС: Windows

Шрифт в консольном окне - C++
Привет всем! Как можно изменить тип шрифта выводимого на консольном окне и размер шрифта?например, мне нужен чтобы выводимое слово или...

Как сменить шрифт в консольном приложении? - C++
вот пытался поменять шрифт так, вышло то что видите, шрифт стал гигантским, обратно не возвращается, менял размер шрифта и окна толку ноль,...

Задать значение клавише в с++,консольном приложение - C++
Хочу чтобы когда я нажимаю на какую-либо клавишу в консольном приложение,она выполняла действие.Тоесть дать какой-либо клавише...

Очистка выбранной области экрана в консольном приложение на С++ - C++
среда MS Visual Studia 2008!

Работа с файловой системой в консольном приложение без WinAPI, QT, BOOST и пр - C++
Ребят, кто подскажет, можно ли в консольном приложение работать с файловой системой на чистом языке С или С++ ? Тоесть получать список...

24
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
01.08.2011, 02:01 #2
Что-то я сомневаюсь, что эти недокументированные функции помогут. Дело в том, что если они недокументированы, то не только для тебя, а вообще. Вопрос: станет ли производитель IDE, уважающая, в общем-то себя фирма, возиться с фикцией? Сомневаюсь. По крайней мере у меня в инклудах DEV C++ не нашлось упоминания о SetConsoleFont. То есть если даже ты и найдёшь пример того, что она где-то у кого-то работает, как её заставить работать на твоей IDE, которая знать о ней не знает и слыхом не слыхивала?

Я бы сделал так: посмотрел бы, какой ключ меняет шрифт и попытался программно изменить этот ключ.
Либо: попытался написать прогу, имитирующую ряд нажатий клавиш, приводящих к увеличению шрифта. Эмулятор.
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
01.08.2011, 07:53 #3
Цитата Сообщение от Andruchka Посмотреть сообщение
ОС: Windows.
Windows разные бывают, допустим для SetCurrentConsoleFontEx требуется минимум Windows Vista или Windows Server 2008.

Цитата Сообщение от Andruchka Посмотреть сообщение
Нашел только что можно изменить шрифт с помощью, не документированной функции SetConsoleFont
Цитата Сообщение от Andruchka Посмотреть сообщение
Ни кто не может показать, как ими пользоваться на конкретном примере?!
Первая ссылка в гугле по запросу setconsolefont дала следующий результат:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Windows XP SP3; BDS 2006; 21.03.2009;
// основано на материале с [url]http://cboard.cprogramming.com/showthread.php?p=745558[/url]
#include <iostream>
#include <windows.h>
using namespace std;
 
typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);     // прототип недокументированый функции
 SETCONSOLEFONT SetConsoleFont;
 
int main(int argc, char* argv[])
{
  HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");     // функция здесь
  SetConsoleFont =(SETCONSOLEFONT) GetProcAddress(hmod, "SetConsoleFont");   // берем ее адрес
  if (!SetConsoleFont) {cout<<"error\n" ; exit(1);}   //   если ошибка
  SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),10);  // устанавливаем 10 шрифт..
  //эксперементально установил что в обычной XP  это Lucida  Console 14.
  //хз везде это ли - покажет практика.
  SetConsoleOutputCP(1251) ;  // устанавливаем кодировку вывода
  cout<<"по русски :)";
  cin.get();
  return 0;
}
Вообще про написание консольных приложений есть интересный ресурс
http://vsokovikov.narod.ru/New_MSDN_...e/consbase.htm

Цитата Сообщение от kravam Посмотреть сообщение
Я бы сделал так: посмотрел бы, какой ключ меняет шрифт и попытался программно изменить этот ключ.
Мысль интересная, но после изменения реестра придется перезапускать окно консоли.
2
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2011, 09:35 #4
вобще на всех форумах пишут что недокументированное лучше не юзать, но вот как вариант русский для Висты, взял от сюда [ссылка удалена]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <windows.h>
using namespace std;
 
typedef struct _CONSOLE_FONT_INFOEX {
  ULONG cbSize;
  DWORD nFont;
  COORD dwFontSize;
  UINT  FontFamily;
  UINT  FontWeight;
  WCHAR FaceName[LF_FACESIZE];
} CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX;
 
typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);     // прототип недокументированый функции для XP
 
typedef BOOL (WINAPI *SETCURRENTCONSOLEFONTEX)(HANDLE,BOOL, PCONSOLE_FONT_INFOEX);  // для vista
SETCURRENTCONSOLEFONTEX SetCurrentConsoleFontEx  ;
SETCONSOLEFONT SetConsoleFont;
 
int main(int argc, char* argv[])
{
  OSVERSIONINFOEX osvi;
  CONSOLE_FONT_INFOEX cfon;
  ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
  GetVersionEx((OSVERSIONINFO *) &osvi) ;   // получение версии винды
  HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");     // функции здесь
  if (osvi.dwMajorVersion<6) {     // xp или ниже : для 9x не проверял.
     SetConsoleFont =(SETCONSOLEFONT) GetProcAddress(hmod, "SetConsoleFont");   // берем  адрес функции
     if (!SetConsoleFont) {cout<<"error\n" ; exit(1);}   //   если ошибка
     SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),10);  // устанавливаем 10 шрифт..
    //эксперементально установил что в обычной XP  это Lucida  Console 14.
    //хз везде это ли - покажет практика.
 
  }  else
  {
     SetCurrentConsoleFontEx =(SETCURRENTCONSOLEFONTEX) GetProcAddress(hmod, "SetCurrentConsoleFontEx");   // берем  адрес  функции
     if (!SetCurrentConsoleFontEx) {cout<<"error\n" ; exit(1);}   //   если ошибка
     ZeroMemory(&cfon, sizeof(CONSOLE_FONT_INFOEX));
     cfon.cbSize=sizeof(CONSOLE_FONT_INFOEX);
     //cfon.nFont=10;
     cfon.FontFamily=54;   //   Lucida  Console
     if (!SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), false, &cfon)) cout<<"error";
  }
 
  SetConsoleOutputCP(1251) ;  // устанавливаем кодировку вывода
  cout<<"по русски :)";
  cin.get();
  return 0;
}
 Комментарий модератора 
Запрещено публиковать ссылки на другие форумы.
Правила форума
0
Andruchka
0 / 0 / 0
Регистрация: 23.02.2011
Сообщений: 26
01.08.2011, 10:50  [ТС] #5
Цитата Сообщение от kazak Посмотреть сообщение
Windows разные бывают, допустим для SetCurrentConsoleFontEx требуется минимум Windows Vista или Windows Server 2008.
Я написал Windows потому что хотелось бы научится делать для всех версий.

Цитата Сообщение от kazak Посмотреть сообщение
Первая ссылка в гугле по запросу setconsolefont дала следующий результат:
К сожалению у меня это не выводит в первых ссылках.

Всем остальным спасибо за участие и за помощь! Буду пробовать
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2011, 12:10 #6
В строке 15 казака нужно шрифт поставить 14 и всё заработает
C++
1
SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),14);
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
01.08.2011, 15:36 #7
-=ЮрА=-,как оно будет работать если IDE про неё не знает? Или: угадаем- не угадаем?
0
Andruchka
0 / 0 / 0
Регистрация: 23.02.2011
Сообщений: 26
01.08.2011, 17:11  [ТС] #8
-=ЮрА=-, у меня ваш код к сожалению не запускается!
0
Миниатюры
[ С++ ] Изменить шрифт в консольном приложение ( программно )  
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2011, 17:43 #9
Андрей ты этот код на компиляцию запускал?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <windows.h>
using namespace std;
 
typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);     // прототип недокументированый функции
 SETCONSOLEFONT SetConsoleFont;
 
int main(int argc, char* argv[])
{
    HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");     // функция здесь
    SetConsoleFont =(SETCONSOLEFONT) GetProcAddress(hmod, "SetConsoleFont");   // берем ее адрес
    if (!SetConsoleFont) 
    {
        cout<<"error\n" ; exit(1);
    }   //   если ошибка
    SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),14);  // устанавливаем 14 шрифт..
    SetConsoleOutputCP(1251) ;  // устанавливаем кодировку вывода
    cout<<"по русски :)";
    cin.get();
    return 0;
}
17-ая строка шрифт 14-ть а не 10-ть, с десяткой у меня тоже билиберда на экране была

Добавлено через 2 минуты
kravam, тестировал в 6-й судии пост выше работает!
0
Andruchka
0 / 0 / 0
Регистрация: 23.02.2011
Сообщений: 26
01.08.2011, 18:05  [ТС] #10
-=ЮрА=-, у меня зароботало только с 12 шрифтом!
спасибо!
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
02.08.2011, 06:53 #11
Цитата Сообщение от kravam Посмотреть сообщение
-=ЮрА=-,как оно будет работать если IDE про неё не знает? Или: угадаем- не угадаем?
Если вкратце, то:
Создаем указатель на функцию:
C++
1
2
typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);     // прототип недокументированый функции
 SETCONSOLEFONT SetConsoleFont;
Загружаем библиотеку, в которой должна находиться требуемая функция:
C++
1
HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");     // функция здесь
Ищем в библиотеке требуемую функцию:
C++
1
SetConsoleFont =(SETCONSOLEFONT) GetProcAddress(hmod, "SetConsoleFont");   // берем ее адрес
если она есть получаем ее адрес в библиотеке и работаем с ним:
C++
1
SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),14);  // устанавливаем 14 шрифт..
если функции нет, то обрабатываем этот вариант:
C++
1
2
3
4
if (!SetConsoleFont) 
{
   cout<<"error\n" ; exit(1);
}   //   если ошибка
Если подробно, то гугли на тему создания и работы с dll библиотеками.

Добавлено через 4 минуты
Цитата Сообщение от Andruchka Посмотреть сообщение
-=ЮрА=-, у меня зароботало только с 12 шрифтом!
спасибо!
Вот видишь, это особенность недокументированных функций. У автора программы заработало со значением 10, у нас с Юрием - 14, у тебя 12.
1
Andruchka
0 / 0 / 0
Регистрация: 23.02.2011
Сообщений: 26
02.08.2011, 09:41  [ТС] #12
получается, что бы точно изменить шрифт на всех машинах на которых программа будет запускаться, это только с реестром копаться?

и еще вопрос.
Если через реестр менять, то там же тоже мы будем писать числа ( 10, 12, 14 ), а на всех машинах опять же будут числа разные?
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
02.08.2011, 15:11 #13
Цитата Сообщение от Andruchka Посмотреть сообщение
получается, что бы точно изменить шрифт на всех машинах на которых программа будет запускаться, это только с реестром копаться?
По крайней мере для ХР я прямого способа пока не нашел.

Цитата Сообщение от Andruchka Посмотреть сообщение
Если через реестр менять, то там же тоже мы будем писать числа ( 10, 12, 14 ), а на всех машинах опять же будут числа разные?
Числа будут другие, но вроде бы одинаковые, у меня с ХР и 7 разницы нет.

Дефолтные настройки консоли находятся в ветке реестра HKEY_CURRENT_USER\Console
Ключи:
FaceName - строка, имя дополнительного шрифта, должна быть пустая для точечного шрифта;
FontFamily - тип шрифта, 0х0 для стандартного точечного шрифта, 0х30 для точечных шрифтов других размеров, 0х36 Lucida Console;
FontSize - ширина и высота шрифта, для стандартного точечного шрифта равняется 0. Для остальных младшие два байта - ширина символов (обязательный только для точечного шрифта), старшие два байта - высота.
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 15:32 #14
Цитата Сообщение от Andruchka Посмотреть сообщение
Если через реестр менять, то там же тоже мы будем писать числа ( 10, 12, 14 ), а на всех машинах опять же будут числа разные?
Можно програмно варианты перебрать и на каждом варианте выдать запрос пользователю о корректности вывода, а затем уже программа начнёт работу - геморно но просто...
0
Andruchka
0 / 0 / 0
Регистрация: 23.02.2011
Сообщений: 26
03.08.2011, 11:36  [ТС] #15
Ребят, где вы этому научились?!
Есть какие нибудь книги на эту тему на русском?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2011, 11:36
Привет! Вот еще темы с ответами:

Как программно в консоли установить точечный шрифт, и его размер? - C++
Как программно в консоли установить точечный шрифт, и его размер? Формулируйте вопрос в посте.

Не получается изменить шрифт в находящийся в RichEdit - C++
Накидал текстовый редактор. Не получается изменить шрифт в находящийся в RichEdite на дочерней форме(в Action не появляется обрабочик) а...

Изменить шрифт и его размер (консоль) - C++
Как программно для windows можно поменять шрифт на Lucida Console и размер шрифта, скажем на 10ый ? Например через WINAPI или ещё как,...

Как изменить шрифт и размер шрифта - C++
подскажите пожалуйсто как изменить шрифт и размер шрифта, какие библиотеки и функции


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
03.08.2011, 11:36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru