如何在屏幕上画一条线,使得它在屏幕上显示出来的长度和预想的物理尺寸一样长

Cherishe7 2014-08-14 10:39:14
比如画10厘米的线,或矩形,使得它在屏幕上的显示就是10cm.
我用多重映射模式,都是不行的,大家又没办法画,因为我看过有些软件是确实画出来了,比如A4纸的大小,在屏幕上显示的尺寸和实际尺寸一致
...全文
477 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cherishe7 2014-08-20
  • 打赏
  • 举报
回复
引用 16 楼 BeanJoy 的回复:
[quote=引用 13 楼 chyun7290 的回复:] [quote=引用 10 楼 BeanJoy 的回复:] 参考一下: http://bbs.csdn.net/topics/320224150
这个帖子也没讨论出一个结果[/quote] 是没结果,就是想引用参考一下。 等着这个帖子看有没有结果,有结果了楼主写个例子上传分享下。[/quote]
引用 16 楼 BeanJoy 的回复:
[quote=引用 13 楼 chyun7290 的回复:] [quote=引用 10 楼 BeanJoy 的回复:] 参考一下: http://bbs.csdn.net/topics/320224150
这个帖子也没讨论出一个结果[/quote] 是没结果,就是想引用参考一下。 等着这个帖子看有没有结果,有结果了楼主写个例子上传分享下。[/quote] 我研究了一下一般使用GetDeviceCaps获取3种值,LOGPIXELSX,HORZSIZE和HORZRES,对于屏幕来说只有HORZRES一种情况是获取对的,其他两种参数都是错误,用其中两个算出的第3种是错误,但是打印机是正确的,这应该是因为打印机的DPI是固定的,可以拿到,但是屏幕的DPI获取的不是很准确。我找到了一段MSDN的解释不知道有没有用。 GetDeviceCaps reports info that the display driver provides. If the display driver declines to report any info, GetDeviceCaps calculates the info based on fixed calculations. If the display driver reports invalid info, GetDeviceCaps returns the invalid info. Also, if the display driver declines to report info, GetDeviceCaps might calculate incorrect info because it assumes either fixed DPI (96 DPI) or a fixed size (depending on the info that the display driver did and didn’t provide). Unfortunately, a display driver that is implemented to the Windows Display Driver Model (WDDM) (introduced in Windows Vista) causes GDI to not get the info, so GetDeviceCaps must always calculate the info.
BeanJoy 2014-08-16
  • 打赏
  • 举报
回复
引用 13 楼 chyun7290 的回复:
[quote=引用 10 楼 BeanJoy 的回复:] 参考一下: http://bbs.csdn.net/topics/320224150
这个帖子也没讨论出一个结果[/quote] 是没结果,就是想引用参考一下。 等着这个帖子看有没有结果,有结果了楼主写个例子上传分享下。
浩南_哥 2014-08-14
  • 打赏
  • 举报
回复
引用 6 楼 chyun7290 的回复:
[quote=引用 5 楼 lx624909677 的回复:] [quote=引用 3 楼 chyun7290 的回复:] [quote=引用 1 楼 lx624909677 的回复:] 屏幕上画线的单位是像素,你自己算算cm和像素的比值,就可以画了
还是有误差的。[/quote] 那只能说明在计算的过程中你的方法不准[/quote] 不是那么简单的事,要不你画画试试。[/quote] 把他的稍加改动就可以了

	int nScreenWidth, nScreenHeight;  
	HDC hdcScreen = GetDC(NULL);   //获取屏幕的HDC  
	nScreenWidth = GetDeviceCaps(hdcScreen, HORZRES);  \\获取当前屏幕的宽度(像素)
	nScreenHeight = GetDeviceCaps(hdcScreen, VERTRES);   \\获取当前屏幕的高度(像素)
        //DPI(每英寸含多少像素)
	int X = GetDeviceCaps(hdcScreen, LOGPIXELSX);//获取当前的DPI
	int Y = GetDeviceCaps(hdcScreen, LOGPIXELSY);//获取当前的DPI
	double InchX = (double)nScreenWidth / X;
	double InchY = (double)nScreenHeight / Y;
	const double MILLIMETRE_TO_INCH = 0.03937;  
	double MilliMetreX = InchX/MILLIMETRE_TO_INCH;//屏幕实际尺寸(毫米)
	double MilliMetreY = InchY/MILLIMETRE_TO_INCH;
  • 打赏
  • 举报
回复
这个问题不是方法的问题,而是可能不可能的问题。 我有一台电脑,在不移除显示器的情况下,又连接了投影仪,并且采用的是“复制”方式。显示器很小,投影仪很大,你确定有程序可以做到始终显示相同的物理长度??
Cherishe7 2014-08-14
  • 打赏
  • 举报
回复
引用 5 楼 lx624909677 的回复:
[quote=引用 3 楼 chyun7290 的回复:] [quote=引用 1 楼 lx624909677 的回复:] 屏幕上画线的单位是像素,你自己算算cm和像素的比值,就可以画了
还是有误差的。[/quote] 那只能说明在计算的过程中你的方法不准[/quote] 不是那么简单的事,要不你画画试试。
lx624909677 2014-08-14
  • 打赏
  • 举报
回复
引用 3 楼 chyun7290 的回复:
[quote=引用 1 楼 lx624909677 的回复:] 屏幕上画线的单位是像素,你自己算算cm和像素的比值,就可以画了
还是有误差的。[/quote] 那只能说明在计算的过程中你的方法不准
Cherishe7 2014-08-14
  • 打赏
  • 举报
回复
引用 2 楼 m617105 的回复:
http://blog.csdn.net/morewindows/article/details/8502592
回楼上,这篇文章是有误的,GetDeviceCaps无法获取屏幕的物理尺寸
Cherishe7 2014-08-14
  • 打赏
  • 举报
回复
引用 1 楼 lx624909677 的回复:
屏幕上画线的单位是像素,你自己算算cm和像素的比值,就可以画了
还是有误差的。
lx624909677 2014-08-14
  • 打赏
  • 举报
回复
屏幕上画线的单位是像素,你自己算算cm和像素的比值,就可以画了
浩南_哥 2014-08-14
  • 打赏
  • 举报
回复
引用 11 楼 chyun7290 的回复:
[quote=引用 8 楼 m617105 的回复:] [quote=引用 6 楼 chyun7290 的回复:] [quote=引用 5 楼 lx624909677 的回复:] [quote=引用 3 楼 chyun7290 的回复:] [quote=引用 1 楼 lx624909677 的回复:] 屏幕上画线的单位是像素,你自己算算cm和像素的比值,就可以画了
还是有误差的。[/quote] 那只能说明在计算的过程中你的方法不准[/quote] 不是那么简单的事,要不你画画试试。[/quote] 把他的稍加改动就可以了

	int nScreenWidth, nScreenHeight;  
	HDC hdcScreen = GetDC(NULL);   //获取屏幕的HDC  
	nScreenWidth = GetDeviceCaps(hdcScreen, HORZRES);  \\获取当前屏幕的宽度(像素)
	nScreenHeight = GetDeviceCaps(hdcScreen, VERTRES);   \\获取当前屏幕的高度(像素)
        //DPI(每英寸含多少像素)
	int X = GetDeviceCaps(hdcScreen, LOGPIXELSX);//获取当前的DPI
	int Y = GetDeviceCaps(hdcScreen, LOGPIXELSY);//获取当前的DPI
	double InchX = (double)nScreenWidth / X;
	double InchY = (double)nScreenHeight / Y;
	const double MILLIMETRE_TO_INCH = 0.03937;  
	double MilliMetreX = InchX/MILLIMETRE_TO_INCH;//屏幕实际尺寸(毫米)
	double MilliMetreY = InchY/MILLIMETRE_TO_INCH;
[/quote] 你确认一下这并不是屏幕实际尺寸,没有API能获取屏幕的物理尺寸[/quote] 可以获取EDID来获取显示器的尺寸。 一种方式是通过注册表。 另一种方式是通过驱动获取(API:VideoPortDDCMonitorHelper) 所以是有API可以获取显示器尺寸的。 下面这个帖子里面有相应的注册表路径,可以稍加改造获取尺寸,前提是先了解下注册表下EDID值怎么存储的。 获取显示器名称
schlafenhamster 2014-08-14
  • 打赏
  • 举报
回复
HORZSIZE 以毫米为单位的显示宽度 VERTSIZE 以毫米为单位的显示高度
Cherishe7 2014-08-14
  • 打赏
  • 举报
回复
引用 10 楼 BeanJoy 的回复:
参考一下: http://bbs.csdn.net/topics/320224150
这个帖子也没讨论出一个结果
Cherishe7 2014-08-14
  • 打赏
  • 举报
回复
还有
引用 9 楼 yinshi2006 的回复:
缺失重要信息,显示设备的DPI。 无此信息,无解。
扫描仪也是设备,为什么用其他映射模式(MM_LOMETRIC等)花在扫描以上,是和实际物理尺寸一致的。
Cherishe7 2014-08-14
  • 打赏
  • 举报
回复
引用 8 楼 m617105 的回复:
[quote=引用 6 楼 chyun7290 的回复:] [quote=引用 5 楼 lx624909677 的回复:] [quote=引用 3 楼 chyun7290 的回复:] [quote=引用 1 楼 lx624909677 的回复:] 屏幕上画线的单位是像素,你自己算算cm和像素的比值,就可以画了
还是有误差的。[/quote] 那只能说明在计算的过程中你的方法不准[/quote] 不是那么简单的事,要不你画画试试。[/quote] 把他的稍加改动就可以了

	int nScreenWidth, nScreenHeight;  
	HDC hdcScreen = GetDC(NULL);   //获取屏幕的HDC  
	nScreenWidth = GetDeviceCaps(hdcScreen, HORZRES);  \\获取当前屏幕的宽度(像素)
	nScreenHeight = GetDeviceCaps(hdcScreen, VERTRES);   \\获取当前屏幕的高度(像素)
        //DPI(每英寸含多少像素)
	int X = GetDeviceCaps(hdcScreen, LOGPIXELSX);//获取当前的DPI
	int Y = GetDeviceCaps(hdcScreen, LOGPIXELSY);//获取当前的DPI
	double InchX = (double)nScreenWidth / X;
	double InchY = (double)nScreenHeight / Y;
	const double MILLIMETRE_TO_INCH = 0.03937;  
	double MilliMetreX = InchX/MILLIMETRE_TO_INCH;//屏幕实际尺寸(毫米)
	double MilliMetreY = InchY/MILLIMETRE_TO_INCH;
[/quote] 你确认一下这并不是屏幕实际尺寸,没有API能获取屏幕的物理尺寸
BeanJoy 2014-08-14
  • 打赏
  • 举报
回复
参考一下: http://bbs.csdn.net/topics/320224150
yinshi2006 2014-08-14
  • 打赏
  • 举报
回复
缺失重要信息,显示设备的DPI。 无此信息,无解。

16,472

社区成员

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

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

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