Добавлена папка source в CristalDiskMark
This commit is contained in:
@@ -0,0 +1,738 @@
|
||||
/*---------------------------------------------------------------------------*/
|
||||
// Author : hiyohiyo
|
||||
// Mail : hiyohiyo@crystalmark.info
|
||||
// Web : https://crystalmark.info/
|
||||
// License : MIT License
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "Resource.h"
|
||||
#include "DialogFx.h"
|
||||
#include "UtilityFx.h"
|
||||
#include "OsInfoFx.h"
|
||||
#include <cmath>
|
||||
#include "DarkMode.h"
|
||||
|
||||
// defined by Windows 8.1/Windows 2012 R2
|
||||
#ifndef WM_DPICHANGED
|
||||
#define WM_DPICHANGED 0x02E0
|
||||
#endif
|
||||
|
||||
////------------------------------------------------
|
||||
// CDialogFx
|
||||
////------------------------------------------------
|
||||
|
||||
CDialogFx::CDialogFx(UINT dlgResouce, CWnd* pParent)
|
||||
:CDialog(dlgResouce, pParent)
|
||||
{
|
||||
// Dialog
|
||||
m_bInitializing = TRUE;
|
||||
m_bDpiChanging = FALSE;
|
||||
m_bShowWindow = FALSE;
|
||||
m_bModelessDlg = FALSE;
|
||||
m_bHighContrast = FALSE;
|
||||
m_bDarkMode = FALSE;
|
||||
m_bDisableDarkMode = FALSE;
|
||||
m_bBkImage = FALSE;
|
||||
m_MenuId = 0;
|
||||
m_ParentWnd = NULL;
|
||||
m_DlgWnd = NULL;
|
||||
m_hAccelerator = NULL;
|
||||
m_bDrag = FALSE;
|
||||
m_FontScale = 100;
|
||||
m_FontRatio = 1.0;
|
||||
m_FontRender = CLEARTYPE_NATURAL_QUALITY;
|
||||
m_hPal = NULL;
|
||||
|
||||
m_SizeX = 0;
|
||||
m_MaxSizeX = 65535;
|
||||
m_MinSizeX = 0;
|
||||
m_SizeY = 0;
|
||||
m_MaxSizeY = 65535;
|
||||
m_MinSizeY = 0;
|
||||
|
||||
// Zoom
|
||||
m_Dpi = 96;
|
||||
m_ZoomRatio = 1.0;
|
||||
m_ZoomType = ZoomTypeAuto;
|
||||
|
||||
// Color for SubClass
|
||||
m_LabelText = 0x00000000;
|
||||
m_MeterText = 0x00000000;
|
||||
m_ComboText = 0x00000000;
|
||||
m_ComboTextSelected = 0x00808080;
|
||||
m_ComboBk = 0x00FFFFFF;
|
||||
m_ComboBkSelected = 0x00808080;
|
||||
m_ButtonText = 0x00000000;
|
||||
m_EditText = 0x00000000;
|
||||
m_EditBk = 0x00FFFFFF;
|
||||
m_ListText1 = 0x00000000;
|
||||
m_ListText2 = 0x00000000;
|
||||
m_ListTextSelected = 0x00000000;
|
||||
m_ListBk1 = 0x00FFFFFF;
|
||||
m_ListBk2 = 0x00FFFFFF;
|
||||
m_ListBkSelected = 0x00808080;
|
||||
m_ListLine1 = 0x00000000;
|
||||
m_ListLine2 = 0x00000000;
|
||||
m_Glass = 0x00808080;
|
||||
m_Frame = 0x00808080;
|
||||
m_Background = 0xFFFFFFFF; // Disabled
|
||||
|
||||
m_ComboAlpha = 0;
|
||||
m_EditAlpha = 0;
|
||||
m_GlassAlpha = 0;
|
||||
|
||||
m_CharacterPosition = 0;
|
||||
|
||||
// Theme for SubClass
|
||||
m_OffsetX = 0;
|
||||
|
||||
// Voice for SubClass
|
||||
m_VoiceVolume = 0;
|
||||
}
|
||||
|
||||
CDialogFx::~CDialogFx()
|
||||
{
|
||||
if(m_hPal) DeleteObject(m_hPal);
|
||||
}
|
||||
|
||||
BEGIN_MESSAGE_MAP(CDialogFx, CDialog)
|
||||
ON_WM_SIZE()
|
||||
ON_WM_TIMER()
|
||||
ON_WM_ERASEBKGND()
|
||||
ON_MESSAGE(WM_DPICHANGED, &CDialogFx::OnDpiChanged)
|
||||
ON_MESSAGE(WM_DISPLAYCHANGE, &CDialogFx::OnDisplayChange)
|
||||
ON_MESSAGE(WM_SYSCOLORCHANGE, &CDialogFx::OnSysColorChange)
|
||||
ON_MESSAGE(WM_SETTINGCHANGE, &CDialogFx::OnSettingChange)
|
||||
ON_MESSAGE(WM_ENTERSIZEMOVE, &CDialogFx::OnEnterSizeMove)
|
||||
ON_MESSAGE(WM_EXITSIZEMOVE, &CDialogFx::OnExitSizeMove)
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
//------------------------------------------------
|
||||
// Dialog
|
||||
//------------------------------------------------
|
||||
|
||||
BOOL CDialogFx::Create(UINT nIDTemplate, CWnd* pDlgWnd, UINT menuId, CWnd* pParentWnd)
|
||||
{
|
||||
m_bModelessDlg = TRUE;
|
||||
m_ParentWnd = pParentWnd;
|
||||
m_DlgWnd = pDlgWnd;
|
||||
m_MenuId = menuId;
|
||||
|
||||
if (m_MenuId != 0 && m_ParentWnd != NULL)
|
||||
{
|
||||
CMenu* menu = m_ParentWnd->GetMenu();
|
||||
menu->EnableMenuItem(m_MenuId, MF_GRAYED);
|
||||
m_ParentWnd->SetMenu(menu);
|
||||
m_ParentWnd->DrawMenuBar();
|
||||
}
|
||||
|
||||
return CDialog::Create(nIDTemplate, pParentWnd);
|
||||
}
|
||||
|
||||
int CDialogFx::GetDpi()
|
||||
{
|
||||
INT dpi = 96;
|
||||
CDC* pDC = GetDC();
|
||||
dpi = GetDeviceCaps(pDC->m_hDC, LOGPIXELSY);
|
||||
ReleaseDC(pDC);
|
||||
|
||||
HMODULE hModule = GetModuleHandle(_T("Shcore.dll"));
|
||||
if (hModule)
|
||||
{
|
||||
typedef HRESULT(WINAPI* FuncGetDpiForMonitor) (HMONITOR hmonitor, UINT dpiType, UINT* dpiX, UINT* dpiY);
|
||||
typedef HMONITOR(WINAPI* FuncMonitorFromWindow) (HWND hwnd, DWORD dwFlags);
|
||||
|
||||
FuncGetDpiForMonitor pGetDpiForMonitor = (FuncGetDpiForMonitor)GetProcAddress(hModule, "GetDpiForMonitor");
|
||||
FuncMonitorFromWindow pMonitorFromWindow = (FuncMonitorFromWindow)GetProcAddress(hModule, "MonitorFromWindow");
|
||||
|
||||
if (pGetDpiForMonitor && pMonitorFromWindow)
|
||||
{
|
||||
UINT dpiX, dpiY;
|
||||
pGetDpiForMonitor(pMonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST), 0, &dpiX, &dpiY);
|
||||
dpi = dpiY;
|
||||
}
|
||||
}
|
||||
|
||||
return dpi;
|
||||
}
|
||||
|
||||
BOOL CDialogFx::OnInitDialog()
|
||||
{
|
||||
CDialog::OnInitDialog();
|
||||
|
||||
m_bHighContrast = IsHighContrast();
|
||||
m_Dpi = GetDpi();
|
||||
m_hAccelerator = ::LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR));
|
||||
|
||||
// m_bInitializing = FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CDialogFx::OnSize(UINT nType, int cx, int cy)
|
||||
{
|
||||
CDialog::OnSize(nType, cx, cy);
|
||||
|
||||
if (nType == SIZE_RESTORED)
|
||||
{
|
||||
UpdateBackground(TRUE, FALSE);
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
BOOL CDialogFx::PreTranslateMessage(MSG* pMsg)
|
||||
{
|
||||
if(m_hAccelerator != NULL)
|
||||
{
|
||||
if(::TranslateAccelerator(m_hWnd, m_hAccelerator, pMsg) != 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return CDialog::PreTranslateMessage(pMsg);
|
||||
}
|
||||
|
||||
void CDialogFx::PostNcDestroy()
|
||||
{
|
||||
if (m_bModelessDlg)
|
||||
{
|
||||
m_DlgWnd = NULL;
|
||||
delete this;
|
||||
}
|
||||
else
|
||||
{
|
||||
CDialog::PostNcDestroy();
|
||||
}
|
||||
}
|
||||
|
||||
void CDialogFx::UpdateDialogSize()
|
||||
{
|
||||
#if _MSC_VER > 1310
|
||||
if (! m_bDisableDarkMode)
|
||||
{
|
||||
m_bDarkMode = SetDarkMode(m_hWnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
UnsetDarkMode(m_hWnd);
|
||||
m_bDarkMode = FALSE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void CDialogFx::SetClientSize(int sizeX, int sizeY, double zoomRatio)
|
||||
{
|
||||
RECT rw, rc;
|
||||
GetWindowRect(&rw);
|
||||
GetClientRect(&rc);
|
||||
|
||||
if (rc.right != 0)
|
||||
{
|
||||
int ncaWidth = (rw.right - rw.left) - (rc.right - rc.left);
|
||||
int ncaHeight = (rw.bottom - rw.top) - (rc.bottom - rc.top);
|
||||
|
||||
SetWindowPos(NULL, 0, 0, (int)(sizeX * zoomRatio) + ncaWidth, (int)(sizeY * zoomRatio) + ncaHeight, SWP_NOMOVE | SWP_NOZORDER);
|
||||
|
||||
GetWindowRect(&rw);
|
||||
GetClientRect(&rc);
|
||||
|
||||
int ncaHeightMenu = (rw.bottom - rw.top) - (rc.bottom - rc.top);
|
||||
|
||||
if (ncaHeight != ncaHeightMenu)
|
||||
{
|
||||
SetWindowPos(NULL, 0, 0, (int)(sizeX * zoomRatio) + ncaWidth, (int)(sizeY * zoomRatio) + ncaHeightMenu, SWP_NOMOVE | SWP_NOZORDER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CDialogFx::UpdateBackground(BOOL resize, BOOL bDarkMode)
|
||||
{
|
||||
BOOL result = FALSE;
|
||||
CImage srcBitmap;
|
||||
double ratio = m_ZoomRatio;
|
||||
m_bBkImage = FALSE;
|
||||
|
||||
#if _MSC_VER > 1310
|
||||
if (resize) { m_ZoomRatio = 3.0; }
|
||||
result = srcBitmap.Load(IP(m_BackgroundName));
|
||||
if (resize) { m_ZoomRatio = ratio; }
|
||||
#else
|
||||
if (resize) { m_ZoomRatio = 1.0; }
|
||||
result = srcBitmap.Load(IP(m_BackgroundName));
|
||||
if (resize) { m_ZoomRatio = ratio; }
|
||||
#endif
|
||||
|
||||
HDC hScreenDC = ::GetDC(NULL); // get desktop DC
|
||||
if(!m_hPal && GetDeviceCaps(hScreenDC, RASTERCAPS) & RC_PALETTE)
|
||||
{
|
||||
m_hPal = CreateHalftonePalette(hScreenDC);
|
||||
}
|
||||
DeleteDC(hScreenDC); // delete it after use
|
||||
|
||||
if (result)
|
||||
{
|
||||
m_bBkImage = TRUE;
|
||||
CBitmap baseBitmap;
|
||||
CDC baseDC;
|
||||
CDC* pWndDC = GetDC();
|
||||
|
||||
#if _MSC_VER > 1310
|
||||
int w = (int)(m_ZoomRatio / 3.0 * srcBitmap.GetWidth());
|
||||
int h = (int)(m_ZoomRatio / 3.0 * srcBitmap.GetHeight());
|
||||
#else
|
||||
int w = (int)(m_ZoomRatio * srcBitmap.GetWidth());
|
||||
int h = (int)(m_ZoomRatio * srcBitmap.GetHeight());
|
||||
#endif
|
||||
int orgw = srcBitmap.GetWidth();
|
||||
int orgh = srcBitmap.GetHeight();
|
||||
if(m_hPal && pWndDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE)
|
||||
{
|
||||
SelectPalette( pWndDC->GetSafeHdc(), m_hPal, TRUE );
|
||||
pWndDC->RealizePalette();
|
||||
pWndDC->SetStretchBltMode(HALFTONE);
|
||||
}
|
||||
baseBitmap.CreateCompatibleBitmap(pWndDC, orgw, orgh);
|
||||
baseDC.CreateCompatibleDC(pWndDC);
|
||||
if(m_hPal && baseDC.GetDeviceCaps(RASTERCAPS) & RC_PALETTE)
|
||||
{
|
||||
SelectPalette( baseDC.GetSafeHdc(), m_hPal, FALSE );
|
||||
baseDC.RealizePalette();
|
||||
baseDC.SetStretchBltMode(HALFTONE);
|
||||
}
|
||||
|
||||
m_BkBitmap.DeleteObject();
|
||||
m_BkDC.DeleteDC();
|
||||
m_BkBitmap.CreateCompatibleBitmap(pWndDC, w, h);
|
||||
m_BkDC.CreateCompatibleDC(pWndDC);
|
||||
if(m_hPal && baseDC.GetDeviceCaps(RASTERCAPS) & RC_PALETTE)
|
||||
{
|
||||
SelectPalette( m_BkDC.GetSafeHdc(), m_hPal, FALSE );
|
||||
m_BkDC.RealizePalette();
|
||||
m_BkDC.SetStretchBltMode(HALFTONE);
|
||||
}
|
||||
|
||||
ReleaseDC(pWndDC);
|
||||
|
||||
baseDC.SelectObject(&baseBitmap);
|
||||
m_BkDC.SelectObject(&m_BkBitmap);
|
||||
|
||||
srcBitmap.BitBlt(baseDC.GetSafeHdc(), 0, 0, SRCCOPY);
|
||||
srcBitmap.Destroy();
|
||||
|
||||
m_BkDC.SetStretchBltMode(HALFTONE);
|
||||
SetBrushOrgEx(m_BkDC, 0, 0, NULL);
|
||||
m_BkDC.StretchBlt(0, 0, w, h, &baseDC, 0, 0, orgw, orgh, SRCCOPY);
|
||||
|
||||
baseBitmap.DeleteObject();
|
||||
baseDC.DeleteDC();
|
||||
|
||||
m_BrushDlg.DeleteObject();
|
||||
m_BrushDlg.CreatePatternBrush(&m_BkBitmap);
|
||||
|
||||
return;
|
||||
}
|
||||
else if (m_bHighContrast)
|
||||
{
|
||||
m_BrushDlg.DeleteObject();
|
||||
m_BrushDlg.CreateSolidBrush(RGB(0, 0, 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
CBitmap baseBitmap;
|
||||
CDC baseDC;
|
||||
CDC* pWndDC = GetDC();
|
||||
|
||||
CRect rect;
|
||||
GetClientRect(&rect);
|
||||
int w = rect.Width();
|
||||
int h = rect.Height();
|
||||
|
||||
m_BkBitmap.DeleteObject();
|
||||
m_BkBitmap.CreateCompatibleBitmap(pWndDC, w, h);
|
||||
m_BkDC.DeleteDC();
|
||||
m_BkDC.CreateCompatibleDC(pWndDC);
|
||||
m_BkDC.SelectObject(&m_BkBitmap);
|
||||
|
||||
m_BrushDlg.DeleteObject();
|
||||
COLORREF bkColor;
|
||||
|
||||
if (m_Background != 0xFFFFFFFF)
|
||||
{
|
||||
bkColor = m_Background;
|
||||
}
|
||||
else if (bDarkMode)
|
||||
{
|
||||
bkColor = RGB(32, 32, 32);
|
||||
}
|
||||
else
|
||||
{
|
||||
bkColor = RGB(255, 255, 255);
|
||||
}
|
||||
m_BrushDlg.CreateSolidBrush(bkColor);
|
||||
|
||||
m_BkDC.FillRect(&rect, &m_BrushDlg);
|
||||
|
||||
ReleaseDC(pWndDC);
|
||||
}
|
||||
}
|
||||
|
||||
void CDialogFx::SetWindowTitle(CString title)
|
||||
{
|
||||
SetWindowText(_T(" ") + title + _T(" "));
|
||||
}
|
||||
|
||||
void CDialogFx::OnOK()
|
||||
{
|
||||
}
|
||||
|
||||
void CDialogFx::OnCancel()
|
||||
{
|
||||
if (m_bModelessDlg)
|
||||
{
|
||||
if (m_MenuId != 0 && m_ParentWnd != NULL)
|
||||
{
|
||||
CMenu* menu = m_ParentWnd->GetMenu();
|
||||
menu->EnableMenuItem(m_MenuId, MF_ENABLED);
|
||||
m_ParentWnd->SetMenu(menu);
|
||||
m_ParentWnd->DrawMenuBar();
|
||||
}
|
||||
CDialog::DestroyWindow();
|
||||
}
|
||||
else
|
||||
{
|
||||
CDialog::OnCancel();
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------
|
||||
// Font
|
||||
//------------------------------------------------
|
||||
|
||||
int CDialogFx::GetFontScale()
|
||||
{
|
||||
return m_FontScale;
|
||||
}
|
||||
|
||||
BYTE CDialogFx::GetFontRender()
|
||||
{
|
||||
return m_FontRender;
|
||||
}
|
||||
|
||||
double CDialogFx::GetFontRatio()
|
||||
{
|
||||
return m_FontRatio;
|
||||
}
|
||||
|
||||
CString CDialogFx::GetFontFace()
|
||||
{
|
||||
return m_FontFace;
|
||||
}
|
||||
|
||||
//------------------------------------------------
|
||||
// Zoom
|
||||
//------------------------------------------------
|
||||
|
||||
DWORD CDialogFx::ChangeZoomType(DWORD zoomType)
|
||||
{
|
||||
DWORD current = (DWORD)ceil(m_Dpi / 96.0 * 100);
|
||||
int width = GetSystemMetrics(SM_CXSCREEN);
|
||||
|
||||
if(zoomType == ZoomTypeAuto)
|
||||
{
|
||||
#if _MSC_VER > 1310
|
||||
if (current >= 300)
|
||||
{
|
||||
zoomType = ZoomType300;
|
||||
}
|
||||
else if (current >= 250)
|
||||
{
|
||||
zoomType = ZoomType250;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if(current >= 200)
|
||||
{
|
||||
zoomType = ZoomType200;
|
||||
}
|
||||
else if(current >= 150)
|
||||
{
|
||||
zoomType = ZoomType150;
|
||||
}
|
||||
else if(current >= 125)
|
||||
{
|
||||
zoomType = ZoomType125;
|
||||
}
|
||||
#ifdef CRYSTALMARK_RETRO
|
||||
#ifdef SUISHO_SHIZUKU_SUPPORT
|
||||
else if (width < 900) { zoomType = ZoomType050; }
|
||||
else if (width < 1200){ zoomType = ZoomType075; }
|
||||
#else
|
||||
// else if (width < 732) { zoomType = ZoomType050; }
|
||||
else if (width < 732) { zoomType = ZoomType064; }
|
||||
else if (width < 976) { zoomType = ZoomType075; }
|
||||
#endif
|
||||
#endif
|
||||
else
|
||||
{
|
||||
zoomType = ZoomType100;
|
||||
}
|
||||
}
|
||||
|
||||
m_ZoomRatio = zoomType / 100.0;
|
||||
|
||||
return zoomType;
|
||||
}
|
||||
|
||||
//------------------------------------------------
|
||||
// Theme
|
||||
//------------------------------------------------
|
||||
|
||||
BOOL CDialogFx::IsHighContrast()
|
||||
{
|
||||
HIGHCONTRAST hc = { sizeof(HIGHCONTRAST) };
|
||||
SystemParametersInfoW(SPI_GETHIGHCONTRAST, sizeof(HIGHCONTRAST), &hc, 0);
|
||||
|
||||
return hc.dwFlags & HCF_HIGHCONTRASTON;
|
||||
}
|
||||
|
||||
BOOL CDialogFx::IsDisableDarkMode()
|
||||
{
|
||||
return m_bDisableDarkMode;
|
||||
}
|
||||
|
||||
//------------------------------------------------
|
||||
// Utility
|
||||
//------------------------------------------------
|
||||
|
||||
CString CDialogFx::IP(CString imageName) /// ImagePath
|
||||
{
|
||||
CString imagePath;
|
||||
imagePath.Format(_T("%s%s\\%s-%03d.png"), (LPCTSTR)m_ThemeDir, (LPCTSTR)m_CurrentTheme, (LPCTSTR)imageName, (DWORD)(m_ZoomRatio * 100));
|
||||
if (IsFileExist(imagePath))
|
||||
{
|
||||
return imagePath;
|
||||
}
|
||||
imagePath.Format(_T("%s%s\\%s-%03d.png"), (LPCTSTR)m_ThemeDir, (LPCTSTR)m_ParentTheme1, (LPCTSTR)imageName, (DWORD)(m_ZoomRatio * 100));
|
||||
if (IsFileExist(imagePath))
|
||||
{
|
||||
return imagePath;
|
||||
}
|
||||
imagePath.Format(_T("%s%s\\%s-%03d.png"), (LPCTSTR)m_ThemeDir, (LPCTSTR)m_ParentTheme2, (LPCTSTR)imageName, (DWORD)(m_ZoomRatio * 100));
|
||||
if (IsFileExist(imagePath))
|
||||
{
|
||||
return imagePath;
|
||||
}
|
||||
imagePath.Format(_T("%s%s\\%s-%03d.png"), (LPCTSTR)m_ThemeDir, (LPCTSTR)m_DefaultTheme, (LPCTSTR)imageName, (DWORD)(m_ZoomRatio * 100));
|
||||
if (IsFileExist(imagePath))
|
||||
{
|
||||
return imagePath;
|
||||
}
|
||||
|
||||
return _T("");
|
||||
}
|
||||
|
||||
CString CDialogFx::i18n(CString section, CString key, BOOL inEnglish)
|
||||
{
|
||||
TCHAR str[256];
|
||||
CString cstr;
|
||||
|
||||
if(inEnglish)
|
||||
{
|
||||
GetPrivateProfileStringFx(section, key, _T(""), str, 256, m_DefaultLangPath);
|
||||
cstr = str;
|
||||
}
|
||||
else
|
||||
{
|
||||
GetPrivateProfileStringFx(section, key, _T(""), str, 256, m_CurrentLangPath);
|
||||
cstr = str;
|
||||
if(cstr.IsEmpty())
|
||||
{
|
||||
GetPrivateProfileStringFx(section, key, _T(""), str, 256, m_DefaultLangPath);
|
||||
cstr = str;
|
||||
}
|
||||
}
|
||||
|
||||
return cstr;
|
||||
}
|
||||
|
||||
void CDialogFx::OpenUrl(CString url)
|
||||
{
|
||||
INT_PTR result = 0;
|
||||
result = (INT_PTR)(ShellExecute(NULL, _T("open"), (LPCTSTR)url, NULL, NULL, SW_SHOWNORMAL));
|
||||
if(result <= 32)
|
||||
{
|
||||
CString args;
|
||||
args.Format(_T("url.dll,FileProtocolHandler %s"), (LPCTSTR)url);
|
||||
ShellExecute(NULL, _T("open"), _T("rundll32.exe"), args, NULL, SW_SHOWNORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
void CDialogFx::SetLayeredWindow(HWND hWnd, BYTE alpha)
|
||||
{
|
||||
#if _MSC_VER > 1310
|
||||
if (IsWin2k()) { return; }
|
||||
|
||||
::SetWindowLong(hWnd, GWL_EXSTYLE, ::GetWindowLong(hWnd, GWL_EXSTYLE) ^ WS_EX_LAYERED);
|
||||
::SetWindowLong(hWnd, GWL_EXSTYLE, ::GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
|
||||
if (m_bHighContrast)
|
||||
{
|
||||
::SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA);
|
||||
}
|
||||
else
|
||||
{
|
||||
::SetLayeredWindowAttributes(hWnd, 0, alpha, LWA_ALPHA);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//------------------------------------------------
|
||||
// MessageMap
|
||||
//------------------------------------------------
|
||||
|
||||
void CDialogFx::OnTimer(UINT_PTR nIDEvent)
|
||||
{
|
||||
switch (nIDEvent)
|
||||
{
|
||||
case TimerUpdateDialogSizeDpiChanged:
|
||||
if (m_bDrag)
|
||||
{
|
||||
KillTimer(TimerUpdateDialogSizeDpiChanged);
|
||||
SetTimer(TimerUpdateDialogSizeDpiChanged, TIMER_UPDATE_DIALOG, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bDpiChanging = FALSE;
|
||||
KillTimer(TimerUpdateDialogSizeDpiChanged);
|
||||
UpdateDialogSize();
|
||||
}
|
||||
break;
|
||||
case TimerUpdateDialogSizeDisplayChange:
|
||||
KillTimer(TimerUpdateDialogSizeDisplayChange);
|
||||
UpdateDialogSize();
|
||||
break;
|
||||
case TimerUpdateDialogSizeSysColorChange:
|
||||
KillTimer(TimerUpdateDialogSizeSysColorChange);
|
||||
UpdateDialogSize();
|
||||
break;
|
||||
case TimerUpdateDialogSizeSettingChange:
|
||||
KillTimer(TimerUpdateDialogSizeSettingChange);
|
||||
UpdateDialogSize();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL CDialogFx::OnEraseBkgnd(CDC* pDC)
|
||||
{
|
||||
if (m_bHighContrast)
|
||||
{
|
||||
return CDialog::OnEraseBkgnd(pDC);
|
||||
}
|
||||
|
||||
if(m_hPal && pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE)
|
||||
{
|
||||
SelectPalette( pDC->GetSafeHdc(), m_hPal, TRUE );
|
||||
pDC->RealizePalette();
|
||||
pDC->SetStretchBltMode(HALFTONE);
|
||||
}
|
||||
|
||||
CRect rect;
|
||||
GetClientRect(&rect);
|
||||
|
||||
return pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &m_BkDC, 0, 0, rect.Width(), rect.Height(), SRCCOPY);
|
||||
}
|
||||
|
||||
afx_msg LRESULT CDialogFx::OnDpiChanged(WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (m_bInitializing) { return 0; }
|
||||
|
||||
static ULONGLONG preTime = 0;
|
||||
ULONGLONG currentTime = GetTickCountFx();
|
||||
if (currentTime - preTime < 1000)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
preTime = currentTime;
|
||||
}
|
||||
|
||||
m_Dpi = (INT)HIWORD(wParam);
|
||||
|
||||
#if _MSC_VER > 1310
|
||||
if (IsWindowsBuildOrGreater(16299)) // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
|
||||
{
|
||||
ChangeZoomType(m_ZoomType);
|
||||
m_bDpiChanging = TRUE;
|
||||
SetTimer(TimerUpdateDialogSizeDpiChanged, TIMER_UPDATE_DIALOG, NULL);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if(m_ZoomType == ZoomTypeAuto)
|
||||
{
|
||||
DWORD oldZoomRatio = (DWORD)(m_ZoomRatio * 100);
|
||||
if (ChangeZoomType(m_ZoomType) != oldZoomRatio)
|
||||
{
|
||||
m_bDpiChanging = TRUE;
|
||||
SetTimer(TimerUpdateDialogSizeDpiChanged, TIMER_UPDATE_DIALOG, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
afx_msg LRESULT CDialogFx::OnDisplayChange(WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (m_bInitializing) { return 0; }
|
||||
|
||||
CDC* cdc = GetDC();
|
||||
if (cdc)
|
||||
{
|
||||
int color = cdc->GetDeviceCaps(BITSPIXEL) * cdc->GetDeviceCaps(PLANES);
|
||||
if (color != wParam)
|
||||
{
|
||||
SetTimer(TimerUpdateDialogSizeDisplayChange, TIMER_UPDATE_DIALOG, NULL);
|
||||
}
|
||||
ReleaseDC(cdc);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
afx_msg LRESULT CDialogFx::OnSysColorChange(WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (m_bInitializing) { return 0; }
|
||||
|
||||
m_bHighContrast = IsHighContrast();
|
||||
|
||||
SetTimer(TimerUpdateDialogSizeSysColorChange, TIMER_UPDATE_DIALOG, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
afx_msg LRESULT CDialogFx::OnSettingChange(WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (m_bInitializing) { return 0; }
|
||||
|
||||
if (!lstrcmp(LPCTSTR(lParam), _T("ImmersiveColorSet")))
|
||||
{
|
||||
SetTimer(TimerUpdateDialogSizeSettingChange, TIMER_UPDATE_DIALOG, NULL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
afx_msg LRESULT CDialogFx::OnEnterSizeMove(WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
m_bDrag = TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
afx_msg LRESULT CDialogFx::OnExitSizeMove(WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
m_bDrag = FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
Reference in New Issue
Block a user