代码之家  ›  专栏  ›  技术社区  ›  Naveen

屏幕像素分辨率(mm)

  •  5
  • Naveen  · 技术社区  · 15 年前

    编辑

    6 回复  |  直到 15 年前
        1
  •  8
  •   Elemental    15 年前

    HDC screen = GetDC(NULL);
    int hSize=GetDeviceCaps(screen,HORZSIZE);
    int hRes=GetDeviceCaps(screen,HORZRES);
    float PixelsPerMM=(float)hRes/hSize;   // pixels per millimeter
    float PixelsPerInch=PixelsPerMM*25.4; //dpi
    
        2
  •  4
  •   Clifford    13 年前

    Windows的默认值是72dpi,我发现有些应用程序(通常在其“关于”和对话框中)设置为其他值时无法正确渲染。如果您的应用程序报告0.34,那么它很可能被设置为72dpi或一个自定义值,而不管物理分辨率如何。当设置为匹配物理分辨率时,例如当设置为100%的缩放级别时,say Word中的页面宽度将与物理纸张大小匹配。用户无法直接设置实际分辨率。

        3
  •  2
  •   timday    15 年前

    在中编写“DPI感知”应用程序的部分 MSDN 对于任何有兴趣为可变显示分辨率提供体面支持的人来说,非常值得一读。描述了用于获取相关设备和系统度量的api here .

        4
  •  0
  •   Frerich Raabe    15 年前

    GetDC 函数获取监视器的句柄,然后调用 GetDeviceCaps

    HDC monitor = GetDC( NULL );
    int horizSize = GetDeviceCaps( monitor, HORZSIZE );
    int vertSize = GetDeviceCaps( monitor, VERTSIZE );
    
        5
  •  0
  •   MGR    12 年前

    下面的代码片段被证明提供了最好的结果。

    ID2D1Factory* m_pDirect2dFactory;
    D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pDirect2dFactory);
    FLOAT dpiX, dpiY;
    m_pDirect2dFactory->GetDesktopDpi( &dpiX, &dpiY );
    
        6
  •  0
  •   Ispas Claudiu    9 年前

    尝试不同的方法,但直到我找到这个答案才找到正确答案: http://ofekshilon.com/2011/11/13/reading-monitor-physical-dimensions-or-getting-the-edid-the-right-way/

    它适用于不同尺寸的屏幕!

    #include <atlstr.h>
    #include <SetupApi.h>
    #pragma comment(lib, "setupapi.lib")
    
    #define NAME_SIZE 128
    
    const GUID GUID_CLASS_MONITOR = {0x4d36e96e, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18};
    
    // Assumes hDevRegKey is valid
    bool GetMonitorSizeFromEDID(const HKEY hDevRegKey, short& WidthMm, short& HeightMm)
    {
        DWORD dwType, AcutalValueNameLength = NAME_SIZE;
        TCHAR valueName[NAME_SIZE];
    
        BYTE EDIDdata[1024];
        DWORD edidsize=sizeof(EDIDdata);
    
        for (LONG i = 0, retValue = ERROR_SUCCESS; retValue != ERROR_NO_MORE_ITEMS; ++i)
        {
            retValue = RegEnumValue ( hDevRegKey, i, &valueName[0],
                &AcutalValueNameLength, NULL, &dwType,
                EDIDdata, // buffer
                &edidsize); // buffer size
    
            if (retValue != ERROR_SUCCESS || 0 != _tcscmp(valueName,_T("EDID")))
                continue;
    
            WidthMm  = ((EDIDdata[68] & 0xF0) << 4) + EDIDdata[66];
            HeightMm = ((EDIDdata[68] & 0x0F) << 8) + EDIDdata[67];
    
            return true; // valid EDID found
        }
    
        return false; // EDID not found
    }
    
    bool GetSizeForDevID(const CString& TargetDevID, short& WidthMm, short& HeightMm)
    {
        HDEVINFO devInfo = SetupDiGetClassDevsEx(
            &GUID_CLASS_MONITOR, //class GUID
            NULL, //enumerator
            NULL, //HWND
            DIGCF_PRESENT, // Flags //DIGCF_ALLCLASSES|
            NULL, // device info, create a new one.
            NULL, // machine name, local machine
            NULL);// reserved
    
        if (NULL == devInfo)
            return false;
    
        bool bRes = false;
    
        for (ULONG i=0; ERROR_NO_MORE_ITEMS != GetLastError(); ++i)
        {
            SP_DEVINFO_DATA devInfoData;
            memset(&devInfoData,0,sizeof(devInfoData));
            devInfoData.cbSize = sizeof(devInfoData);
    
            if (SetupDiEnumDeviceInfo(devInfo,i,&devInfoData))
            {
                HKEY hDevRegKey = SetupDiOpenDevRegKey(devInfo,&devInfoData,
                    DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
    
                if(!hDevRegKey || (hDevRegKey == INVALID_HANDLE_VALUE))
                    continue;
    
                bRes = GetMonitorSizeFromEDID(hDevRegKey, WidthMm, HeightMm);
    
                RegCloseKey(hDevRegKey);
            }
        }
        SetupDiDestroyDeviceInfoList(devInfo);
        return bRes;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        short WidthMm, HeightMm;
    
        DISPLAY_DEVICE dd;
        dd.cb = sizeof(dd);
        DWORD dev = 0; // device index
        int id = 1; // monitor number, as used by Display Properties > Settings
    
        CString DeviceID;
        bool bFoundDevice = false;
        while (EnumDisplayDevices(0, dev, &dd, 0) && !bFoundDevice)
        {
            DISPLAY_DEVICE ddMon;
            ZeroMemory(&ddMon, sizeof(ddMon));
            ddMon.cb = sizeof(ddMon);
            DWORD devMon = 0;
    
            while (EnumDisplayDevices(dd.DeviceName, devMon, &ddMon, 0) && !bFoundDevice)
            {
                if (ddMon.StateFlags & DISPLAY_DEVICE_ACTIVE &&
                    !(ddMon.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER))
                {
                    DeviceID.Format (L"%s", ddMon.DeviceID);
                    DeviceID = DeviceID.Mid (8, DeviceID.Find (L"\\", 9) - 8);
    
                    bFoundDevice = GetSizeForDevID(DeviceID, WidthMm, HeightMm);
                }
                devMon++;
    
                ZeroMemory(&ddMon, sizeof(ddMon));
                ddMon.cb = sizeof(ddMon);
            }
    
            ZeroMemory(&dd, sizeof(dd));
            dd.cb = sizeof(dd);
            dev++;
        }
    
        return 0;
    }