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

TOUT 2011-08-10 01:34:17
对于所有映射模式,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);
}
...全文
150 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
youngwolf 2011-08-12
  • 打赏
  • 举报
回复
最后,再有两句:
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

另外,我看你有些值没能初始化,希望你真正的代码不是贴在这里的样子。
TOUT 2011-08-11
  • 打赏
  • 举报
回复
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);
/-------------------------------------------------------------
改成这样对吗? 还是不行,没变化
TOUT 2011-08-10
  • 打赏
  • 举报
回复
不一样,用 针式打印机 爱普生1600K, 打印一切正常
用 HP喷墨打印机 只有左上角一点点位置。
换了打印机后,效果为什么不一样了。
羽飞 2011-08-10
  • 打赏
  • 举报
回复
不一样?
  • 打赏
  • 举报
回复
学习,看看
youngwolf 2011-08-10
  • 打赏
  • 举报
回复
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
youngwolf 2011-08-10
  • 打赏
  • 举报
回复
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);

这样不管在什么打印机上,打印的效果都完全等于你的屏幕上的显示内容了。
注:摘自我自己的一个免费共享软件。
TOUT 2011-08-10
  • 打赏
  • 举报
回复
有没人知道哦,
用 针式打印机 爱普生1600K, 打印一切正常,
HP喷墨打印机 只有左上角一点点位置。
估计是要用映射模式,把我看晕了

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧