Lyn
조회 수 3601 추천 수 0 댓글 0
Atachment
첨부 '4'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

네. 요즘 고해상도 디스플레이(맥북 프로 레티나 라거나, 4K 모니터 라거나, 아니면 Razer Blade나 Aorus X3 Plus 같은) 디바이스가 꽤 늘어 났습니다.

이런놈들 말이죠


dpi3.png


dpi4.png






하지만 윈도는 고해상도 지원 꽤 느린편이어서 Vista 부터 일단 지원은 햇지만 거의 쓰이지 않았고 본격적인 지원은 역시 8 부터라고 보이는데요. 뭐 사실 윈도 7이 나온 2009년보다도 한참 지난 2012년 맥북 프로 레티나 부터 PC/랩탑용 고해상도 디스플레이가 등장 했으니 그러려니 합니다.


어쨋든 중요한건 이제 저런 장비를 쓰는 사람들도 있고 하니 고 DPI 지원을 해야 한다는거겠지요.
그러려면 DPI 를 가져와야 하는데 그 방법중 하나인 Direct2D 를 이용한 방법을 간단히 정리 해 둡니다.


개발자 답게 코드부터 보자면 

#include <iostream>
#include <D2d1.h>

using namespace std;

#pragma comment(lib, "D2d1.lib")

void wmain()
{
    ID2D1Factory* pD2DFactory = nullptr;
    if (SUCCEEDED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory)))
    {
        float dpix, dpiy;
        pD2DFactory->ReloadSystemMetrics();
        pD2DFactory->GetDesktopDpi(&dpix, &dpiy);
        pD2DFactory->Release();

        wcout << L"X : " << dpix << endl << L"Y : " << dpiy << endl;
    }
    else
    {
        wcout << L"Direct 2D Create Error";
    }    
}

라는 대단히 심플 한 코드로 가져올 수 있습니다.

D2D 팩토리를 생성후 ReloadSystemMetrics 호출 후 GetDesktopDpi 를 통해서 가져오는 매우 심플한 방식인데, ReloadSystemMetrics  를 하지 않으면 팩토리 생성 후 변화된 Dpi 설정을 가져오지 못합니다(내부에서 캐시하는듯)


dpi1.png




위와 같은 실행 결과가 나옵니다. 윈도우의 기본 DPI(100%) 값은 96 으로서 이는 23인치 FullHD에 맞도록 세팅 된 값입니다(사실 "현재까지 쓰인 일반적인" 모니터의 크기와 해상도라면 대부분 매칭 됩니다. 17인치 1280*1024 도 96DPI 입니다)

그럼 125%로 바꿔서 한번 테스트 해 보겠습니다.

dpi2.png


 

네. 96 * 1.25 = 120 이니까 정확히 나오네요.

 

당연하겠지만 Direct2D 를 사용 한 방식이므로 Windows Vista Sp2 or Higher 를 요구합니다.

TAG •
?

List of Articles
번호 제목 글쓴이 날짜 조회 수
97 Disable Windows 10 Device Driver Automatic Update Lyn 2015.08.25 2324
96 만약 사정상 Windows 10 자동 업데이트를 꺼야 한다면 설치해야 할 패치 Lyn 2015.07.22 2386
95 잠시후 한국시각 21일 0시부터 VS 2015 런칭행사를 합니다. Lyn 2015.07.21 2258
94 VS2015 가 7월 20일 출시됩니다. Lyn 2015.06.30 2093
93 Windows 의 버전별 DPI 변경 차이 Lyn 2015.06.30 3445
92 폰트 TTF와 OTF 그 역사의 아이러니함. Lyn 2015.06.30 2808
91 Resharper C++ 사용기 - 1 file Lyn 2015.04.20 5043
90 Resharper C++ 정식버전이 떳습니다. Lyn 2015.04.11 3155
89 C++ 에서 Nuget 사용해 보기 file Lyn 2015.03.18 10658
88 MFC DLL의 InitInstance 와 ExitInstance 에서 하면 안되는 것 Lyn 2015.03.06 4244
87 오랫만에 서버 업데이트... 인데 Lyn 2015.03.03 5753
86 Android android.os.NetworkOnMainThreadException Lyn 2015.02.15 3227
85 Android Studio Gradle Error:Execution failed for task ':app:packageDebug'. > Duplicate files copied in 오류 해결 Lyn 2015.02.12 7013
84 C++ 에서 타 언어의 try-finally 흉내내기 1 file Lyn 2015.01.05 5642
» Get windows dpi setting using Direct 2D file Lyn 2015.01.05 3601
82 네... 오늘 그날입니다 그날 Lyn 2014.12.10 52301
81 VS 2013 커뮤니티 에디션이 출시되었습니다. Lyn 2014.11.13 13167
80 VS2015 Preview가 출시 되었습니다. Lyn 2014.11.13 64564
79 Windows 용 Redis 설치하기 (from nuget) file Lyn 2014.11.12 46932
78 VMWare 의 메모리 오류 해결 버전이 나왔습니다 file Lyn 2014.11.06 18567
Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8