📄 cpage.cpp
字号:
////////////////////////////////////////////////////////////////////////////
// CONVERSION ROUTINES pixels to inches
////////////////////////////////////////////////////////////////////////////
// Desc: Converts a position in inches to logical units
// params: Row ( same as rect.top) Col ( same as rect.left)
// Returns: none but parameters are changed indirectly
///////////////////////////////////////////////////////////////////////////
void CPage::ConvertPosition(double& Row,double& Col)
{
Row=ConvertToMappedUnits(Row,VERTRES);
Col=ConvertToMappedUnits(Col,HORZRES);
}
////////////////////////////////////////////////////////////////////////////
// Desc: same as above but does the whole rectangle at once
// params:
// Returns:
///////////////////////////////////////////////////////////////////////////
void CPage::ConvertArea(double& top,double& left,double& bottom,double& right)
{
top=ConvertToMappedUnits(top,VERTRES);
left=ConvertToMappedUnits(left,HORZRES);
bottom=ConvertToMappedUnits(bottom,VERTRES);
right=ConvertToMappedUnits(right,HORZRES);
}
////////////////////////////////////////////////////////////////////////////
// TEXT PRINT ROUTINES
////////////////////////////////////////////////////////////////////////////
// Desc: Very low level call. All Print Routines end up here. Do not call direct
// params: LPCSTR the text to print StartPos starting column Text flasg and Pointsize
// Returns: The next logical vertical print position
///////////////////////////////////////////////////////////////////////////
int CPage::Print(LPCSTR Text,int StartPos,UINT flags,int PointSize)
{
if(StartPos > SetRightMargin(0))
return m_PrtDesc.rc.top;
if(m_PrtDesc.rc.top > SetBottomMargin(0))
return m_PrtDesc.rc.top;
m_PrtDesc.Text=Text;
if(PointSize > 0)
m_PrtDesc.PointSize=PointSize;
if(flags != IGNORE_PARAM)
m_PrtDesc.uTextFlags=flags;
if(StartPos==-1)
m_PrtDesc.rc.left=m_PrtDesc.m_NextCharPos;
else
m_PrtDesc.rc.left=StartPos;
ThePrinter.PrintText(&m_PrtDesc,m_Spacing);
m_nNextPos=m_PrtDesc.m_NextCharPos;
return m_PrtDesc.LastPrintArea.bottom;
}
////////////////////////////////////////////////////////////////////////////
// Desc: Prints using printf variable length print arguments
// params: Row,Col-Location Coordinates arg list uses current default flags
// Returns:The next logical print line using the current font size and line spacing
///////////////////////////////////////////////////////////////////////////
int CPage::Print(int row,int col,const char* fmt,...)
{
va_list t;
va_start(t,fmt);
vsprintf(Buffer,fmt,t);
m_PrtDesc.rc.top=row;
int res=Print(Buffer,col,m_PrtDesc.uTextFlags,m_PrtDesc.PointSize);
va_end(t);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
return res+nLineSpacing;
}
////////////////////////////////////////////////////////////////////////////
// Desc: same as above only position info is in inches, not device units
// params:
// Returns:same as above only in inches, not device units
///////////////////////////////////////////////////////////////////////////
double CPage::Print(double row,double col,const char* fmt,...)
{
va_list t;
va_start(t,fmt);
vsprintf(Buffer,fmt,t);
ConvertPosition(row,col);
m_PrtDesc.rc.top=(int)row;
int res=Print(Buffer,(int)col,m_PrtDesc.uTextFlags,m_PrtDesc.PointSize);
va_end(t);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
return ConvertToInches(res+nLineSpacing,VERTRES);
}
////////////////////////////////////////////////////////////////////////////
// Desc: Prints using data supplied as return value from user function
// params: Row,Col-Location Coordinates user ID to be supplied to user function
// Returns:The next logical print line using the current font size and line spacing
///////////////////////////////////////////////////////////////////////////
int CPage::Print(int row,int col,int ID)
{
if(pUserFunc==NULL)
return 0;
m_PrtDesc.rc.top=row;
int res=Print(pUserFunc(ID),col,m_PrtDesc.uTextFlags,m_PrtDesc.PointSize);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
return res+nLineSpacing;
}
////////////////////////////////////////////////////////////////////////////
// Desc: same as above only position info is in inches, not device units
// params:
// Returns:same as above only in inches, not device units
///////////////////////////////////////////////////////////////////////////
double CPage::Print(double row,double col,int ID)
{
if(pUserFunc==NULL)
return 0;
ConvertPosition(row,col);
m_PrtDesc.rc.top=(int)row;
int res=Print(pUserFunc(ID),(int)col,m_PrtDesc.uTextFlags,m_PrtDesc.PointSize);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
return ConvertToInches(res+nLineSpacing,VERTRES);
}
////////////////////////////////////////////////////////////////////////////
// Desc: Prints by calling user defined function for data
// params: Row,Col-Location Coordinates TextFlags Point size user id
// Returns:The next logical print line using the current font size and line spacing
///////////////////////////////////////////////////////////////////////////
int CPage::Print(int row,int col,UINT TextFlags,int PointSize,int ID)
{
if(pUserFunc==NULL)
return 0;
m_PrtDesc.rc.top=row;
int res=Print(pUserFunc(ID),col,TextFlags,PointSize);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
return res+nLineSpacing;
}
////////////////////////////////////////////////////////////////////////////
// Desc: same as above only position info is in inches, not device units
// params:
// Returns:same as above only in inches, not device units
///////////////////////////////////////////////////////////////////////////
double CPage::Print(double row,double col,UINT TextFlags,int PointSize,int ID)
{
if(pUserFunc==NULL)
return 0;
ConvertPosition(row,col);
m_PrtDesc.rc.top=(int)row;
int res=Print(pUserFunc(ID),(int)col,TextFlags,PointSize);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
return ConvertToInches(res+nLineSpacing,VERTRES);
}
////////////////////////////////////////////////////////////////////////////
// Desc: Prints using printf variable length print arguments
// params: Row,Col-Location Coordinates TextFlags Point size variable arg list
// Returns:The next logical print line using the current font size and line spacing
///////////////////////////////////////////////////////////////////////////
int CPage::Print(int row,int col,UINT TextFlags,int PointSize,const char* fmt,...)
{
va_list t;
va_start(t,fmt);
vsprintf(Buffer,fmt,t);
m_PrtDesc.rc.top=row;
int res=Print(Buffer,col,TextFlags,PointSize);
va_end(t);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
return res+nLineSpacing;
}
////////////////////////////////////////////////////////////////////////////
// Desc: same as above only position info is in inches, not device units
// params:
// Returns:same as above only in inches, not device units
///////////////////////////////////////////////////////////////////////////
double CPage::Print(double row,double col,UINT TextFlags,int PointSize,const char* fmt,...)
{
va_list t;
va_start(t,fmt);
vsprintf(Buffer,fmt,t);
ConvertPosition(row,col);
m_PrtDesc.rc.top=(int)row;
int res=Print(Buffer,(int)col,TextFlags,PointSize);
va_end(t);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
return ConvertToInches(res+nLineSpacing,VERTRES);
}
////////////////////////////////////////////////////////////////////////////
// Desc: Same as above except col is a pointer and is updated to the next locical print column
// params:
// Returns: The next logical print row
///////////////////////////////////////////////////////////////////////////
double CPage::Print(double row,double *col,UINT TextFlags,int PointSize,const char* fmt,...)
{
va_list t;
va_start(t,fmt);
vsprintf(Buffer,fmt,t);
ConvertPosition(row,*col);
m_PrtDesc.rc.top=(int)row;
int res=Print(Buffer,(int)(*col),TextFlags,PointSize);
va_end(t);
*col=GetNextLogicalColumn();
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
return ConvertToInches(res+nLineSpacing,VERTRES);
}
////////////////////////////////////////////////////////////////////////////
// Desc: Same as above except col is updates to the next logical column
// params: See above
// Returns: See above
///////////////////////////////////////////////////////////////////////////
int CPage::Print(int row,int *col,UINT TextFlags,int PointSize,const char* fmt,...)
{
va_list t;
va_start(t,fmt);
vsprintf(Buffer,fmt,t);
m_PrtDesc.rc.top=row;
int res=Print(Buffer,*col,TextFlags,PointSize);
va_end(t);
*col=(int)GetNextLogicalColumn(FALSE);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
return res+nLineSpacing;
}
////////////////////////////////////////////////////////////////////////////
// Desc: Prints using printf variable length print arguments
// params:
// Returns:The next logical print line using the current font size and line spacing
///////////////////////////////////////////////////////////////////////////
int CPage::Print(CPrintRegion* pRegion,int row,int col,UINT TextFlags,int PointSize,const char* fmt,...)
{
va_list t;
SaveState();
va_start(t,fmt);
vsprintf(Buffer,fmt,t);
m_PrtDesc.rc.top=row+pRegion->FirstY;
m_PrtDesc.rc.bottom=pRegion->bottom;
m_PrtDesc.rc.right=pRegion->right;
m_PrtDesc.rc.left=pRegion->FirstX;
int res=Print(Buffer,col+pRegion->FirstX,TextFlags,PointSize);
va_end(t);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
RestoreState();
return (res-pRegion->FirstY)+nLineSpacing;
}
////////////////////////////////////////////////////////////////////////////
// Desc: same as above only position info is in inches, not device units
// params:
// Returns:same as above only in inches, not device units
///////////////////////////////////////////////////////////////////////////
double CPage::Print(CPrintRegion* pRegion,double row,double col,UINT TextFlags,int PointSize,const char* fmt,...)
{
va_list t;
SaveState();
va_start(t,fmt);
vsprintf(Buffer,fmt,t);
ConvertPosition(row,col);
m_PrtDesc.rc.top=(int)row+pRegion->FirstY;
m_PrtDesc.rc.bottom=pRegion->bottom;
m_PrtDesc.rc.right=pRegion->right;
m_PrtDesc.rc.left=pRegion->FirstX;
int res=Print(Buffer,(int)col+pRegion->FirstX,TextFlags,PointSize);
va_end(t);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
RestoreState();
return ConvertToInches( (int)( (res-pRegion->FirstY)+nLineSpacing),VERTRES);
}
////////////////////////////////////////////////////////////////////////////
// Desc: Prints using user defined function for data
// params:
// Returns:The next logical print line using the current font size and line spacing
///////////////////////////////////////////////////////////////////////////
int CPage::Print(CPrintRegion* pRegion,int row,int col,UINT TextFlags,int PointSize,int ID)
{
if(pUserFunc==NULL)
return 0;
SaveState();
m_PrtDesc.rc.top=row+pRegion->FirstY;
m_PrtDesc.rc.bottom=pRegion->bottom;
m_PrtDesc.rc.right=pRegion->right;
m_PrtDesc.rc.left=pRegion->FirstX;
int res=Print(pUserFunc(ID),col+pRegion->FirstX,TextFlags,PointSize);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
RestoreState();
return (res-pRegion->FirstY)+nLineSpacing;
}
////////////////////////////////////////////////////////////////////////////
// Desc: same as above only position info is in inches, not device units
// params:
// Returns:same as above only in inches, not device units
///////////////////////////////////////////////////////////////////////////
double CPage::Print(CPrintRegion* pRegion,double row,double col,UINT TextFlags,int PointSize,int ID)
{
if(pUserFunc==NULL)
return 0;
SaveState();
ConvertPosition(row,col);
m_PrtDesc.rc.top=(int)row+pRegion->FirstY;
m_PrtDesc.rc.bottom=pRegion->bottom;
m_PrtDesc.rc.right=pRegion->right;
m_PrtDesc.rc.left=pRegion->FirstX;
int res=Print(pUserFunc(ID),(int)col+pRegion->FirstX,TextFlags,PointSize);
int nLineSpacing = m_Spacing > 1 ? (int)(ConvertToMappedUnits(m_PrtDesc.PointSize/72.0,VERTRES)*(m_Spacing-1)):0;
RestoreState();
return ConvertToInches( (int)( (res-pRegion->FirstY)+nLineSpacing),VERTRES);
}
////////////////////////////////////////////////////////////////////////////
// Desc: Prints text clipped to a bounding rectangle. See the header for default
// parameters. Allows for newspaper like columns
// params: coordinates of the bounding rectangle flags pointsize and text to print
// Returns:
///////////////////////////////////////////////////////////////////////////
void CPage::PrintColumn(int Top,int Left,int Bottom,int Right,UINT flags,int PointSize,LPCSTR Text)
{
if(Left > SetRightMargin(0))
return;
if(Top > SetBottomMargin(0))
return;
SaveState();
m_PrtDesc.Text=Text;
if(PointSize > 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -