diff --git a/MusicPlayer2/AppearanceSettingDlg.cpp b/MusicPlayer2/AppearanceSettingDlg.cpp index 220ed428..48e72063 100644 --- a/MusicPlayer2/AppearanceSettingDlg.cpp +++ b/MusicPlayer2/AppearanceSettingDlg.cpp @@ -172,7 +172,7 @@ BOOL CAppearanceSettingDlg::OnInitDialog() #ifdef COMPILE_IN_WIN_XP m_follow_system_color_check.EnableWindow(FALSE); #else - if (IsWindows8OrGreater()) + if (theApp.m_win_version.IsWindows8OrLater()) m_follow_system_color_check.SetCheck(m_data.theme_color_follow_system); else m_follow_system_color_check.EnableWindow(FALSE); //Win8以下系统禁用此复选按钮 diff --git a/MusicPlayer2/Common.cpp b/MusicPlayer2/Common.cpp index 5359154e..ccda15db 100644 --- a/MusicPlayer2/Common.cpp +++ b/MusicPlayer2/Common.cpp @@ -416,60 +416,6 @@ int CCommon::GetListWidth(CListBox & list) return nMaxExtent; } -//void CCommon::FillStaticColor(CStatic & static_ctr, COLORREF color) -//{ -// CDC* pDC = static_ctr.GetDC(); -// CRect rect; -// static_ctr.GetClientRect(&rect); -// CBrush BGBrush, *pOldBrush; -// BGBrush.CreateSolidBrush(color); -// pOldBrush = pDC->SelectObject(&BGBrush); -// pDC->FillRect(&rect, &BGBrush); -// pDC->SelectObject(pOldBrush); -// BGBrush.DeleteObject(); -//} - -//COLORREF CCommon::ConvertToItemColor(COLORREF color) -//{ -// int r, g, b, l; -// int r1, g1, b1, l1; -// r = GetRValue(color); -// g = GetGValue(color); -// b = GetBValue(color); -// l = ((r * 299) + (g * 587) + (b * 114)) / 1000; //计算亮度值 -// if (l == 0) return color; -// -// l1 = (l - 80)*3 / 5 + 80; //计算新亮度 -// r1 = r * l1 / l; -// g1 = g * l1 / l; -// b1 = b * l1 / l; -// return RGB(r1, g1, b1); -//} - - -bool CCommon::IsWindows10OrLater() -{ -#ifdef COMPILE_IN_WIN_XP - return false; -#else - DWORD dwMajorVer{}, dwMinorVer{}, dwBuildNumber{}; - HMODULE hModNtdll{}; - if (hModNtdll = ::LoadLibraryW(L"ntdll.dll")) - { - typedef void (WINAPI *pfRTLGETNTVERSIONNUMBERS)(DWORD*, DWORD*, DWORD*); - pfRTLGETNTVERSIONNUMBERS pfRtlGetNtVersionNumbers; - pfRtlGetNtVersionNumbers = (pfRTLGETNTVERSIONNUMBERS)::GetProcAddress(hModNtdll, "RtlGetNtVersionNumbers"); - if (pfRtlGetNtVersionNumbers) - { - pfRtlGetNtVersionNumbers(&dwMajorVer, &dwMinorVer, &dwBuildNumber); - dwBuildNumber &= 0x0ffff; - } - ::FreeLibrary(hModNtdll); - hModNtdll = NULL; - } - return (dwMajorVer >= 10u); -#endif -} int CCommon::DeleteAFile(HWND hwnd, _tstring file) { diff --git a/MusicPlayer2/Common.h b/MusicPlayer2/Common.h index b1c4e05b..99bd4391 100644 --- a/MusicPlayer2/Common.h +++ b/MusicPlayer2/Common.h @@ -121,11 +121,6 @@ public: //获取一个列表控件最大长度项目宽度的像素值 static int GetListWidth(CListBox& list); - //判断当前操作系统是否是Windows10或以上版本 - //VersionHelper中的函数无法判断Windows8.1和Windows10, - //这个函数调用了RtlGetNtVersionNumbers获取系统版本信息 - static bool IsWindows10OrLater(); - //删除一个文件 static int DeleteAFile(HWND hwnd, _tstring file); //删除多个文件 diff --git a/MusicPlayer2/MusicPlayer2.cpp b/MusicPlayer2/MusicPlayer2.cpp index 2bd80097..c183cc97 100644 --- a/MusicPlayer2/MusicPlayer2.cpp +++ b/MusicPlayer2/MusicPlayer2.cpp @@ -112,9 +112,6 @@ BOOL CMusicPlayerApp::InitInstance() LoadSongData(); LoadConfig(); - //判断当前操作系统是否是Windows10。结果储存在CMusicPlayerApp类中的成员变量中,以便在全局范围内可访问 - m_is_windows10 = CCommon::IsWindows10OrLater(); - //启动时检查更新 if (m_general_setting_data.check_update_when_start) { diff --git a/MusicPlayer2/MusicPlayer2.h b/MusicPlayer2/MusicPlayer2.h index dfa7e14f..39d73cfe 100644 --- a/MusicPlayer2/MusicPlayer2.h +++ b/MusicPlayer2/MusicPlayer2.h @@ -14,6 +14,7 @@ #include "ColorConvert.h" #include "DrawCommon.h" #include "IniHelper.h" +#include "WinVersionHelper.h" //选项设置数据 struct PlaySettingData @@ -79,7 +80,7 @@ public: CMusicPlayerApp(); int m_dpi; - bool m_is_windows10; //当前系统是否是Windows10 + CWinVersionHelper m_win_version; //当前Windows的版本 CPlayer m_player; wstring m_module_dir; //当前程序exe文件所在目录 diff --git a/MusicPlayer2/MusicPlayer2.vcxproj b/MusicPlayer2/MusicPlayer2.vcxproj index 7d91030d..b883d341 100644 --- a/MusicPlayer2/MusicPlayer2.vcxproj +++ b/MusicPlayer2/MusicPlayer2.vcxproj @@ -200,6 +200,7 @@ + @@ -252,6 +253,7 @@ + diff --git a/MusicPlayer2/MusicPlayer2.vcxproj.filters b/MusicPlayer2/MusicPlayer2.vcxproj.filters index 2fb1a5af..9be85bd4 100644 --- a/MusicPlayer2/MusicPlayer2.vcxproj.filters +++ b/MusicPlayer2/MusicPlayer2.vcxproj.filters @@ -144,6 +144,9 @@ {42734b69-66a6-4f02-b9f2-8c4675336e95} + + {a08082b3-9202-4b64-9941-d4ff6059ae9b} + @@ -303,6 +306,9 @@ 澶存枃浠跺拰婧愭枃浠禱鍏叡鐨勭被\IniHelper + + 澶存枃浠跺拰婧愭枃浠禱鍏叡鐨勭被\WinVersionHelper + @@ -446,6 +452,9 @@ 澶存枃浠跺拰婧愭枃浠禱鍏叡鐨勭被\IniHelper + + 澶存枃浠跺拰婧愭枃浠禱鍏叡鐨勭被\WinVersionHelper + diff --git a/MusicPlayer2/MusicPlayerDlg.cpp b/MusicPlayer2/MusicPlayerDlg.cpp index 41500aa1..9d379fb4 100644 --- a/MusicPlayer2/MusicPlayerDlg.cpp +++ b/MusicPlayer2/MusicPlayerDlg.cpp @@ -1113,14 +1113,14 @@ BOOL CMusicPlayerDlg::OnInitDialog() #ifdef COMPILE_IN_WIN_XP theApp.m_app_setting_data.theme_color_follow_system = false; #else - if (!IsWindows8OrGreater()) + if (!theApp.m_win_version.IsWindows8OrLater()) theApp.m_app_setting_data.theme_color_follow_system = false; #endif //只有Win10以上的系统才能在Cortana搜索框中显示歌词 - if (!theApp.m_is_windows10) + if (!theApp.m_win_version.IsWindows10OrLater()) theApp.m_play_setting_data.show_lyric_in_cortana = false; - m_cortana_lyric.SetEnable(theApp.m_is_windows10); + m_cortana_lyric.SetEnable(theApp.m_win_version.IsWindows10OrLater()); //设置窗口不透明度 SetTransparency(); @@ -1574,7 +1574,7 @@ void CMusicPlayerDlg::OnTimer(UINT_PTR nIDEvent) COLORREF color; //如果系统是Win10就取窗口最边缘像素的颜色,因为当win10设置成不显示标题栏颜色时,只有窗口边框最外面的一圈像素是主题颜色 //如果系统是Win8/8.1,则取窗口边缘住下2个像素的颜色,因为win8窗口标题栏总是当前主题色,而边框最外侧的颜色比主题色要深。 - if (theApp.m_is_windows10) + if (theApp.m_win_version.IsWindows10OrLater()) color = ::GetPixel(hDC, rect.TopLeft().x + DPI(8), rect.TopLeft().y); else color = ::GetPixel(hDC, rect.TopLeft().x + DPI(8), rect.TopLeft().y + DPI(2)); diff --git a/MusicPlayer2/PlaySettingsDlg.cpp b/MusicPlayer2/PlaySettingsDlg.cpp index 9c449082..dc442800 100644 --- a/MusicPlayer2/PlaySettingsDlg.cpp +++ b/MusicPlayer2/PlaySettingsDlg.cpp @@ -71,7 +71,7 @@ BOOL CPlaySettingsDlg::OnInitDialog() m_show_album_cover_in_cortana_check.SetCheck(m_data.cortana_show_album_cover); m_cortana_icon_beat_check.SetCheck(m_data.cortana_icon_beat); //m_cortana_icon_beat_check.EnableWindow(!m_data.cortana_show_album_cover); - if (theApp.m_is_windows10) + if (theApp.m_win_version.IsWindows10OrLater()) { m_show_lyric_in_cortana_check.SetCheck(m_data.show_lyric_in_cortana); } diff --git a/MusicPlayer2/ProgressStatic.cpp b/MusicPlayer2/ProgressStatic.cpp index b0da1e40..d5128f8d 100644 --- a/MusicPlayer2/ProgressStatic.cpp +++ b/MusicPlayer2/ProgressStatic.cpp @@ -82,9 +82,9 @@ void CProgressStatic::OnPaint() this->GetClientRect(&rect); int max_length = rect.Width(); - //由于非windows10时为主窗口设置了WS_CLIPCHILDREN属性,所以这里需要手动重绘控件区域 - if (!theApp.m_is_windows10) - DrawThemeParentBackground(m_hWnd, dc.GetSafeHdc(), &rect); //重绘控件区域 + ////由于非windows10时为主窗口设置了WS_CLIPCHILDREN属性,所以这里需要手动重绘控件区域 + //if (!theApp.m_win_version.IsWindows10OrLater()) + // DrawThemeParentBackground(m_hWnd, dc.GetSafeHdc(), &rect); //重绘控件区域 //将矩形的高度更改为进度条显示的高度 if (m_progress_height < rect.Height() && m_progress_height > 0) diff --git a/MusicPlayer2/WinVersionHelper.cpp b/MusicPlayer2/WinVersionHelper.cpp new file mode 100644 index 00000000..43e7359b --- /dev/null +++ b/MusicPlayer2/WinVersionHelper.cpp @@ -0,0 +1,65 @@ +#include "stdafx.h" +#include "WinVersionHelper.h" + + +CWinVersionHelper::CWinVersionHelper() +{ + DWORD dwMajorVer{}, dwMinorVer{}, dwBuildNumber{}; + HMODULE hModNtdll{}; + if (hModNtdll = ::LoadLibraryW(L"ntdll.dll")) + { + typedef void (WINAPI *pfRTLGETNTVERSIONNUMBERS)(DWORD*, DWORD*, DWORD*); + pfRTLGETNTVERSIONNUMBERS pfRtlGetNtVersionNumbers; + pfRtlGetNtVersionNumbers = (pfRTLGETNTVERSIONNUMBERS)::GetProcAddress(hModNtdll, "RtlGetNtVersionNumbers"); + if (pfRtlGetNtVersionNumbers) + { + pfRtlGetNtVersionNumbers(&dwMajorVer, &dwMinorVer, &dwBuildNumber); + dwBuildNumber &= 0x0ffff; + } + ::FreeLibrary(hModNtdll); + hModNtdll = NULL; + } + m_major_version = dwMajorVer; + m_minor_version = dwMinorVer; + m_build_number = dwBuildNumber; +} + + +CWinVersionHelper::~CWinVersionHelper() +{ +} + +bool CWinVersionHelper::IsWindows10FallCreatorOrLater() const +{ + if (m_major_version > 10) + return true; + else if (m_major_version == 10 && m_minor_version > 0) + return true; + else if (m_major_version == 10 && m_minor_version == 0 && m_build_number >= 16299) + return true; + else return false; +} + +bool CWinVersionHelper::IsWindows7() const +{ + return (m_major_version == 6 && m_minor_version == 1); +} + +bool CWinVersionHelper::IsWindows8Or8point1() const +{ + return (m_major_version == 6 && m_minor_version > 1); +} + +bool CWinVersionHelper::IsWindows8OrLater() const +{ + if (m_major_version > 6) + return true; + else if (m_major_version == 6 && m_minor_version > 1) + return true; + else return false; +} + +bool CWinVersionHelper::IsWindows10OrLater() const +{ + return (m_major_version >= 10); +} diff --git a/MusicPlayer2/WinVersionHelper.h b/MusicPlayer2/WinVersionHelper.h new file mode 100644 index 00000000..6f3d522a --- /dev/null +++ b/MusicPlayer2/WinVersionHelper.h @@ -0,0 +1,22 @@ +#pragma once +class CWinVersionHelper +{ +public: + CWinVersionHelper(); + ~CWinVersionHelper(); + + bool IsWindows10FallCreatorOrLater() const; //判断当前Windows版本是否为Win10秋季创意者更新或更新的版本 + bool IsWindows7() const; //判断Windows版本是否为Windows7 + bool IsWindows8Or8point1() const; //判断Windows版本是否为Windows8或Windows8.1 + bool IsWindows8OrLater() const; + bool IsWindows10OrLater() const; + + int GetMajorVersion() const { return m_major_version; } + int GetMinorVersion() const { return m_minor_version; } + int GetBuildNumber() const { return m_build_number; } +protected: + int m_major_version{}; + int m_minor_version{}; + int m_build_number{}; +}; + diff --git a/MusicPlayer2/stdafx.h b/MusicPlayer2/stdafx.h index 6e992a89..43fc0698 100644 --- a/MusicPlayer2/stdafx.h +++ b/MusicPlayer2/stdafx.h @@ -47,9 +47,9 @@ #include #include #include -#ifndef COMPILE_IN_WIN_XP -#include -#endif +//#ifndef COMPILE_IN_WIN_XP +//#include +//#endif #include #include #include