获取屏幕大小第三篇 物理大小GetDeviceCaps 下

原文地址:http://blog.csdn.net/morewindows/article/details/8610891

本篇文章(MoreWindows)将获取屏幕的物理大小后计算屏幕对角线长度并换算成英寸。这样可以方便大家查看自己电脑屏幕是多少英寸的。为了更方便大家使用,本文将提供电脑屏幕大小查看器下载(配源码)下载地址是(欢迎大家试用):http://download.csdn.net/detail/morewindows/5106270

 

    通常大家在表示电脑、电视、手机等电子产品的屏幕大小时会使用英寸这一长度单位来描述。要注意的一点时,英寸在描述电脑、电视、手机等电子产品的屏幕大小时是指屏幕的对角线长度。

    英寸(inch,缩写为in.)在荷兰语中的本意是大拇指,一英寸就是一节大拇指的长度。当然人的大拇指的长度也是长短不一的。14世纪时,英皇爱德华二世颁布了“标准合法英寸”。其规定为:从大麦穗中间选择三粒最大的麦粒并依次排成一行的长度就是一英寸。

英寸与毫米的换算关系为:

          1英寸 = 25.4毫米

          1毫米 =0.03937英寸

http://blog.csdn.net/morewindows/article/details/8610891

 

    根据这一换算公式,可以改写下《VC++获取屏幕大小第二篇物理大小GetDeviceCaps 上》中的代码,让其直接计算出屏幕是多少英寸的。改写后的代码如下:

    // 获取屏幕大小 物理大小  
    #include <stdio.h>  
    #include <conio.h>  
    #include <math.h>  
    #include <windows.h>  
    int main()  
    {  
        printf("    获取屏幕大小 物理大小\n");          
        printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");     
          
        int nScreenWidth, nScreenHeight;  
        HDC hdcScreen = GetDC(NULL);   //获取屏幕的HDC  
        nScreenWidth = GetDeviceCaps(hdcScreen, HORZSIZE);  
        nScreenHeight = GetDeviceCaps(hdcScreen, VERTSIZE);  
          
        printf("屏幕大小(毫米) 宽:%d 高:%d\n", nScreenWidth, nScreenHeight);  
        printf("    下面将屏幕大小由毫米换算到英寸\n");  
        const double MILLIMETRE_TO_INCH = 0.03937;  
        double fDiagonalLen = sqrt(nScreenHeight * nScreenHeight + nScreenWidth * nScreenWidth);  
        printf("屏幕对角线长为:%.2lf毫米 约 %.2lf英寸\n", fDiagonalLen, fDiagonalLen * MILLIMETRE_TO_INCH);  
        getch();  
        return 0;  
    }  
运行结果如下:

获取屏幕大小第三篇 物理大小GetDeviceCaps 下_第1张图片

呵呵,本人笔记本的屏幕大小是13.64英寸即商家所称的14英寸笔记本。


根据这份代码可以发布个小程序,供其它人用来查看电脑屏幕大小。可惜由于GetDeviceCaps函数的限制,在Win7系统下该程序检测结果不准确,WinXP系统下基本上可以正确运行。

电脑屏幕大小查看器的下载地址为(附源码):http://download.csdn.net/detail/morewindows/5106270


附上Himetric尺寸与像素尺寸的转换关系,以IPicture加载图片为例,IPicture::get_Width和IPicture::get_Height获取是Himetric尺寸,要转换成像素尺寸,代码如下:

                ...... // 前面的代码省略

		// don't delete memory on object's release
		if (CreateStreamOnHGlobal(hGlobal,FALSE,&pStream) != S_OK)
			return FALSE;

		if (OleLoadPicture(pStream,dwSize,FALSE,IID_IPicture,
			reinterpret_cast<LPVOID *>(&m_pPicture)) != S_OK)
		{
			pStream->Release();
			return FALSE;
		};
		pStream->Release();

		// store picture's size

		// 下面获取的长度为himetric长度,1himetric = 0.01mm
		long hmWidth;
		long hmHeight;
		m_pPicture->get_Width(&hmWidth);
		m_pPicture->get_Height(&hmHeight);

		// 需要将himetric长度转换成pixel长度,1英寸 = 25.4mm
		// GetDeviceCaps(LOGPIXELSX)获取的是每英寸的像素点个数
		// 英寸长度 = (himetric长度 / 100)(mm,毫米)/25.4 = himetric长度 / 2540
		// 像素长度 = 英寸长度 * 每英寸的像素点个数
		HDC hDC = ::GetDC(m_hWnd);
		m_PictureSize.cx = MulDiv(hmWidth, GetDeviceCaps(hDC,LOGPIXELSX), 2540);
		m_PictureSize.cy = MulDiv(hmHeight, GetDeviceCaps(hDC,LOGPIXELSY), 2540);
		::ReleaseDC(m_hWnd,hDC);

你可能感兴趣的:(获取屏幕大小第三篇 物理大小GetDeviceCaps 下)