Приходилось делать такое. Когда-то искал информацию, но ссылок уже нет. Потому дам кусок кода, разбирайся и копай дальше.
При печати использовался режим 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); }
|
Делал давно, деталей не помню, может что и забыл.
|