Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
Bazaar
Status & Roadmap
FAQ
Authors & License
Forums
Funding Ultimate++
Search on this site
Search in forums












SourceForge.net Logo
Home » Developing U++ » U++ Developers corner » DarkTheme support
Re: Please check the list of 2019.1 changes [message #51156 is a reply to message #51155] Tue, 12 February 2019 12:44 Go to previous messageGo to previous message
Tom1
Messages: 1212
Registered: March 2007
Senior Contributor
Hi,

I composed some code to pick up the Windows 10 light/dark theme and accent/colorization colors:

bool IsSystemThemeDark(){
#ifdef WIN32
    HKEY	SWKey;
    HKEY	MSKey;
    HKEY	WINKey;
    HKEY	CVKey;
    HKEY	ThemesKey;
    HKEY	PersonalizeKey;
    
    LONG	Status;
	bool	darkTheme=false;

    Status = RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("Software"),0,KEY_READ,&SWKey);
    if(Status == ERROR_SUCCESS){
		Status = RegOpenKeyEx(SWKey,TEXT("Microsoft"),0,KEY_READ,&MSKey);
	    if(Status == ERROR_SUCCESS){
			Status = RegOpenKeyEx(MSKey,TEXT("Windows"),0,KEY_READ,&WINKey);
			if(Status == ERROR_SUCCESS){
				Status = RegOpenKeyEx(WINKey,TEXT("CurrentVersion"),0,KEY_READ,&CVKey);
				if(Status == ERROR_SUCCESS){
					Status = RegOpenKeyEx(CVKey,TEXT("Themes"),0,KEY_READ,&ThemesKey);
					if(Status == ERROR_SUCCESS){
						Status = RegOpenKeyEx(ThemesKey,TEXT("Personalize"),0,KEY_READ,&PersonalizeKey);
						if(Status == ERROR_SUCCESS){
						    DWORD RegType;
						    DWORD BufferSize=16;
						    char pStr[16];
							
					        Status=RegQueryValueEx(PersonalizeKey,TEXT("AppsUseLightTheme"),NULL,&RegType,(LPBYTE)pStr,&BufferSize);
					        if(Status == ERROR_SUCCESS) if((*(DWORD*)pStr)==0) darkTheme=true;
					        RegCloseKey(PersonalizeKey);
						}
						RegCloseKey(ThemesKey);
					}
					RegCloseKey(CVKey);
				}
				RegCloseKey(WINKey);
			}
			RegCloseKey(MSKey);
	    }
	    RegCloseKey(SWKey);
    }
    if(Status == ERROR_SUCCESS) return darkTheme;
#endif

	// Generic solution for GTK and older Windows
    Color paper=SColorPaper();

    if(paper.GetR()<128 && paper.GetG()<128 && paper.GetB()<128) return true; // Dark background
    return false;
}

RGBA GetSystemColorizationColor(){
	RGBA	color=Gray(); // Default
	
#ifdef WIN32
    HKEY	SWKey;
    HKEY	MSKey;
    HKEY	WINKey;
    HKEY	DWMKey;
    
    LONG	Status;
	
	// "Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM"

    Status = RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("Software"),0,KEY_READ,&SWKey);
    if(Status == ERROR_SUCCESS){
		Status = RegOpenKeyEx(SWKey,TEXT("Microsoft"),0,KEY_READ,&MSKey);
	    if(Status == ERROR_SUCCESS){
			Status = RegOpenKeyEx(MSKey,TEXT("Windows"),0,KEY_READ,&WINKey);
			if(Status == ERROR_SUCCESS){
				Status = RegOpenKeyEx(WINKey,TEXT("DWM"),0,KEY_READ,&DWMKey);
				if(Status == ERROR_SUCCESS){
				    DWORD RegType;
				    DWORD BufferSize=16;
				    char pStr[16];
					
			        Status=RegQueryValueEx(DWMKey,TEXT("ColorizationColor"),NULL,&RegType,(LPBYTE)pStr,&BufferSize);
			        
			        if(Status == ERROR_SUCCESS) color=(*(RGBA*)pStr);
			        
					RegCloseKey(DWMKey);
				}
				RegCloseKey(WINKey);
			}
			RegCloseKey(MSKey);
	    }
	    RegCloseKey(SWKey);
    }
    if(Status == ERROR_SUCCESS) return color; // Success
    
#endif
	// TODO solve other sources
	
	return color; // Default
}

RGBA GetSystemAccentColor(){
	RGBA	color=Gray(); // Default
	
#ifdef WIN32
    HKEY	SWKey;
    HKEY	MSKey;
    HKEY	WINKey;
    HKEY	DWMKey;
    
    LONG	Status;
	
	// "Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM"

    Status = RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("Software"),0,KEY_READ,&SWKey);
    if(Status == ERROR_SUCCESS){
		Status = RegOpenKeyEx(SWKey,TEXT("Microsoft"),0,KEY_READ,&MSKey);
	    if(Status == ERROR_SUCCESS){
			Status = RegOpenKeyEx(MSKey,TEXT("Windows"),0,KEY_READ,&WINKey);
			if(Status == ERROR_SUCCESS){
				Status = RegOpenKeyEx(WINKey,TEXT("DWM"),0,KEY_READ,&DWMKey);
				if(Status == ERROR_SUCCESS){
				    DWORD RegType;
				    DWORD BufferSize=16;
				    char pStr[16];
					
			        Status=RegQueryValueEx(DWMKey,TEXT("AccentColor"),NULL,&RegType,(LPBYTE)pStr,&BufferSize);
			        
			        if(Status == ERROR_SUCCESS) color=(*(RGBA*)pStr);
			        
					RegCloseKey(DWMKey);
				}
				RegCloseKey(WINKey);
			}
			RegCloseKey(MSKey);
	    }
	    RegCloseKey(SWKey);
    }
    if(Status == ERROR_SUCCESS) return color; // Success
    
#endif
	// TODO solve other sources
	
	return color; // Default
}


At least this works on relatively current Windows 10, but I do not know how to make U++ tune its colors along these colors, so I'll just drop this here.

Best regards,

Tom

[Updated on: Tue, 12 February 2019 12:45]

Report message to a moderator

 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: Please check the list of 2019.1 changes
Next Topic: Getting hands dirty with Win32 TLS
Goto Forum:
  


Current Time: Wed Apr 24 08:59:20 CEST 2024

Total time taken to generate the page: 0.02181 seconds