打印基本流程
有了前面的知识,现在我们就可以打印了。Windows打印是有着固定的流程的,流程也比较简单。按照固定的顺序调用打印API即可:StartDoc() -> StartPage() -> 打印具体内容 -> EndPage() -> EndDoc()。如果要打印多页,循环StartPage()至EndPage()即可。
示例代码:
DOCINFO doc;
ZeroMemory(
doc.cbSize = sizeof(doc);
doc.lpszDocName = (LPCTSTR)"Print Test File";
StartDoc(printDC, //准备打印
StartPage(printDC); //开始打印页
//在(2.5cm, 2.5cm)处打印文本
char* text = "打印测试文本";
float xScale = getXScale(printDC);
float yScale = getYScale(printDC);
double x = cm2Unit_W(xScale, 2.5);
double y = cm2Unit_H(yScale, 2.5);
//在指定位置打印文本
TextOut(printDC, (int)x, (int)y, (LPTSTR)text, strlen(text));
EndPage(printDC); //结束打印页
EndDoc(printDC); //结束打印
打印字体的设置
很多时候我们希望能控制打印字体,下面的代码可以创建你想要的字体格式:
/* 创建自定义打印字体
fontFace:字体名称,如果为NULL,默认采用"宋体"
fontHeight:字体高度,单位为厘米
isBold:是否加粗
isItalic:是否斜体
isUnderLine:是否下划线
isStrikeOut:是否删除线
*/
HFONT getFont(LPCTSTR fontFace, double fontHeight, bool isBold, bool isItalic, bool isUnderLine, bool isStrikeOut)
{
int width = 0; //字体宽度由系统决定
int weight = FW_NORMAL;
DWORD italic = 0;
DWORD underLine = 0;
DWORD strikeOut = 0;
DWORD charSet = DEFAULT_CHARSET;
LPCTSTR face = (LPCTSTR)"宋体";
float height = cm2Unit_H(fontHeight);
if(fontFace != 0)
{
face = fontFace;
}
if(isBold)
{
weight = FW_BOLD;
}
if(isItalic)
{
italic = 1;
}
if(isUnderLine)
{
underLine = 1;
}
if(isStrikeOut)
{
strikeOut = 1;
}
HFONT font = CreateFont((int)height, width, 0, 0,
weight, italic, underLine, strikeOut, charSet,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
DEFAULT_PITCH | FF_DONTCARE, face );
return font;
}
小结
以上就是我们在实现打印中遇到的常见问题,相信理解了这些,在我们自己的程序中实现打印就不再是什么困难的事情了。