hur.cn - 华软网

 热门搜索

映射模式问题,把我弄晕了

  作者:未知    来源:网络    更新时间:2011/8/10
对于所有映射模式,Windows都用下面两个公式将窗口坐标转换成视口坐标: 
       xViewport=(xWindow-xWinOrg)*(xViewExt/xWinExt)+xViewOrg 
       yViewport=(yWindow-yWinOrg)*(yViewExt/yWinExt)+yViewOrg 
其中,(xWindow,yWindows)是待转换的逻辑点,(xViewport,yViewport)是转换后的设备点。

我要对应到打印,如何转换坐标。把我弄晕了

    
OnPrint(CDC* pDC,CPrintInfo* pInfo)
{
pDC->SetMapMode(MM_ANISOTROPIC);
         CPoint ptOrgView,ptOrgWindow;
         CSize sizeView,sizeWindow;
         ptOrgView=dc.GetViewportOrg();//获取视口原点
         sizeView=dc.GetViewportExt();//获取视口范围

         ptOrgWindow=dc.GetWindowOrg();//获取窗口原点
         sizeWindow=dc.GetWindowExt();//获取窗口范围

int xlog=pDC->GetDeviceCaps(LOGPIXELSX);
int ylog=pDC->GetDeviceCaps(LOGPIXELSY);
//再如何套用公式:(书上看的,变量不一样)
//         xViewport=(xWindow-xWinOrg)*(xViewExt/xWinExt)+xViewOrg  
       如:xViewport=(sizeWindow.cx-?)*(sizeView.cx/xWindow.cx)+?  如何计算出来,带需要取哪些变量?
//         yViewport=(yWindow-yWinOrg)*(yViewExt/yWinExt)+yViewOrg 
//


pDC->SetViewportExt((int)xViewport,(int)yViewport);
}
---华软 网友回答---
学习,看看
---华软网友回复---
不一样?
---华软网友回复---
不一样,用 针式打印机 爱普生1600K, 打印一切正常
        用 HP喷墨打印机 只有左上角一点点位置。
换了打印机后,效果为什么不一样了。
---华软网友回复---
有没人知道哦,
用 针式打印机 爱普生1600K, 打印一切正常,
   HP喷墨打印机 只有左上角一点点位置。
  估计是要用映射模式,把我看晕了

---华软网友回复---
float RateX = (float) GetDeviceCaps(hPrintDC, LOGPIXELSX) / GetDeviceCaps(hFrceDC, LOGPIXELSX);
float RateY = (float) GetDeviceCaps(hPrintDC, LOGPIXELSY) / GetDeviceCaps(hFrceDC, LOGPIXELSY);
int ViewWidth = GetDeviceCaps(hPrintDC, PHYSICALWIDTH) -
2 * GetDeviceCaps(hPrintDC, PHYSICALOFFSETX) - (int) (RateX * (LeftMargin + RightMargin));
int ViewHeight = GetDeviceCaps(hPrintDC, PHYSICALHEIGHT) -
2 * GetDeviceCaps(hPrintDC, PHYSICALOFFSETY) - (int) (RateY * (TopMargin + BottomMargin));
int PrintWinWidth = (int) (ViewWidth / RateX);
int PrintWinHeight = (int) (ViewHeight / RateY);

hPrintDC为打印dc,hFrceDC为屏幕dc,上面得到按屏幕dc计算的打印机的实际窗口大小。

下面设置映射模式:
::SetBkMode(hPrintDC, TRANSPARENT);
SetMapMode(hPrintDC, MM_ANISOTROPIC);
SetWindowExtEx(hPrintDC, PrintWinWidth, PrintWinHeight, 0);

这样不管在什么打印机上,打印的效果都完全等于你的屏幕上的显示内容了。
注:摘自我自己的一个免费共享软件
---华软网友回复---
LeftMargin + RightMargin
TopMargin + BottomMargin
是边上的空白,是一个自定义值,你可以不使用(让它们都等于0)。

最后,再有两句:
int OrgX = (int) (RateX * LeftMargin), OrgY = (int) (RateY * TopMargin);
SetViewportExtEx(hPrintDC, ViewWidth, ViewHeight, 0);
SetViewportOrgEx(hPrintDC, OrgX , OrgY , 0);

当然,如果你没有为边上预留空白的话(其实打印机驱动已经留过白边了,参看上面的GetDeviceCaps(hPrintDC, PHYSICALOFFSETX),但我自己又加了一个白边,可设置的,不像驱动那样,是死的,当然这仅仅是我的共享软件的一个小功能),OrgX OrgY SetViewportOrgEx可以不要,或者都等于0
---华软网友回复---
int LeftMargin,RightMargin;
int TopMargin , BottomMargin;
HDC   hFrceDC=pDC-> GetSafeHdc();
CPrintDialog   hPrint(FALSE);
if   (!hPrint.GetDefaults()) 
return  ; 
HDC hPrintDC = hPrint.GetPrinterDC();
if (hPrintDC == NULL)
{
return;
}
float RateX = (float)GetDeviceCaps(hPrintDC, LOGPIXELSX) / GetDeviceCaps(hFrceDC, LOGPIXELSX);
    float RateY = (float)GetDeviceCaps(hPrintDC, LOGPIXELSY) / GetDeviceCaps(hFrceDC, LOGPIXELSY);
    int ViewWidth = GetDeviceCaps(hPrintDC, PHYSICALWIDTH) -2 * GetDeviceCaps(hPrintDC, PHYSICALOFFSETX) - (int) (RateX * (LeftMargin + RightMargin));
int ViewHeight = GetDeviceCaps(hPrintDC, PHYSICALHEIGHT) -2 * GetDeviceCaps(hPrintDC, PHYSICALOFFSETY) - (int) (RateY * (TopMargin + BottomMargin));
int PrintWinWidth = (int) (ViewWidth / RateX);
int PrintWinHeight = (int) (ViewHeight / RateY);

//hPrintDC为打印dc,hFrceDC为屏幕dc,上面得到按屏幕dc计算的打印机的实际窗口大小。

//下面设置映射模式:
// ::SetBkMode(hPrintDC, TRANSPARENT);
pDC->SetMapMode( MM_ANISOTROPIC);
SetWindowExtEx(hPrintDC, PrintWinWidth, PrintWinHeight, 0);
/-------------------------------------------------------------
改成这样对吗? 还是不行,没变化
---华软网友回复---
最后,再有两句:
int OrgX = (int) (RateX * LeftMargin), OrgY = (int) (RateY * TopMargin);
SetViewportExtEx(hPrintDC, ViewWidth, ViewHeight, 0);
SetViewportOrgEx(hPrintDC, OrgX , OrgY , 0);

当然,如果你没有为边上预留空白的话(其实打印机驱动已经留过白边了,参看上面的GetDeviceCaps(hPrintDC, PHYSICALOFFSETX),但我自己又加了一个白边,可设置的,不像驱动那样,是死的,当然这仅仅是我的共享软件的一个小功能),OrgX OrgY SetViewportOrgEx可以不要,或者都等于0

另外,我看你有些值没能初始化,希望你真正的代码不是贴在这里的样子。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。