1、在屏幕的CDC中绘图时的坐标转换
系统逻辑坐标——————屏幕坐标————————pDC逻辑坐标
我们调用GetWindowRect获得的是窗口的屏幕坐标Size。由于pDC默认的MapMode是MM_TEXT,所以我们可以直接使用Size作为逻辑大小填充窗口。
当然我们可以改变pDc的MapMode,这样我们逻辑坐标是Size,但是屏幕上出现的就不是Size了
2、在打印机中打印时的坐标转换
打印机坐标————————打印机的pDc逻辑坐标
屏幕坐标—————————屏幕的pDc逻辑坐标
纸张的尺寸已知,根据屏幕的DPI,纸张在屏幕上的屏幕坐标应该可以求得,所以在打印函数中,框架提供的打印信息中含有纸张的屏幕坐标Size。
如果我们直接使用打印机的默认pDC(MapMode是MM_TEXT)进行打印,会出现以下情况
纸张长度————>屏幕坐标Size——————> 打印机坐标Size
屏幕坐标Size是根据纸张长度和屏幕DPI确定的,在屏幕上Size个坐标的长度应该是纸张的长度,
但是在打印机中,Size个坐标的长度可能不是纸张的长度,因为屏幕和打印机的DPI不同。
所以要想打印正确,找到屏幕上SIze对应打印机中的多少个单位,我们可以设置打印机pDC的MapMode
根据屏幕的pDC->GetDeviceCaps(),获得屏幕上一英寸对应的屏幕坐标长度x1;
根据打印机的pDC->GetDeviceCaps(),获得打印机上一英寸对应的打印机坐标长度x2;
打印机pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(x1,y1);//逻辑窗口中坐标大小
pDC->SetViewportExt(x2,y2);//打印窗口中坐标大小