[c++] شاشة بكسل القرار في مم


Answers

0.3472222222222222 مم لكل بكسل هو في الواقع يعادل ما يقرب من 73 نقطة في البوصة. يستخدم ويندوز اثنين من الإعدادات القياسية 72dpi و 96dpi، ولكن يتم دعم القيم المخصصة أيضا. هذه هي القيم الاسمية وقد لا تحمل أي علاقة إلى الشاشة المادية. على سبيل المثال فمن الممكن أن يكون جسديا 96dpi تعيين الشاشة إلى 72dpi، وهذا سوف يؤثر على توسيع نطاق الصور والتخطيط في مختلف التطبيقات، فضلا عن حجم الخطوط النظام والرموز.

الافتراضي ل ويندوز هو 72dpi، ولقد وجدت أن بعض التطبيقات (في كثير من الأحيان في "حول" ومربعات الحوار) لا تجعل بشكل صحيح عند تعيين إلى قيم أخرى. إذا كان التطبيق الخاص بك تقارير 0.34، يبدو من المرجح أن يتم تعيين إلى 72dpi أو قيمة مخصصة بغض النظر عن قرار المادية. عند تعيين لتتناسب مع الدقة الفعلية، فإن عرض الصفحة في ورد ورد على سبيل المثال عند تعيين إلى مستوى التكبير من 100٪ تطابق حجم الورق الفعلي. وبما أنه يمكن تعيين هذا المقياس بواسطة المستخدم النهائي، فإنه لا يرتبط مباشرة بالقرار الفعلي.

Question

هل من الممكن الحصول على دقة بكسل الشاشة في مم باستخدام واجهات برمجة التطبيقات Win32؟ لدي تطبيق الذي يظهر 0.347222222222222 كقيمة لهذا على بلدي 1280x1024 رصد مع 96 نقطة في البوصة. ولكن أنا لست قادرا على معرفة كيف حصلت على هذه القيمة. أي أدلة سوف تكون مفيدة. يمكنني استخدام مفك أيضا إذا لزم الأمر.

إديت آسف للارتباك، البرنامج الذي أتحدث عنه لم يكن يستخدم دقة الشاشة الحالية. كان يقرأها من بعض ملف التكوين.




ثبت مقتطف الشفرة أدناه لتقديم أفضل نتيجة.

ID2D1Factory* m_pDirect2dFactory;
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pDirect2dFactory);
FLOAT dpiX, dpiY;
m_pDirect2dFactory->GetDesktopDpi( &dpiX, &dpiY );



كان لي أيضا مشاكل مماثلة على ويندوز 7 ومحاولة نهج مختلفة ولكن لم يتمكن من العثور على الجواب الصحيح حتى وجدت هذا: http://ofekshilon.com/2011/11/13/reading-monitor-physical-dimensions-or-getting -The-EDID-على اليمين في اتجاه و/

وهو يعمل بالنسبة لي لأحجام الشاشة المختلفة!

#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;
}





Links



Tags

c++ c++   c   mfc   winapi