MFC 坐标系统

参考:qingshuiyangfan

	DC::GetDeviceCaps(int Type)
	// 物理长度与屏幕像素间的转换
	// 读取DC的一些打印区域信息,主要是像素和英寸方面的数据.

	// 使用例子:
	// 1. 获得显示器的总像素数
	int pagecx = dc.GetDeviceCaps(HORZRES);
	int pagecy = dc.GetDeviceCaps(VERTRES);
	
	// 2. 计算每 100 个逻辑点对应的像素个数(这里的 100 指的是,用 dc 画图时候的单位,
	//    只不过一般做练习的时候,就直接默认了 1 个逻辑单位 = 1 个像素)
	//    所以这个计算结果 / 100,就表示 1 个逻辑宽度对应的 像素的大小
	short xLogPixels= dc.GetDeviceCaps(LOGPIXELSX);
	short yLogPixels= dc.GetDeviceCaps(LOGPIXELSY);
	//    那么 xLogPixels / yLogPixels  就应该表示了这个设备显示字体的比例了,通常应该是不变的
	
	// 3. 计算一个设备单位等于多少0.1mm (略)
	double scaleX = 254.0 / (double)GetDeviceCaps(dc.m_hAttribDC,LOGPIXELSX);
	double scaleY = 254.0 / (double)GetDeviceCaps(dc.m_hAttribDC, LOGPIXELSY);

MFC 文档中,设置缩放功能:

CEBCOMCtrlView 继承自 CScrollView
void CEBCOMCtrlView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
	CScrollView::OnPrepareDC(pDC, pInfo); // 必须是先执行!

	// todo....
	CEBCOMCtrlDoc* pDoc = (CEBCOMCtrlDoc *)GetDocument();

	pDC->SetMapMode(MM_ANISOTROPIC);              // 设置映射模式(x、y轴缩放比例不同,逻辑单位是任意长度)
	CSize DocSize = pDoc->GetDocSize();           // 获得文档尺寸
	pDC->SetWindowExt(DocSize);                   // 设置逻辑窗口大小(即画布大小不变,逻辑尺寸为 DocSize)

	// 计算每100个逻辑单位(即一个逻辑英寸)实际对应多少个像素												 
	int xLogPixels{ pDC->GetDeviceCaps(LOGPIXELSX) };
	int yLogPixels{ pDC->GetDeviceCaps(LOGPIXELSY) };

	// 如果 m_ZoomFactor = 1,下面式子则是计算 DocSize 的文档大小实际上的像素尺寸
	// 如果 m_ZoomFactor > 1,那文档就能映射到更大的像素窗口上,看上去就是放大了
	int xExtent{ (int)((DocSize.cx * m_ZoomFactor * xLogPixels) / 100) };
	int yExtent{ (int)((DocSize.cy * m_ZoomFactor * yLogPixels) / 100) };

	pDC->SetViewportExt(xExtent, yExtent);        // 设置像素窗口:即眼睛能够看到的视窗(不考虑显示器大小)
}
  • 总的来说是为了方便控制打印或重画时的控制, 如为了定制打印时,一般依据的是物理的长度,而不是像素,而DC一般是用像素的映射模式,所以需要一下转换,上面这个函数就为这种转换设计的.

  • HORZSIZE = 25.4 * HORZRES / LOGPIXELSX
    HORZSIZE为屏幕水平尺寸(定为度量尺寸,以mm计),
    HORZRES为水平的像素总数(定为像素大小,平时所说的屏幕分辨率,但在这不这么称呼。这里,分辨率定为“每英寸的像素数”),LOGPIXELSX为逻辑像素(假设的每英寸的像素数,并不是刚才所说的实际的“分辨率”)。因此HORZSIZE也称为逻辑宽度。

  • 当我们选择“显示”属性里的大字体时,LOGPIXELSX(通常分为96dpi与120dpi)变大了,这样假设原来的字体为10磅,则原来的字体横向所占像素(实际所占的像素数)为10*(1/72)*LOGPIXELSX,现在LOGPIXELSX变大了,则字体所占像素也大了,因此看起来字体大了。如果HORZRES不变的话,则HORZSIZE应该变小。然后这是和Windows有关的,在16位OS中,HORZSIZE值是固定的。
    在XP系统上验证了一下,发现HORZSIZE值与LOGPIXELSX的值也是不变的,如果改变HORZRES的话,则HORZSIZE会发生相应变化,但LOGPIXELSX不变,一直是96。

  • 当HORZRES/VERTRES分别为800/600、1280/1024、1360/768时,LOGPIXELSX/LOGPIXELSY一直为96,但HORZSIZE/VERTSIZE分别为320/240、375/300、400/320。于是个人断定:LOGPIXELSX/LOGPIXELSY与所选的字体(如TrueType)有关,windows默认的字体LOGPIXELSX/LOGPIXELSY值是定的,选大字体或小字体取它们的值都是一样的,而一些字体是不同的。而HORZSIZE/VERTSIZE与系统版本有关,在有的系统中,这两个值是适合此分辨率的标准显示器的尺寸(定值,长宽比与分辨率的比一样),不是通过公式计算的,也不等于公式计算的值;而有的系统版本这两个值为公式所得的值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值