Консольное приложение Win32

  • Автор темы pashqa
  • Дата начала
P

pashqa

#1
Всем привет!!! У меня такой вопрос: возможно ли изменить размер шрифта в консольном приложении ?
Предыдущей проблемой было изменить цвет\фон шрифта, с ней успешно справилисьAPI-функции для
консольных приложений. Но просматрев все(http://win-api.narod.ru/a0821.htm) эти фунции я ненашел ни одной,
которая может менять шрифт! Кто-нибудь знает как реализовать сие чудо !? Спасибо за внимание)))
 
@

@LE}{@NDER

#2
Читай в МСДНе про функцию SetCurrentConsoleFontEx и про структуру CONSOLE_FONT_INFOEX
Вот вырезка:

Код:
BOOL WINAPI SetCurrentConsoleFontEx(
__in		 HANDLE hConsoleOutput,
__in		 BOOL bMaximumWindow,
__in		 PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx
);
Parameters
hConsoleOutput
A handle to the console screen buffer. The handle must have the GENERIC_WRITE access right. For more information, see Console Buffer Security and Access Rights.

bMaximumWindow
If this parameter is TRUE, font information is set for the maximum window size. If this parameter is FALSE, font information is set for the current window size.

lpConsoleCurrentFontEx
A pointer to a CONSOLE_FONT_INFOEX structure that contains the font information.

Return Value
If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.


Код:
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;
Members
cbSize
The size of this structure, in bytes.

nFont
The index of the font in the system's console font table.

dwFontSize
A COORD structure that contains the width and height of each character in the font, in logical units. The X member contains the width, while the Y member contains the height.

FontFamily
The font family.


This parameter can be one of the following values:

FF_DECORATIVE
FF_DONTCARE
FF_MODERN
FF_ROMAN
FF_SCRIPT
FF_SWISS

FontWeight
The font weight. The weight can range from 100 to 1000, in multiples of 100. For example, the normal weight is 400, while 700 is bold.

FaceName
The name of the typeface (such as Courier or Arial).

Remarks
To obtain the size of the font, pass the font index to the GetConsoleFontSize function.
 
D

Dimmuborgir

#3
CreateFont, затем SelectObject. Работаем с контекстом.

CreateFont, затем SelectObject. Работаем с контекстом.
Прошу прощения, не увидел что приложение консольное. мой ответ был для WinAPI приложения, не консольного.
 
P

pashqa

#4
Читай в МСДНе про функцию SetCurrentConsoleFontEx и про структуру CONSOLE_FONT_INFOEX
Вот еще вырезка от туда же:
Minimum supported client - Windows Vista
У меня WindowsXP...
Я попробовал прописать структуру CONSOLE_FONT_INFOEX, на что VC++6
сказал, что про такую неразу неслышал ^_^
Вот еще нашел структуру CONSOLE_FONT_INFO, но VC++ 6 тоже про неё
ничего незнает(Windows.h подключил).... <_<
 
@

@LE}{@NDER

#5
Ну, что ж сказать на это... херово.
Попробуй поиграться с реестром HKEY_CURRENT_USER\Console\ там есть параметр FontSize - может это что-то даст
 
P

pashqa

#6
А ты не мог бы изобразить, как это можно сделать, а то я без понятия вообще... ;)
 
@

@LE}{@NDER

#7
Ну вот. Только тебе придется думать, как консоль рефрешнуть после этого или запустить отдельным процессом. В этом коде сугубо редактирование ключа, который отвечает за консоль. Кроме этого можешь поиграться со значениями в родительском ключе Console - там есть значения отвечающие за цвета. Ну и в конце концов нужно позаботиться о том, чтобы потом все вернуть назад, поскольку значения применятся ко всем консолям.

[codebox]
#include <windows.h>
#include <iostream>
using namespace std;

void UpdateReg(HKEY hk, LONG lret)
{
DWORD pbuf1;

TCHAR* pbuf=_T("Lucida Console");
lret=RegSetValueEx ( hk, _T("FaceName"), NULL, REG_SZ,(LPBYTE)pbuf, strlen(pbuf));

pbuf1 = 0x36;
lret=RegSetValueEx ( hk, _T("FontFamily"), NULL, REG_DWORD,(LPBYTE)&pbuf1, sizeof(DWORD));

pbuf1 = 0x100000; //Размер шрифта
lret=RegSetValueEx ( hk, _T("FontSize"), NULL, REG_DWORD,(LPBYTE)&pbuf1, sizeof(DWORD));

pbuf1 = 0x190;
lret=RegSetValueEx ( hk, _T("FontWeight"), NULL, REG_DWORD,(LPBYTE)&pbuf1, sizeof(DWORD));

pbuf1 = 0x0;
lret=RegSetValueEx ( hk, _T("HistoryNoDup"), NULL, REG_DWORD,(LPBYTE)&pbuf1, sizeof(DWORD));

pbuf1 = 0x800;
lret=RegSetValueEx ( hk, _T("QuickEdit"), NULL, REG_DWORD,(LPBYTE)&pbuf1, sizeof(DWORD));

pbuf1 = 0x88008e;
lret=RegSetValueEx ( hk, _T("WindowPosition"), NULL, REG_DWORD,(LPBYTE)&pbuf1, sizeof(DWORD));

pbuf1 = 0x1e0053;
lret=RegSetValueEx ( hk, _T("WindowSize"), NULL, REG_DWORD,(LPBYTE)&pbuf1, sizeof(DWORD));

RegCloseKey(hk);
}

int _tmain(int argc, _TCHAR* argv[])
{
HKEY hk;

LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER,
_T("Console\\%SystemRoot%_system32_cmd.exe"),
NULL,KEY_WRITE|KEY_SET_VALUE,&hk);
if(lret==ERROR_SUCCESS&&NULL!=hk)
{
UpdateReg(hk, lret);
}
else
{
if(RegCreateKey(HKEY_CURRENT_USER, _T("Console\\%SystemRoot%_system32_cmd.exe"), &hk)==ERROR_SUCCESS)
{
LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER,
_T("Console\\%SystemRoot%_system32_cmd.exe"),
NULL,KEY_WRITE|KEY_SET_VALUE,&hk);
if(lret==ERROR_SUCCESS&&NULL!=hk)
UpdateReg(hk, lret);
}
else
::MessageBox(NULL, "Error", "ERROR", MB_OK);
}
return 0;
}
[/codebox]

ЗЫ: Да неприятная особенность, это то, что в ХРшке похоже поддерживается только один шрифт из семейства TrueType - Lucida Console. Это видно, по крайней мере из настроек консоли.
 
P

pashqa

#8
Спасибо за ответ :D !!!
Но такое дело меня неустраивает, так что придется искать другой вариант!! :(
 
@

@LE}{@NDER

#9
Ну вот, так бы сразу и сказал, а то нафиг я мучился? :(
 
P

pashqa

#10
Я же незнал всего этого, что ты мне сказал :) !!
За что тебе Спасибо)))) :D