利用CPrintDialog打印文件
前段时间需要将日志信息通过打印机打印出来。
总结了一下其中的一些用法:
1:用CPrintDialog 可以呼出窗口让用户选择打印机或者采用默认的打印机直接打印。
StartPage…..EndPage 完成一页文档的打印。 如需改变DC设置,需要调用ReSetDC()
多次调用这两个函数,可以实现打印多页
2:TextOut坐标的确定。
TextOut中的坐标是DC中的逻辑坐标。
和实际的物理坐标需要转换。
GetDeviceCpas(); //获取DC中的Device信息。
GetTextMetrics(); //获取字体的信息。 字体高度和本身高度+行距。
3:TextOut中的字体可以设置。
关键代码如下:
CFont myFont;
myFont.CreatePontFont(….);
oldFont = dc.SelectObject();
myFont.DelectObject()';
附上相关文档
打印单位的转换
这个的关键是我们要得到显示设备的DPI,即每英寸设备支持的点数。有了DPI我们就可以在我们习惯的单位和设备单位之间转换了,用到的API是GetDeviceCaps(),这个函数功能强大,具体可参考MSDN,在这里我们只用来得到设备DPI。看示例代码:
//某些设备水平和垂直方向的DPI可能不同,所以要分别得到。
//得到水平方向的转换比例
float getXScale(HDC printDC) //printDC: 打印机DC设备句柄
{
//得到打印机水平方向的DPI
int xDPI = GetDeviceCaps(printDC, LOGPIXELSX);
//254.0: 每英寸25.4毫米
float xScale = (float)(254.0 / xDPI);
return xScale;
}
//得到垂直方向的转换比例
float getYScale(HDC printDC) //printDC: 打印机DC设备句柄
{
//得到打印机垂直方向的DPI
int yDPI = GetDeviceCaps(printDC, LOGPIXELSY);
float yScale = (float)(254.0 / yDPI);
return yScale;
}
//厘米转换为设备像素,水平方向
double cm2Unit_W(float xScale, double w) //w单位为厘米
{
return w*100/xScale;
}
//厘米转换为设备像素,垂直方向
double cm2Unit_H(float yScale, double h) //h单位为厘米
{
return h*100/yScale;
}
上面代码中,如果将printDC换为显示器设备DC句柄,即可得到厘米转换为显示器像素单位,打印预览时使用。得到显示器设备句柄可用::GetDC(NULL)得到。