Windows 10의 테마 컬러 얻기(C++) Lu's…〃 Programing。


<차례대로 설정 앱, 작업 표시줄의 시계를 누르면 나오는간이 앱, 시작 버튼을 나오는 UI>

 

Windows 8부터 테마 색이라는 생겼는데( 이전일 수도 있다), 이름 그대로 Windows 전반에서 색이 들어가는 곳에 통일된 색을 사용한다. 색을 어떻게 얻을까?

 

 

내가 찾은 방법은 UWP(UniversalWindows Platform) 사용하는 것이다.

UWP 코드는 Microsoft 확장 C++(C++/CLI C++/CX;현재 명칭) 또는 C#(권장)으로 구현되었기 때문에, nativeC++(C++/CLR)에서는 사용하지 못한다. 혹시라도 사용하는 방법이 있다면 댓글로 남겨주면 고맙겠다.

 

 

 

우선, 테마 색을 얻는 코드를 보자. MSDN C#으로 나온다. 

https://docs.microsoft.com/en-us/windows/uwp/style/color

 

코드를 보자.

 

void accentColorUpdated(FrameworkElementelementWithText)

{

    var uiSettings= new Windows.UI.ViewManagement.UISettings();

    Windows.UI.Color c =uiSettings.GetColorValue(UIColorType.Accent);

 

    bool colorIsDark= (5 * c.G + 2 * c.R + c.B) <= 8 * 128;

    if (colorIsDark)

    {

        elementWithText.RequestedTheme =ElementTheme.Light;

    }

    else

    {

        elementWithText.RequestedTheme =ElementTheme.Dark;

    }

}

 

Windows.UI.ViewManagement.UISettings 이라는 클래스가 있는데, 클래스의 인스턴스에서 GetColorValue 함수를 사용하니 색이 얻어진다고 한다. ...????? 이걸 어떻게 .

 

C++/CX 사용해본 사람은 알겠지만, 이걸 C++/CX 바꿀 있다.

 

다음은 핵심 코드 부분이다. 우리는 윈도우 테마 색을 얻으면 되기 때문에 C# 코드와는 내용이 다르다.

 

#include <roapi.h>

#include<rometadata.h>

#include <windows.ui.viewmanagement.h>

 

using namespace Windows::UI::ViewManagement;

 

Windows::UI::Color GetWindowsThemeColor()

{

    UISettings ui= ref new UISettings();

    Windows::UI::Color color = ui->GetColorValue(UIColorType::Accent);

    return color;
}

 

코드면 색이 얻어지는데, 유감스럽게도 C++/CLR에서 색을 얻고 싶은 사람들이 있을 것이다. 이럴 때는 가지 방법 하나를 택하면 된다.

 

  1. 참에 프로젝트를 C++/CX 짜볼까?
  2. 외부 라이브러리로 빼자!

 

 2 어려우니 1 선택했지만 웬걸, C++/CX 코드 써도 컴파일이 안된다. 어째서?

아직은 C++/CX 거지 Windows 10 API 아니다. C++/CX에서 Windows 10 API 쓰는 방법을 알아보자.

 

데스크톱 응용 프로그램에서 Windows 10 API 호출 - Windows 용 응용 프로그램 만들기 Windows 용 응용프로그램 빌드https://blogs.windows.com/buildingapps/2017/01/25/calling-windows-10-apis-desktop-application/

 

영어라고 슬퍼하지 말자. 구글 번역기로 거의 해석이 되는 수준이다.

 

핵심적인 내용만 뽑는다.

 

  1. 프로젝트 속성 > C/C++ > Windows 런타임 확장 사용 > (/ZW)
  2. 추가 using 디렉터리에 다음 값들을 추가한다. Visual Studio 2017 기준이고, 설치 경로를 바꿨으면 적절하게 변경해서 넣어주자.
    • C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcpackages
    • C:\Program Files (x86)\Windows Kits\10\UnionMetadata
    • C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.UniversalApiContract\1.0.0.0
    • C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.FoundationContract\1.0.0.0

 

  1. C/C++ > 코드 생성 > 최소 다시 빌드 가능 > 아니요(/Gm-)
  2. 프로젝트 속성 > 구성 속성 > 일반 > Windows SDK 버전을 Windows 10 버전으로 바꾼다. 시작이 10이면 어떤 버전이든 상관이 없다.

 

 여기서 커다란 문제가 생기는데, 별도로 Windows 10 SDK 설치하지 않은 사람들은 Windows 10 버전이 없을 것이다. 결국 이거 하나 때문에 Windows 10 SDK 깔아야 하나 고민을 하게 것인데, 사실 이거 하나 때문에 깔기에는 용량 부담이 크긴 하다. 깔고 있는 방법이 있다면 부디 댓글로 알려주길 바란다.

 

 여하튼, 여기까지 따라온 사람들은 코드 넣고 돌려보자. 아마 것이다.

 

 참조한 블로그에 들어가면(Windows 공식 블로그일 것이다) 예제 소스코드까지 해서 있으니 따라해보자





<위쪽이 내가 만든 시계 프로그램. Win32 응용프로그램이. 테마 색이 적용된 것을 있다>


PS.1 - 날짜 색깔은 AccentLight1이더라. 이거 못찾고 한참 헤맸다.
PS.2 - 참조 프로젝트를 C++/CX 프로젝트로 만들고 외부에서 사용하는 방식으로 C++/CLR 프로젝트에서 사용할 수 있다.
[Visual Studio] 참조 프로젝트를 만들어보자 | http://lusain.egloos.com/3163505




덧글

  • ㅇㅇ 2017/08/31 19:20 # 삭제 답글

    테마컬러는 윈도 95때부터 생겼습니다 ^^
  • 루사인。 2017/09/01 14:23 #

    헉...! 그런데 지금처럼 다른 프로그램에서 색을 확인할 수 없지 않나요? 혹시 있다면 방법을...
댓글 입력 영역