打印问题,你所遇到的是不同的设备的DPI不同导致。显示器以分辨率计算,即横纵有1024*768个像素点,而DPI每平方英寸的像素点,不同的打印机有不同的DPI精度,DPI越高表示打印的效果越精细。因此显示器上看着正常的图像到打印机上却是变小就是因为如此,WINDOWS中解决的办法是采用映射来解决。即通过设定窗口和视口范围来解决不同设备之间精度不相同带来的放大缩小问题,这里的逻辑坐标指的是自己定义的坐标而不是WINDOW窗口的客户区坐标,而设备坐标也是指打印机的设备坐标。窗口也不是指WINDOWS的窗口,而是指你用逻辑坐标在WINDOW窗口中指定的一个矩形范围,映射就是将这个矩形范围映射到打印机的可打印矩形范围去,中间WIDNOWS会按给定的两个范围进行转换操作。
用MFC向导生成的打印和预览框架需要重载OnPrepareDC()成员函数在其内进行映射操作,需要注意的是此成员函数不仅在打印和打印预览前被调用在OnDraw()成员数执行前也会被调用。
以下代码中的pDC是已经获得的打印机句柄指针
int pageX = pDC->GetDeviceCaps (HORZRES);//以像素为单位返回打印机可打印宽度
int pageY = pDC->GetDeviceCaps (VERTRES);//以像素为单位返回打印机可打印高度
int ViewX = 600;int ViewY = 800; //自定义的逻辑坐标范围,可以采用与显示器相同的分辨率范围
pDC->SetMapMode (MM_ANISOTROPIC);
pDC->SetWindowExt (ViewX, ViewY);//设定窗口范围
pDC->SetViewportExt(pageX, pageY);//设定视口范围
用MFC向导生成的打印和预览框架需要重载OnPrepareDC()成员函数在其内进行映射操作,需要注意的是此成员函数不仅在打印和打印预览前被调用在OnDraw()成员数执行前也会被调用。
以下代码中的pDC是已经获得的打印机句柄指针
int pageX = pDC->GetDeviceCaps (HORZRES);//以像素为单位返回打印机可打印宽度
int pageY = pDC->GetDeviceCaps (VERTRES);//以像素为单位返回打印机可打印高度
int ViewX = 600;int ViewY = 800; //自定义的逻辑坐标范围,可以采用与显示器相同的分辨率范围
pDC->SetMapMode (MM_ANISOTROPIC);
pDC->SetWindowExt (ViewX, ViewY);//设定窗口范围
pDC->SetViewportExt(pageX, pageY);//设定视口范围