Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MFC: увеличить шрифт при выводе на печать 
:(
    Опции темы
umnick
  Дата 5.1.2011, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 4.5.2008
Где: Кривой Рог

Репутация: 0
Всего: 0



Есть проект на основе архитектуры "Документ-Представление" в OnDraw пишется текст который необходимо вывести на печать, но при распечатке текст получается мелкий. Как его увеличить?
PM MAIL   Вверх
kurlyak
Дата 8.1.2011, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 7.11.2007

Репутация: 1
Всего: 3



Я такого никогда не делал. Это во первых, поэтому все претензии к Майкросфот. Но есть одно "но"- у Вас в OnDraw какой- то же контекст существует? Типа CDC PrintDC; поэтому можна попробывать использовать функцию этого класса SelectObject(). То есть создаете фонт с нужным размером вывода на печать, а потом выбираете его в контексте при помощи SelectObject(). Типа так:
Код

СDC PrintDC;
...
CFont ft;
ft.CreateFontIndirect(...);
CFont oldft = PrintDC.SelectObject(&ft);
....

Если я ошибаюсь, можете меня исправить.
PM MAIL   Вверх
voov
Дата 2.3.2011, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Приходилось делать такое. Когда-то искал информацию, но ссылок уже нет. Потому дам кусок кода, разбирайся и копай дальше. 

При печати использовался режим MM_ANISOTROPIC.
Рисовал с помощью GDI+. 
Шрифт описывается структурой LOGFONT. 
m_fontPoints - Размер шрифта в поинтах.

инициализация LOGFONT
Код

    m_fontPoints = 9;

    memset(&m_logfont, 0, sizeof(m_logfont));
    m_logfont.lfHeight            =    ConvertPointToLogUnit(m_fontPoints * 10);                  // nHeight
    m_logfont.lfWidth            =    0;                         // nWidth
    m_logfont.lfEscapement        =    0;                         // nEscapement
    m_logfont.lfOrientation        =    0;                         // nOrientation
    m_logfont.lfWeight            =    FW_REGULAR;                   // nWeight
    m_logfont.lfItalic            =    FALSE;                     // bItalic
    m_logfont.lfUnderline        =    FALSE;                     // bUnderline
    m_logfont.lfStrikeOut        =    0;                         // cStrikeOut
    m_logfont.lfCharSet            =    RUSSIAN_CHARSET;           // nCharSet
    m_logfont.lfOutPrecision    =    OUT_DEFAULT_PRECIS;        // nOutPrecision
    m_logfont.lfClipPrecision    =    CLIP_DEFAULT_PRECIS;       // nClipPrecision
    m_logfont.lfQuality            =    DEFAULT_QUALITY;           // nQuality
    m_logfont.lfPitchAndFamily    =    DEFAULT_PITCH | FF_SWISS;  // nPitchAndFamily
    memcpy(m_logfont.lfFaceName, _T("Arial"), 5);                // lpszFacename


пересчет размера шрифта при печати
Код

    float height = abs(254 * m_fontPoints / g.GetDpiY())/*(::GetDeviceCaps(hdc,LOGPIXELSY))*/;    
    _bstr_t facename(m_logfont.lfFaceName);
    int style = FontStyleRegular;
    if (m_logfont.lfItalic) style |= FontStyleItalic;
    if (m_logfont.lfUnderline) style |= FontStyleUnderline;
    if (m_logfont.lfStrikeOut) style |= FontStyleStrikeout;
    if (m_logfont.lfWeight == FW_BOLD) style |= FontStyleBold;
    Font font(facename, height, style, UnitPoint);

Далее пишу текст этим фонтом.


Ниже функции пересчета логических единиц в поинты и обратно
Код

int ConvertLogUnitToPoint(int nLogUnitSize, CDC* pDC/*=NULL*/) {
    HDC hDC;
    if (pDC!=NULL)    {
        ASSERT_VALID(pDC);
        ASSERT(pDC->m_hAttribDC != NULL);
        hDC=pDC->m_hAttribDC;
    } else
        hDC=::GetDC(NULL);

    POINT ptOrg={0,0};
    ::DPtoLP(hDC,&ptOrg,1);
    POINT pt={0,0};

    pt.y=abs(nLogUnitSize)+ptOrg.y;
    ::LPtoDP(hDC,&pt,1);
    pt.y*=720;    // 72 points/inch, 10 decipoints/point
    
    int nPointSize=(pt.y)/(::GetDeviceCaps(hDC,LOGPIXELSY));

    if (pDC==NULL) ::ReleaseDC(NULL,hDC);

    return nPointSize;
}


Код

int ConvertPointToLogUnit(int nPointSize, CDC* pDC/*=NULL*/) {
    HDC hDC;
    if (pDC!=NULL)    {
        ASSERT_VALID(pDC);
        ASSERT(pDC->m_hAttribDC != NULL);
        hDC=pDC->m_hAttribDC;
    } else
        hDC=::GetDC(NULL);

    // convert nPointSize to logical units based on pDC
    POINT pt;
    pt.y=::GetDeviceCaps(hDC,LOGPIXELSY)*nPointSize;
    pt.y/=720;    // 72 points/inch, 10 decipoints/point
    ::DPtoLP(hDC,&pt,1);
    POINT ptOrg = {0,0};
    ::DPtoLP(hDC,&ptOrg,1);

    if(pDC==NULL)    ::ReleaseDC(NULL,hDC);

    return -abs(pt.y-ptOrg.y);
}


Делал давно, деталей не помню, может что и забыл.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0834 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.