⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpage.cpp

📁 Windows下打印函数库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
////////////////////////////////////////////////////////////////////////////
//	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 + -