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

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

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

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

31.07.2011, 18:58. Просмотров 17180. Ответов 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
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
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;
}
Тут подробнее
0
murderer
3211 / 1434 / 77
Регистрация: 06.10.2010
Сообщений: 3,177
14.02.2012, 18:45 #17
Вопрос немного не по теме. Вот вы используете GetModuleHandleA+GetProcAddress. А можно в C++ как нибудь добавить эту функцию в таблицу импорта?

На Delphi элементарно
Delphi
1
function SetConsoleFont(hConsole: THANDLE; font: DWORD): LONGBOOL;stdcall;external 'KERNEL32.DLL';
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
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 () {
Линкёр ругается, типа она ему неизвестна. Получается, прототип надо писать только в хидерах, почему- непонятно.
0
murderer
3211 / 1434 / 77
Регистрация: 06.10.2010
Сообщений: 3,177
14.02.2012, 20:14 #19
А где указывается, что она из Kernel32.dll?
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
14.02.2012, 20:42 #20
А нигде, компилятор этого почему-то не требует, наверное потому, что kernell32.dll загружается автоматом ДЛЯ ВСЕХ приложений; а для некоторых функций надо явно указывать библиотеку, есть разные способы для этого (зависит от компилятора), так например, чтобы указать использование билиотеки pthreadGC2.dll для этого (если исползуешь компилятор g++), надо компилить (линковать) с ключом линковщика -lpthread

А для других компиляторов пишут в исходном коде директиву
C++
1
  #pragma (И сюда что-то)
0
murderer
3211 / 1434 / 77
Регистрация: 06.10.2010
Сообщений: 3,177
14.02.2012, 21:23 #21
http://www.rsdn.ru/article/baseserv/dlluse.xml

Список функций dll содержится в lib-файле, который надо передавать через командную строку линкеру.

Ну вот почему в Delphi и FASM можно создать проект в одном файле где всё как на ладони и все настройки задаются директивами, а в C++ и MASM нужно создавать 100500 файлов и передавать "много букаф" в командную строку?
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
14.02.2012, 22:03 #22
Ну я не знаю, может это компилятор MSVS такой ()? В компиляторе g++ список функций передавать компилятору НЕ НАДО.
А вообще рекомендации: пользоваться благами цивилизации и не компилить через командную строку, тогда всё будет круто и жизнь станет лучше. (кроме экстраординарных случаев). В одном файле тоже никто ничё делать не запрещает, ей-ей!
...А про дельфи и паскаль я сам могу рассказать (см. подпись) но не буду, холивар не пройдёт!
0
fair7
9 / 9 / 0
Регистрация: 31.12.2010
Сообщений: 81
Записей в блоге: 1
10.06.2014, 00:24 #23
У меня почему-то такая строка не работает
C++
1
GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), false, pCFI);
хоть и прописывал в Dev C++ -lpthread.
где прописывать -lpthread я знаю.
0
dan2nick
0 / 0 / 0
Регистрация: 04.10.2016
Сообщений: 4
24.10.2016, 17:55 #24
пытаюсь подключить свой шрифт font.ttf - не получается. в чем проблема - не понимаю...
буду благодарен за подсказку.
работаю в visual studio 2010

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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>
#include <conio.h>
using namespace std;
 
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  // получение No. консоли
CONSOLE_FONT_INFOEX cf;
 
 
int main() 
{
/******************************************************************************************************/
    for (int i = 0; i < 256; i++)
    {
        if ( !(i%32) ) { cout << "\n "; }
        cout << (((i >= 7  &&  i <= 10)  ||  i == 13) ? ' ' : (char)i);
    }
 
    cout << "\n\n";
    _getch();
/******************************************************************************************************/
    if ( AddFontResourceEx/*W*/(L"font.ttf", FR_PRIVATE, NULL) )
    {
        cf.cbSize       = sizeof(CONSOLE_FONT_INFOEX);  // cf.cbSize          = sizeof(cf);
        GetCurrentConsoleFontEx(hOut, true, &cf); // Получить текущий шрифт
        cf.dwFontSize.Y = 8;
        //cf.dwFontSize.X = 8;
        //cf.FontFamily   = FF_DONTCARE;
        //cf.FontWeight   = FW_NORMAL;  // FW_NORMAL --> 400
        //lstrcpyW(cf.FaceName, L"Font");   //TEXT("ZX Spectrum7 Bold")
        wcscpy( cf.FaceName, L"Font" ); //TEXT("ZX Spectrum7 Bold")
        SetCurrentConsoleFontEx( hOut, false, &cf );    // установить новый шрифт
    }
    else { system("cls"); cout << "Font Error"; }
/******************************************************************************************************/
    for (int i = 0; i < 256; i++)
    {
        if ( !(i%32) ) { cout << "\n "; }
        cout << (((i >= 7  &&  i <= 10)  ||  i == 13) ? ' ' : (char)i);
    }
 
    cout << "\n\n";
    _getch();
    return 0;
}
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
24.10.2016, 19:20 #25
Цитата Сообщение от fair7 Посмотреть сообщение
хоть и прописывал в Dev C++ -lpthread.
где прописывать -lpthread я знаю.
Ошибка какая? Минимизируй код и выдложи сюда.

Навскидку - lpthread нужно для многопоточных приложений. При чём тут GetCurrentConsoleFont, я не понял.
1
24.10.2016, 19:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2016, 19:20
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

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