📄 vmprinter.cpp
字号:
saveContext = ps->pDC->SaveDC();
ps->pDC->SetMapMode( MM_TEXT );
lf.lfHeight = -MulDiv( ps->PointSize, ps->pDC->GetDeviceCaps( LOGPIXELSY ), 72 );
lf.lfWidth = 0;
lf.lfEscapement = RotationAngle;
lf.lfOrientation = 0;
lf.lfWeight = (ps->uTextFlags & TEXT_BOLD) ? FW_BOLD : FW_NORMAL;
lf.lfItalic = (ps->uTextFlags & TEXT_ITALIC) ? 1 : 0;
lf.lfUnderline = (ps->uTextFlags & TEXT_UNDERLINED) ? 1 : 0;
lf.lfStrikeOut = (ps->uTextFlags & TEXT_STRIKEOUT) ? 1 : 0;
lf.lfCharSet = ANSI_CHARSET;
lf.lfOutPrecision = OUT_STROKE_PRECIS;
lf.lfClipPrecision = CLIP_STROKE_PRECIS;
lf.lfQuality = PROOF_QUALITY;
lf.lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
lstrcpy( (LPSTR)lf.lfFaceName, (LPCSTR)ps->FontName );
hFont = ::CreateFontIndirect( &lf );
hOldFont = (HFONT)::SelectObject( ps->pDC->GetSafeHdc(), hFont );
// set the alignment flags in the format bitfield
//
fuFormat |= ( ps->uTextFlags & TEXT_CENTER )
? DT_CENTER : ( ps->uTextFlags & TEXT_RIGHT )
? DT_RIGHT : DT_LEFT;
if ( ps->uTextFlags & TEXT_VCENTER )
{
fuFormat |= DT_VCENTER;
}
// expand tabs if indicated
//
if ( ps->uTextFlags & TEXT_EXPANDTABS )
{
fuFormat |= DT_EXPANDTABS;
}
// set text clipping
//
if ( ps->uTextFlags & TEXT_NOCLIP )
{
fuFormat |= DT_NOCLIP;
}
// if this is a single line then set alignment to bottom
//
if ( ps->uTextFlags & TEXT_SINGLELINE )
{
fuFormat |= DT_SINGLELINE;
}
else
{
fuFormat |= DT_WORDBREAK;
}
// if the extents of rect haven't been specified then
// calculate them
//
if ( ps->rc.right == 0 && ps->rc.bottom == 0 )
{
ps->pDC->DrawText( ps->Text, -1, &rc, fuFormat | DT_CALCRECT );
}
LastPos = rc;
if ( ps->uTextFlags & TEXT_RECT
&& ( ( ps->uFillFlags & FILL_BLACK )
|| ( ps->uFillFlags & FILL_LTGRAY )
|| ( ps->uFillFlags & FILL_DKGRAY ) ) )
{
OldBkMode = ps->pDC->SetBkMode( TRANSPARENT );
}
if ( ps->uTextFlags & TEXT_RECT
&& ( ( ps->uFillFlags & FILL_BLACK )
|| ( ps->uFillFlags & FILL_DKGRAY ) ) )
{
OldColor = ps->pDC->SetTextColor( COLOR_WHITE );
}
if ( ps->uTextFlags & TEXT_RECT )
{
hBrush = (HBRUSH)::GetStockObject( ( ps->uFillFlags & FILL_GRAY )
? GRAY_BRUSH : ( ps->uFillFlags & FILL_LTGRAY )
? LTGRAY_BRUSH : ( ps->uFillFlags & FILL_DKGRAY )
? DKGRAY_BRUSH : ( ps->uFillFlags & FILL_BLACK )
? BLACK_BRUSH : HOLLOW_BRUSH );
hOldBrush = (HBRUSH)::SelectObject( ps->pDC->GetSafeHdc(), hBrush );
ps->pDC->Rectangle( rc.left, rc.top, rc.right, rc.bottom );
}
// now draw the text
//
ps->pDC->DrawText( ps->Text, -1,&rc, fuFormat );
if ( ps->uTextFlags & TEXT_RECT
&& ( ( ps->uFillFlags & FILL_BLACK )
|| ( ps->uFillFlags & FILL_LTGRAY )
|| ( ps->uFillFlags & FILL_DKGRAY ) ) )
{
OldBkMode = ps->pDC->SetBkMode( OldBkMode );
}
if ( ps->uTextFlags & TEXT_RECT
&& ( ( ps->uFillFlags & FILL_BLACK )
|| ( ps->uFillFlags & FILL_DKGRAY ) ) )
{
ps->pDC->SetTextColor( OldColor );
}
ps->pDC->DrawText( ps->Text, -1, &LastPos, fuFormat | DT_CALCRECT );
uiLineSpacing = (int)( ps->PointSize * LineSpacing );
if ( ps->uTextFlags & TEXT_RECT )
{
::DeleteObject( ::SelectObject( ps->pDC->GetSafeHdc(), hOldBrush ) );
}
::DeleteObject( ::SelectObject( ps->pDC->GetSafeHdc(), hOldFont ) );
if ( saveContext )
{
ps->pDC->RestoreDC( saveContext );
}
ps->pDC->DPtoLP( (LPPOINT)&LastPos, 2 );
ps->m_MinDisplacement = LastPos.bottom - LastPos.top;
ps->pDC->GetTextMetrics( ps->tm );
ps->m_NextCharPos = LastPos.right;
ps->LastPrintArea = LastPos;
RotationAngle = 0;
return( uiLineSpacing );
}
/* End of function "VMPrinter::PrintText"
/*****************************************************************************/
/*****************************************************************************/
/*
FUNCTION NAME: VMPrinter::GetPrintInfo
DESCRIPTION:
INPUT: ps -
LineSpacing -
OUTPUT:
RETURNS: int -
*/
int VMPrinter::GetPrintInfo( PRTTYPE* ps, double LineSpacing )
{
LOGFONT lf;
HFONT hOldFont;
HFONT hFont;
int saveContext;
RECT rc;
RECT LastPos;
UINT fuFormat = DT_NOPREFIX;
int uiLineSpacing;
// initialize the rect structure
//
rc.left = ps->rc.left + ps->MarginOffset;
rc.top = ps->rc.top;
rc.right = ps->rc.right + ps->MarginOffset;
rc.bottom = ps->rc.bottom;
// convert logical coordinates to device coordinates
//
ps->pDC->LPtoDP( (LPPOINT)&rc, 2 );
// save the dc and change map mode to MM_TEXT. Much
//
saveContext = ps->pDC->SaveDC();
ps->pDC->SetMapMode( MM_TEXT );
lf.lfHeight = -MulDiv( ps->PointSize, ps->pDC->GetDeviceCaps( LOGPIXELSY ), 72 );
lf.lfWidth = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = ( ps->uTextFlags & TEXT_BOLD ) ? FW_BOLD : FW_NORMAL;
lf.lfItalic = ( ps->uTextFlags & TEXT_ITALIC ) ? 1 : 0;
lf.lfUnderline = ( ps->uTextFlags & TEXT_UNDERLINED ) ? 1 : 0;
lf.lfStrikeOut = ( ps->uTextFlags & TEXT_STRIKEOUT ) ? 1 : 0;
lf.lfCharSet = ANSI_CHARSET;
lf.lfOutPrecision = OUT_STROKE_PRECIS;
lf.lfClipPrecision = CLIP_STROKE_PRECIS;
lf.lfQuality = PROOF_QUALITY;
lf.lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
lstrcpy( (LPSTR)lf.lfFaceName, (LPCSTR)ps->FontName );
hFont = ::CreateFontIndirect( &lf );
hOldFont = (HFONT)::SelectObject( ps->pDC->GetSafeHdc(), hFont );
// set the alignment flags in the format bitfield
//
fuFormat |= ( ps->uTextFlags & TEXT_CENTER )
? DT_CENTER : ( ps->uTextFlags & TEXT_RIGHT )
? DT_RIGHT : DT_LEFT;
if ( ps->uTextFlags & TEXT_VCENTER )
{
fuFormat |= DT_VCENTER;
}
// expand tabs if indicated
//
if ( ps->uTextFlags & TEXT_EXPANDTABS )
{
fuFormat |= DT_EXPANDTABS;
}
// set text clipping
//
if ( ps->uTextFlags & TEXT_NOCLIP )
{
fuFormat |= DT_NOCLIP;
}
// if this is a single line then set alignment to bottom
//
if ( ps->uTextFlags & TEXT_SINGLELINE )
{
fuFormat |= DT_SINGLELINE;
}
else
{
fuFormat |= DT_WORDBREAK;
}
LastPos = rc;
ps->pDC->DrawText( ps->Text,
-1,
&LastPos,
fuFormat | DT_CALCRECT );
uiLineSpacing = (int)( ps->PointSize * LineSpacing );
::DeleteObject( ::SelectObject( ps->pDC->GetSafeHdc(), hOldFont ) );
if ( saveContext )
{
ps->pDC->RestoreDC( saveContext );
}
ps->pDC->DPtoLP( (LPPOINT)&LastPos, 2 );
ps->m_MinDisplacement = LastPos.bottom - LastPos.top;
ps->m_NextCharPos = LastPos.right;
ps->LastPrintArea = LastPos;
return( uiLineSpacing );
}
/* End of function "VMPrinter::GetPrintInfo"
/*****************************************************************************/
/*****************************************************************************/
/* Check-in history */
/*
*$Log: $
*/
/*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -