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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 106, средняя оценка - 4.90
Andruchka
0 / 0 / 0
Регистрация: 23.02.2011
Сообщений: 26
31.07.2011, 18:58     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #1
Нашел только что можно изменить шрифт с помощью, не документированной функции SetConsoleFont, так же есть документированная функция SetCurrentConsoleFontEx, но так как Я новичок Я не понимаю, как ими пользоваться. Ни кто не может показать, как ими пользоваться на конкретном примере?!
ОС: Windows.

Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
01.08.2011, 02:01     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #2
Что-то я сомневаюсь, что эти недокументированные функции помогут. Дело в том, что если они недокументированы, то не только для тебя, а вообще. Вопрос: станет ли производитель IDE, уважающая, в общем-то себя фирма, возиться с фикцией? Сомневаюсь. По крайней мере у меня в инклудах DEV C++ не нашлось упоминания о SetConsoleFont. То есть если даже ты и найдёшь пример того, что она где-то у кого-то работает, как её заставить работать на твоей IDE, которая знать о ней не знает и слыхом не слыхивала?

Я бы сделал так: посмотрел бы, какой ключ меняет шрифт и попытался программно изменить этот ключ.
Либо: попытался написать прогу, имитирующую ряд нажатий клавиш, приводящих к увеличению шрифта. Эмулятор.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
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 Посмотреть сообщение
Я бы сделал так: посмотрел бы, какой ключ меняет шрифт и попытался программно изменить этот ключ.
Мысль интересная, но после изменения реестра придется перезапускать окно консоли.
-=ЮрА=-
Заблокирован
Автор 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;
}
 Комментарий модератора 
Запрещено публиковать ссылки на другие форумы.
Правила форума
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 дала следующий результат:
К сожалению у меня это не выводит в первых ссылках.

Всем остальным спасибо за участие и за помощь! Буду пробовать
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2011, 12:10     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #6
В строке 15 казака нужно шрифт поставить 14 и всё заработает
C++
1
SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),14);
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
01.08.2011, 15:36     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #7
-=ЮрА=-,как оно будет работать если IDE про неё не знает? Или: угадаем- не угадаем?
Andruchka
0 / 0 / 0
Регистрация: 23.02.2011
Сообщений: 26
01.08.2011, 17:11  [ТС]     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #8
-=ЮрА=-, у меня ваш код к сожалению не запускается!
Миниатюры
[ С++ ] Изменить шрифт в консольном приложение ( программно )  
-=ЮрА=-
Заблокирован
Автор 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-й судии пост выше работает!
Andruchka
0 / 0 / 0
Регистрация: 23.02.2011
Сообщений: 26
01.08.2011, 18:05  [ТС]     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #10
-=ЮрА=-, у меня зароботало только с 12 шрифтом!
спасибо!
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
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.
Andruchka
0 / 0 / 0
Регистрация: 23.02.2011
Сообщений: 26
02.08.2011, 09:41  [ТС]     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #12
получается, что бы точно изменить шрифт на всех машинах на которых программа будет запускаться, это только с реестром копаться?

и еще вопрос.
Если через реестр менять, то там же тоже мы будем писать числа ( 10, 12, 14 ), а на всех машинах опять же будут числа разные?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
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. Для остальных младшие два байта - ширина символов (обязательный только для точечного шрифта), старшие два байта - высота.
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 15:32     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #14
Цитата Сообщение от Andruchka Посмотреть сообщение
Если через реестр менять, то там же тоже мы будем писать числа ( 10, 12, 14 ), а на всех машинах опять же будут числа разные?
Можно програмно варианты перебрать и на каждом варианте выдать запрос пользователю о корректности вывода, а затем уже программа начнёт работу - геморно но просто...
Andruchka
0 / 0 / 0
Регистрация: 23.02.2011
Сообщений: 26
03.08.2011, 11:36  [ТС]     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #15
Ребят, где вы этому научились?!
Есть какие нибудь книги на эту тему на русском?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.02.2012, 17:40     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #16
Может, пригодиться кому:
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
#include <windows.h>
#include <stdio.h>
typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);     // прототип недокументированый функции
 SETCONSOLEFONT SetConsoleFont;
 
 
int main () {
 
 //Это надо для работы в Lucida Console
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 
 //Определимся со структурой CONSOLE_FONT_INFO
 CONSOLE_FONT_INFO CFI;
 CONSOLE_FONT_INFO* pCFI= &CFI; 
 
 //Информация о шрифте- так, чтобы знать! 
 GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), false, pCFI);
 
 printf ("nachalnii shrift est %d\n", pCFI->nFont);
 getchar ();
 
 HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");
 SetConsoleFont =(SETCONSOLEFONT) GetProcAddress(hmod, "SetConsoleFont");
 
// printf ("адрес если надо %x\n", SetConsoleFont);
// getchar ();
 for (int i= 0; i< 16; i ++) {
  SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),i);
  GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), false, pCFI);
  printf ("установил шрифт %d", pCFI->nFont);
  getchar ();
 }
 getchar ();
 return 0;
}

работает со шрифта номер 0 и до 13-го безукоризнено, дальше повторения идут, может потому, что всего 14 шрифтов установлено?

Прототипа GetCurrentConsoleFont не было в инклудах, чему я несказанно улдивлён, дописывал сам

SetConsoleFont недокументированная функция, поэтому гарантированно работает исключительно на версии, как у меня (XP home SP2, )

Шрифты, меняются, по умолчанию для каждого шрифта- свой размер, чё за принцип я не понял, но похоже, что по возрастанию.

SetConsoleCP (1251);
SetConsoleOutputCP (1251);

НУжны поскольку я работаю в Dev-Cpp, дабы увидеть русский язык при установлении Lucida Console, методом научного тыка выяснено, что это шрифты NN 6, 8, 10, 11


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Как узнать версию оси;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <windows.h>
#include <stdio.h>
int main () {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 
 OSVERSIONINFO OS;
 ZeroMemory(&OS, sizeof(OSVERSIONINFO));
 OS.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 GetVersionEx (&OS);
 
 printf ("Старший номер версии операционной системы есть %d\n", OS.dwMajorVersion);
 printf ("Младший номер версии операционной системы есть %d\n", OS.dwMinorVersion);
 printf ("Номер построения операционной системы. %d\n", OS.dwBuildNumber);
 printf ("Платформа операционной системы %d\n", OS.dwPlatformId);
 printf ("Сервис пак %s\n", OS.szCSDVersion);
 
 
 getchar ();
 return 0;
}
Тут подробнее
murderer
3175 / 1398 / 69
Регистрация: 06.10.2010
Сообщений: 3,017
14.02.2012, 18:45     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #17
Вопрос немного не по теме. Вот вы используете GetModuleHandleA+GetProcAddress. А можно в C++ как нибудь добавить эту функцию в таблицу импорта?

На Delphi элементарно
Delphi
1
function SetConsoleFont(hConsole: THANDLE; font: DWORD): LONGBOOL;stdcall;external 'KERNEL32.DLL';
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.02.2012, 19:55     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #18
Оказалось, в С/С++ тоже есть такой способ, надо просто в хидерах написать её прототип:
C++
1
BOOL WINAPI SetConsoleFont(void*, unsigned long);
И всё работает так, будто она документирована. Почему я говорю "оказалось"- дело в том, что я знаю, что прототип функции надо писать ДО её вызова. Но когда я пишу прототип в *.cpp, например так:
C++
1
2
BOOL WINAPI SetConsoleFont(void*, unsigned long);
int main () {
Линкёр ругается, типа она ему неизвестна. Получается, прототип надо писать только в хидерах, почему- непонятно.
murderer
3175 / 1398 / 69
Регистрация: 06.10.2010
Сообщений: 3,017
14.02.2012, 20:14     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #19
А где указывается, что она из Kernel32.dll?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2012, 20:42     [ С++ ] Изменить шрифт в консольном приложение ( программно )
Еще ссылки по теме:

C++ как сменить шрифт в консольном приложении
Задать значение клавише в с++,консольном приложение C++
C++ Изменить шрифт или цвет шрифта в текстовом файле

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.02.2012, 20:42     [ С++ ] Изменить шрифт в консольном приложение ( программно ) #20
А нигде, компилятор этого почему-то не требует, наверное потому, что kernell32.dll загружается автоматом ДЛЯ ВСЕХ приложений; а для некоторых функций надо явно указывать библиотеку, есть разные способы для этого (зависит от компилятора), так например, чтобы указать использование билиотеки pthreadGC2.dll для этого (если исползуешь компилятор g++), надо компилить (линковать) с ключом линковщика -lpthread

А для других компиляторов пишут в исходном коде директиву
C++
1
  #pragma (И сюда что-то)
Yandex
Объявления
14.02.2012, 20:42     [ С++ ] Изменить шрифт в консольном приложение ( программно )
Ответ Создать тему
Опции темы

Текущее время: 07:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru