Выбор шрифтов в контекст

Callisto

В папке Windows\Fonts лежит куча разных шрифтов и я хочу использовать какой-нибудь из них в своей программе. Но для этого нужно выбрать нужный шрифт в контекст устройства. А как это сделать?
6 ответов

Callisto

ну, а чем функция CreateFont плоха???


Callisto

ну, а чем функция CreateFont плоха???
Не знаю, не пользовался. Как с ней работать и можно ли с её помощью подключить готовые шрифты? Или она только создаёт новые? В MSDN о шрифтах говориться как о ресурсах, отсюда ещё вопрос: нужно ли для выбора win шрифта создавать каким-то образом ресурс или шрифты в Windows/Fonts и есть файлы ресурсов? А если нужно создать ресурс, то как?


Callisto

если шрифт установлен в системе, то его можно использовать. Для этого надо заполучить его дескриптор, как раз использовав, например, CreateFont (посмотри MSDN, поймешь что за функция и что н смотря на свое название, она никакие шрифты не создает, а создает дескриптор к существующему шрифту). Ну а что делать с дескриптором, я вижу, ты уже знаешь)если шрифт не установлен, но есть файлик, то его можно установить, например, натравив ShellExecute на файлик шрифта и передав в качестве параметра "что делать" - install


Callisto

В папке Windows\Fonts лежит куча разных шрифтов
Куча-то куча, только никто не гарантирует, что на другом компьютере куча будет точно такая же. Поэтому правильнее будет нужный шрифт положить в папку с программой, а использовать его так:
class CTestFontDlg : public CDialog
{
    CFont m_Font;
    CString m_FontFileName;
...
 
BOOL CTestFontDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
 
    m_FontFileName="SNAP.ttf"; // Имя файла шрифта
    CString FontName="Snap ITC"; // Имя шрифта
 
    AddFontResource(m_FontFileName);
 
    m_Font.CreateFont(
        54,                        // nHeight
        0,                         // nWidth
        0,                         // nEscapement
        0,                         // nOrientation
        FW_NORMAL,                 // nWeight
        FALSE,                     // bItalic
        FALSE,                     // bUnderline
        0,                         // cStrikeOut
        DEFAULT_CHARSET,            //nCharSet
        OUT_DEFAULT_PRECIS,        // nOutPrecision
        CLIP_DEFAULT_PRECIS,       // nClipPrecision
        DEFAULT_QUALITY,           // nQuality
        DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
        FontName);
...
 
void CTestFontDlg::OnPaint() 
{
    CPaintDC dc(this);
 
    CRect rect;
    GetClientRect(&rect);
 
    dc.SelectObject(&m_Font);
 
    dc.DrawText(CString("Text - 1234567890"), &rect, 0);
 
    CDialog::OnPaint();
}
 
void CTestFontDlg::OnClose() 
{
    RemoveFontResource(m_FontFileName);
    CDialog::OnClose();
}
И еще - имей в виду, что имя шрифта и имя файла шрифта - это разные вещи.


Callisto

Переносимость для меня сейчас неважна, к тому же я не знаком с MFC. Но даже без неё есть пара вопросов: 1)m_FontFileName="SNAP.ttf"; // Имя файла шрифта CString FontName="Snap ITC"; // Имя шрифта Где должен находиться файл SNAP.ttf? И почему к нему не прописан путь? Что является именем шрифта? В свойствах файла шрифта написано что-то типа "PAPYRUS". Это и есть имя? 2)AddFontResource(m_FontFileName); В MSDN написано,что эта функция добавляет ресурс шрифта в системную таблицу шрифтов. Что это за таблица? И как узнать, занесен ли шрифт в эту таблицу? Возможно тот, что мне нужен, уже там. 3)Если не использовать MFC, которой я не знаю, то как после вызова CreateFont выбрать шрифт в DC?


Callisto

Где должен находиться файл SNAP.ttf? И почему к нему не прописан путь?
В данном конкретном случае - в папке с программой. Лучше писать полный путь.
Что является именем шрифта? В свойствах файла шрифта написано что-то типа "PAPYRUS". Это и есть имя?
Когда открываешь файл шрифта двойным кликом по нему, первая строка и есть имя шрифта.
Что это за таблица? И как узнать, занесен ли шрифт в эту таблицу? Возможно тот, что мне нужен, уже там.
Это и есть та самая "куча" Если шрифт есть в системной папке Windows, AddFontResource можно не использовать.
Если не использовать MFC, которой я не знаю, то как после вызова CreateFont выбрать шрифт в DC?
Точно так же. MFC - это просто надстройка над WinAPI.
SelectObject(hdc, font);
font - это значение, которое вернет CreateFont(...).
Переносимость для меня сейчас неважна
Это зря. Имей в виду - однажды написанные тобой программы имеют обыкновение преследовать тебя всю жизнь Добавлено через 4 минуты 12 секунд Еще. AddFontResource() добавляет файл шрифта к системным, но добавляется он только на время работы программы и доступен будет только ей.