Files

1070 lines
27 KiB
C++

/*---------------------------------------------------------------------------*/
// Author : hiyohiyo
// Mail : hiyohiyo@crystalmark.info
// Web : https://crystalmark.info/
// License : MIT License
/*---------------------------------------------------------------------------*/
#include "stdafx.h"
#include "MainDialogFx.h"
#include <ctime>
#include <UAHMenuBar.h>
#include "UtilityFx.h"
#include "OsInfoFx.h"
using namespace std;
CMainDialogFx::CMainDialogFx(UINT dlgResouce, CWnd* pParent)
:CDialogFx(dlgResouce, pParent)
{
// Common
m_bStartup = FALSE;
m_bWindowMinimizeOnce = TRUE;
m_bResident = FALSE;
m_bResidentMinimize = FALSE;
// Theme
m_ThemeKeyName = _T("Theme");
TCHAR* ptrEnd;
TCHAR ini[MAX_PATH];
TCHAR tmp[MAX_PATH];
CString directry;
GetModuleFileName(NULL, ini, MAX_PATH);
if ((ptrEnd = _tcsrchr(ini, '.')) != NULL)
{
*ptrEnd = '\0';
#if _MSC_VER > 1310
_tcscat_s(ini, MAX_PATH, _T(".ini"));
#else
_tcscat(ini, _T(".ini"));
#endif
m_Ini = ini;
}
#if _MSC_VER > 1310
CString tmpPath;
tmpPath = m_Ini;
tmpPath.Replace(_T(".ini"), _T(".tmp"));
if (! CanWriteFile(tmpPath))
{
TCHAR drive[_MAX_DRIVE];
TCHAR ext[_MAX_EXT];
TCHAR appData[MAX_PATH];
TCHAR dir[_MAX_DIR];
TCHAR fileName[_MAX_FNAME];
GetModuleFileName(NULL, ini, MAX_PATH);
_tsplitpath(ini, drive, dir, fileName, ext);
SHGetSpecialFolderPath(NULL, appData, CSIDL_APPDATA, 0);
directry.Format(_T("%s\\%s"), appData, PRODUCT_FILENAME);
CreateDirectory(directry, NULL);
m_Ini.Format(_T("%s\\%s\\%s.ini"), appData, PRODUCT_FILENAME, fileName);
}
#endif
GetModuleFileName(NULL, tmp, MAX_PATH);
if ((ptrEnd = _tcsrchr(tmp, '\\')) != NULL) { *ptrEnd = '\0'; }
m_ThemeDir.Format(_T("%s\\%s"), tmp, THEME_DIR);
m_LangDir.Format(_T("%s\\%s"), tmp, LANGUAGE_DIR);
m_VoiceDir.Format(_T("%s\\%s"), tmp, VOICE_DIR);
}
CMainDialogFx::~CMainDialogFx()
{
}
BEGIN_MESSAGE_MAP(CMainDialogFx, CDialogFx)
ON_WM_WINDOWPOSCHANGING()
ON_WM_GETMINMAXINFO()
END_MESSAGE_MAP()
LRESULT CMainDialogFx::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
#if _MSC_VER > 1310
LRESULT lr = 0;
if (UAHWndProc(m_hWnd, message, wParam, lParam, &lr)) {
return lr;
}
#endif
return CDialogFx::WindowProc(message, wParam, lParam);
}
int CALLBACK HasFontProc(ENUMLOGFONTEX* lpelfe, NEWTEXTMETRICEX* lpntme, int FontType, LPARAM lParam)
{
*(BOOL*)lParam = TRUE;
return 0;
}
CString CMainDialogFx::GetDefaultFont()
{
#if _MSC_VER <= 1310
int stockFont = DEFAULT_GUI_FONT;
if (IsNT3())
{
return _T("MS Shell Dlg");
}
HFONT hFont = (HFONT)GetStockObject(stockFont);
LOGFONT lf = { 0 };
if (GetObject(hFont, sizeof(LOGFONT), &lf))
{
return lf.lfFaceName;
}
#endif
CClientDC dc(this);
LOGFONT logfont;
BOOL hasFont = FALSE;
ZeroMemory(&logfont, sizeof(LOGFONT));
lstrcpy(logfont.lfFaceName, DEFAULT_FONT_FACE_1);
logfont.lfCharSet = DEFAULT_CHARSET;
::EnumFontFamiliesEx(dc.m_hDC, &logfont, (FONTENUMPROC)HasFontProc, (LPARAM)(&hasFont), 0);
if (hasFont)
{
return DEFAULT_FONT_FACE_1;
}
else
{
return DEFAULT_FONT_FACE_2;
}
}
CString CMainDialogFx::GetCurrentLangPath()
{
return m_CurrentLangPath;
}
CString CMainDialogFx::GetDefaultLangPath()
{
return m_DefaultLangPath;
}
CString CMainDialogFx::GetThemeDir()
{
return m_ThemeDir;
}
CString CMainDialogFx::GetCurrentTheme()
{
return m_CurrentTheme;
}
CString CMainDialogFx::GetDefaultTheme()
{
return m_DefaultTheme;
}
CString CMainDialogFx::GetParentTheme1()
{
return m_ParentTheme1;
}
CString CMainDialogFx::GetParentTheme2()
{
return m_ParentTheme2;
}
CString CMainDialogFx::GetIniPath()
{
return m_Ini;
}
void CMainDialogFx::SetWindowTitle(CString message)
{
CString title;
if(! message.IsEmpty())
{
title.Format(_T(" %s - %s"), PRODUCT_SHORT_NAME, (LPCTSTR)message);
}
else
{
title.Format(_T(" %s %s %s"), PRODUCT_NAME, PRODUCT_VERSION, PRODUCT_EDITION);
}
SetWindowText(title);
}
void CMainDialogFx::InitThemeLang()
{
TCHAR str[256];
TCHAR *ptrEnd;
WIN32_FIND_DATA findData;
HANDLE hFind;
CString langPath;
int i = 0;
WORD PrimaryLangID;
CString PrimaryLang;
// Set Theme
if(m_CurrentTheme.IsEmpty())
{
CString defaultTheme = m_DefaultTheme;
#if _MSC_VER > 1310
if (IsFileExist(m_ThemeDir + m_RecommendTheme + _T("\\") + m_BackgroundName + _T("-300.png")))
{
defaultTheme = m_RecommendTheme;
}
#else
if (IsFileExist(m_ThemeDir + m_RecommendTheme + _T("\\") + m_BackgroundName + _T("-100.png")))
{
defaultTheme = m_RecommendTheme;
}
#endif
GetPrivateProfileStringFx(_T("Setting"), m_ThemeKeyName, defaultTheme, str, 256, m_Ini);
m_CurrentTheme = str;
}
// Set Language
GetPrivateProfileStringFx(_T("Setting"), _T("Language"), _T(""), str, 256, m_Ini);
langPath.Format(_T("%s\\%s.lang"), (LPCTSTR)m_LangDir, str);
#ifdef UNICODE
m_DefaultLangPath.Format(_T("%s\\%s.lang"), (LPCTSTR)m_LangDir, DEFAULT_LANGUAGE);
#else
m_DefaultLangPath.Format(_T("%s\\%s9x.lang"), (LPCTSTR)m_LangDir, DEFAULT_LANGUAGE);
#endif
if(_tcscmp(str, _T("")) != 0 && IsFileExist((LPCTSTR)langPath))
{
m_CurrentLang = str;
m_CurrentLang.Replace(_T("9x"), _T(""));
#ifdef UNICODE
m_CurrentLangPath.Format(_T("%s\\%s.lang"), (LPCTSTR)m_LangDir, (LPCTSTR)m_CurrentLang);
#else
m_CurrentLangPath.Format(_T("%s\\%s9x.lang"), (LPCTSTR)m_LangDir, (LPCTSTR)m_CurrentLang);
#endif
}
else
{
CString currentLocalID;
currentLocalID.Format(_T("0x%04X"), GetUserDefaultLCID());
PrimaryLangID = PRIMARYLANGID(GetUserDefaultLCID());
langPath.Format(_T("%s\\*.lang"), (LPCTSTR)m_LangDir);
hFind = ::FindFirstFile(langPath, &findData);
if(hFind != INVALID_HANDLE_VALUE)
{
do{
if(findData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
{
CString cstr;
cstr = findData.cFileName;
#ifdef UNICODE
if (cstr.Find(_T("9x.lang")) >= 0)
{
continue;
}
#else
if (cstr.Find(_T("9x.lang")) == -1)
{
continue;
}
#endif
i++;
cstr.Format(_T("%s\\%s"), (LPCTSTR)m_LangDir, findData.cFileName);
GetPrivateProfileStringFx(_T("Language"), _T("LOCALE_ID"), _T(""), str, 256, cstr);
if((ptrEnd = _tcsrchr(findData.cFileName, '.')) != NULL){*ptrEnd = '\0';}
if(_tcsstr(str, currentLocalID) != NULL)
{
m_CurrentLang = findData.cFileName;
m_CurrentLang.Replace(_T("9x"), _T(""));
#ifdef UNICODE
m_CurrentLangPath.Format(_T("%s\\%s.lang"), (LPCTSTR)m_LangDir, findData.cFileName);
#else
m_CurrentLangPath.Format(_T("%s\\%s9x.lang"), (LPCTSTR)m_LangDir, findData.cFileName);
#endif
}
if(PrimaryLangID == PRIMARYLANGID(_tcstol(str, NULL, 16)))
{
PrimaryLang = findData.cFileName;
PrimaryLang.Replace(_T("9x"), _T(""));
}
}
}while(::FindNextFile(hFind, &findData) && i <= 0xFF);
}
FindClose(hFind);
if(m_CurrentLang.IsEmpty())
{
if(PrimaryLang.IsEmpty())
{
m_CurrentLang = DEFAULT_LANGUAGE;
#ifdef UNICODE
m_CurrentLangPath.Format(_T("%s\\%s.lang"), (LPCTSTR)m_LangDir, (LPCTSTR)m_CurrentLang);
#else
m_CurrentLangPath.Format(_T("%s\\%s9x.lang"), (LPCTSTR)m_LangDir, (LPCTSTR)m_CurrentLang);
#endif
}
else
{
m_CurrentLang = PrimaryLang;
#ifdef UNICODE
m_CurrentLangPath.Format(_T("%s\\%s.lang"), (LPCTSTR)m_LangDir, (LPCTSTR)PrimaryLang);
#else
m_CurrentLangPath.Format(_T("%s\\%s9x.lang"), (LPCTSTR)m_LangDir, (LPCTSTR)PrimaryLang);
#endif
}
}
}
UpdateThemeInfo();
}
void CMainDialogFx::InitMenu()
{
CMenu menu;
CMenu subMenu;
BOOL FlagHitTheme = FALSE;
BOOL FlagHitLang = FALSE;
UINT newItemID = 0;
UINT currentItemID = 0;
UINT defaultStyleItemID = 0;
WIN32_FIND_DATA findData;
HANDLE hFind;
CString themePath;
CString themeCssPath;
CString langPath;
int i = 0;
TCHAR *ptrEnd = NULL;
TCHAR str[256];
srand((unsigned int)std::time(NULL));
menu.Attach(GetMenu()->GetSafeHmenu());
subMenu.Attach(menu.GetSubMenu(MENU_THEME_INDEX)->GetSafeHmenu());
themePath.Format(_T("%s\\*.*"), (LPCTSTR)m_ThemeDir);
// Add Random as first choice.
subMenu.AppendMenu(MF_STRING, (UINT_PTR)WM_THEME_ID + i, m_RandomThemeLabel + m_RandomThemeName);
i++;
m_MenuArrayTheme.Add(m_RandomThemeLabel);
hFind = ::FindFirstFile(themePath, &findData);
if(hFind != INVALID_HANDLE_VALUE)
{
while(::FindNextFile(hFind, &findData) && i <= 0xFF)
{
if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
CString name = findData.cFileName;
if(CheckThemeEdition(name))
{
// Add Theme
newItemID = WM_THEME_ID + i;
i++;
subMenu.AppendMenu(MF_STRING, (UINT_PTR)newItemID, findData.cFileName);
m_MenuArrayTheme.Add(findData.cFileName);
if(m_CurrentTheme.Compare(findData.cFileName) == 0)
{
currentItemID = newItemID;
FlagHitTheme = TRUE;
}
if(_tcsstr(findData.cFileName, m_DefaultTheme) != NULL)
{
defaultStyleItemID = newItemID;
}
}
}
}
}
FindClose(hFind);
if(m_CurrentTheme.Compare(m_RandomThemeLabel) == 0)
{
m_CurrentTheme = GetRandomTheme();
m_RandomThemeName = _T(" (") + m_CurrentTheme + _T(")");
// Keep currentItemID the same as the first item if "Random".
currentItemID = WM_THEME_ID;
SUBMENU_MODIFY_MENU(WM_THEME_ID, MF_STRING, WM_THEME_ID, m_RandomThemeLabel + m_RandomThemeName);
}
else if(! FlagHitTheme)
{
currentItemID = defaultStyleItemID;
m_CurrentTheme = m_DefaultTheme;
}
CMenu subMenuAN;
CMenu subMenuOZ;
subMenu.CheckMenuRadioItem(WM_THEME_ID, WM_THEME_ID + (UINT)m_MenuArrayTheme.GetSize(),
currentItemID, MF_BYCOMMAND);
subMenu.Detach();
subMenu.Attach(menu.GetSubMenu(MENU_LANG_INDEX)->GetSafeHmenu());
subMenuAN.Attach(subMenu.GetSubMenu(0)->GetSafeHmenu()); // 1st is "A~N"
subMenuAN.RemoveMenu(0, MF_BYPOSITION);
subMenuOZ.Attach(subMenu.GetSubMenu(1)->GetSafeHmenu()); // 2nd is "O~Z"
subMenuOZ.RemoveMenu(0, MF_BYPOSITION);
langPath.Format(_T("%s\\*.lang"), (LPCTSTR)m_LangDir);
i = 0;
hFind = ::FindFirstFile(langPath, &findData);
if(hFind != INVALID_HANDLE_VALUE)
{
do{
if(findData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
{
// Add Language
CString cstr;
cstr = findData.cFileName;
#ifdef UNICODE
if (cstr.Find(_T("9x.lang")) >= 0)
{
continue;
}
#else
if (cstr.Find(_T("9x.lang")) == -1)
{
continue;
}
#endif
newItemID = WM_LANGUAGE_ID + i;
i++;
cstr.Format(_T("%s\\%s"), (LPCTSTR)m_LangDir, findData.cFileName);
GetPrivateProfileStringFx(_T("Language"), _T("LANGUAGE"), _T(""), str, 256, cstr);
if((ptrEnd = _tcsrchr(findData.cFileName, L'.')) != NULL)
{
*ptrEnd = '\0';
}
cstr.Format(_T("%s, [%s]"), str, findData.cFileName);
if(L'A' <= findData.cFileName[0] && findData.cFileName[0] <= L'N')
{
subMenuAN.AppendMenu(MF_STRING, (UINT_PTR)newItemID, cstr);
}
else
{
subMenuOZ.AppendMenu(MF_STRING, (UINT_PTR)newItemID, cstr);
}
m_MenuArrayLang.Add(findData.cFileName);
cstr = findData.cFileName;
#ifndef UNICODE
cstr.Replace(_T("9x"), _T(""));
#endif
if(m_CurrentLang.Compare(cstr) == 0)
{
currentItemID = newItemID;
FlagHitLang = TRUE;
}
}
}while(::FindNextFile(hFind, &findData) && i <= 0xFF);
}
FindClose(hFind);
subMenuAN.CheckMenuRadioItem(WM_LANGUAGE_ID, WM_LANGUAGE_ID + (UINT)m_MenuArrayLang.GetSize(),
currentItemID, MF_BYCOMMAND);
subMenuOZ.CheckMenuRadioItem(WM_LANGUAGE_ID, WM_LANGUAGE_ID + (UINT)m_MenuArrayLang.GetSize(),
currentItemID, MF_BYCOMMAND);
subMenuOZ.Detach();
subMenuAN.Detach();
subMenu.Detach();
menu.Detach();
if(! FlagHitLang)
{
AfxMessageBox(_T("FATAL ERROR: Missing Language File!!"));
}
}
BOOL CMainDialogFx::CheckThemeEdition(CString name)
{
if (name.Find(_T(".")) != 0) { return TRUE; }
return FALSE;
}
BOOL CMainDialogFx::OnInitDialog()
{
return CDialogFx::OnInitDialog();
}
void CMainDialogFx::ChangeTheme(CString themeName)
{
WritePrivateProfileStringFx(_T("Setting"), m_ThemeKeyName, themeName, m_Ini);
}
BOOL CMainDialogFx::OnCommand(WPARAM wParam, LPARAM lParam)
{
// Select Theme
if(WM_THEME_ID <= wParam && wParam < WM_THEME_ID + (WPARAM)m_MenuArrayTheme.GetSize())
{
CMenu menu;
CMenu subMenu;
menu.Attach(GetMenu()->GetSafeHmenu());
subMenu.Attach(menu.GetSubMenu(MENU_THEME_INDEX)->GetSafeHmenu());
m_CurrentTheme = m_MenuArrayTheme.GetAt(wParam - WM_THEME_ID);
if (m_CurrentTheme.Compare(m_RandomThemeLabel) == 0)
{
m_CurrentTheme = GetRandomTheme();
m_RandomThemeLabel = _T("Random");
m_RandomThemeName = _T(" (") + m_CurrentTheme + _T(")");
// ChangeTheme save the theme configuration to profile; so if we are on
// Random, then save Random to profile.
ChangeTheme(m_RandomThemeLabel);
}
else
{
ChangeTheme(m_MenuArrayTheme.GetAt(wParam - WM_THEME_ID));
m_RandomThemeName = _T("");
}
SUBMENU_MODIFY_MENU(WM_THEME_ID, MF_STRING, WM_THEME_ID, m_RandomThemeLabel + m_RandomThemeName);
subMenu.CheckMenuRadioItem(WM_THEME_ID, WM_THEME_ID + (UINT)m_MenuArrayTheme.GetSize(),
(UINT)wParam, MF_BYCOMMAND);
subMenu.Detach();
menu.Detach();
UpdateThemeInfo();
UpdateDialogSize();
}
return CDialogFx::OnCommand(wParam, lParam);
}
void CMainDialogFx::OnWindowPosChanging(WINDOWPOS * lpwndpos)
{
if(! m_bShowWindow)
{
lpwndpos->flags &= ~SWP_SHOWWINDOW;
}
if(m_bWindowMinimizeOnce && ! m_bInitializing)
{
m_bWindowMinimizeOnce = FALSE;
if(m_bResident && m_bResidentMinimize)
{
ShowWindow(SW_MINIMIZE);
}
}
CDialogFx::OnWindowPosChanging(lpwndpos);
}
void CMainDialogFx::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
lpMMI->ptMinTrackSize.x = m_MinSizeX;
lpMMI->ptMinTrackSize.y = m_MinSizeY;
lpMMI->ptMaxTrackSize.x = m_MaxSizeX;
lpMMI->ptMaxTrackSize.y = m_MaxSizeY;
CDialogFx::OnGetMinMaxInfo(lpMMI);
}
void CMainDialogFx::SaveWindowPosition()
{
WINDOWPLACEMENT place = { sizeof(WINDOWPLACEMENT) };
GetWindowPlacement(&place);
CString x, y;
x.Format(_T("%d"), place.rcNormalPosition.left);
y.Format(_T("%d"), place.rcNormalPosition.top);
WritePrivateProfileStringFx(_T("Setting"), _T("X"), x, m_Ini);
WritePrivateProfileStringFx(_T("Setting"), _T("Y"), y, m_Ini);
}
void CMainDialogFx::RestoreWindowPosition()
{
const int x = GetPrivateProfileInt(_T("Setting"), _T("X"), INT_MIN, m_Ini);
const int y = GetPrivateProfileInt(_T("Setting"), _T("Y"), INT_MIN, m_Ini);
RECT rw, rc;
GetWindowRect(&rw);
rc.left = x;
rc.top = y;
rc.right = x + rw.right - rw.left;
rc.bottom = y + rw.bottom - rw.top;
#if _MSC_VER > 1310
HMONITOR hMonitor = MonitorFromRect(&rc, MONITOR_DEFAULTTONULL);
if (hMonitor == NULL)
{
CenterWindow();
}
else
{
// Get Taskbar Size
APPBARDATA taskbarInfo = { 0 };
taskbarInfo.cbSize = sizeof(APPBARDATA);
taskbarInfo.hWnd = m_hWnd;
SHAppBarMessage(ABM_GETTASKBARPOS, &taskbarInfo);
CRect taskbarRect = taskbarInfo.rc;
if (taskbarInfo.rc.top <= 0 && taskbarInfo.rc.left <= 0) // Top Side or Left Side
{
if (taskbarRect.Height() > taskbarRect.Width()) // Left Side
{
if (x < taskbarRect.Width()) // Overlap
{
SetWindowPos(NULL, taskbarRect.Width(), y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
else
{
SetWindowPos(NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
}
else // Top Side
{
if (y < taskbarRect.Height()) // Overlap
{
SetWindowPos(NULL, x, taskbarRect.Height(), 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
else
{
SetWindowPos(NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
}
}
else
{
SetWindowPos(NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
}
#else
CenterWindow();
#endif
}
DWORD CMainDialogFx::GetZoomType()
{
return GetPrivateProfileInt(_T("Setting"), _T("ZoomType"), ZoomTypeAuto, m_Ini);
}
void CMainDialogFx::SetZoomType(DWORD zoomType)
{
CString cstr;
cstr.Format(_T("%d"), m_ZoomType);
WritePrivateProfileStringFx(_T("Setting"), _T("ZoomType"), cstr, m_Ini);
}
void CMainDialogFx::UpdateThemeInfo()
{
CString theme = m_ThemeDir + m_CurrentTheme + _T("\\theme.ini");
m_LabelText = GetControlColor(_T("LabelText"), 0, theme);
m_MeterText = GetControlColor(_T("MeterText"), 0, theme);
m_ComboText = GetControlColor(_T("ComboText"), 0, theme);
m_ComboTextSelected = GetControlColor(_T("ComboTextSelected"), 0, theme);
m_ComboBk = GetControlColor(_T("ComboBk"), 255, theme);
m_ComboBkSelected = GetControlColor(_T("ComboBkSelected"), 192, theme);
m_ButtonText= GetControlColor(_T("ButtonText"), 0, theme);
m_EditText = GetControlColor(_T("EditText"), 0, theme);
m_EditBk = GetControlColor(_T("EditBk"), 255, theme);
m_ListText1 = GetControlColor(_T("ListText1"), 0, theme);
m_ListText2 = GetControlColor(_T("ListText2"), 0, theme);
m_ListTextSelected = GetControlColor(_T("ListTextSelected"), 0, theme);
m_ListBk1 = GetControlColor(_T("ListBk1"), 255, theme);
m_ListBk2 = GetControlColor(_T("ListBk2"), 255, theme);
m_ListBkSelected = GetControlColor(_T("ListBkSelected"), 0, theme);
m_ListLine1 = GetControlColor(_T("ListLine1"), 0, theme);
m_ListLine2 = GetControlColor(_T("ListLine2"), 0, theme);
m_Glass = GetControlColor(_T("Glass"), 255, theme);
m_Frame = GetControlColor(_T("Frame"), 128, theme);
m_Background = GetBackgroundColor(_T("Background"), theme);
m_ComboAlpha = GetControlAlpha(_T("ComboAlpha"), 255, theme);
m_EditAlpha = GetControlAlpha(_T("EditAlpha"), 255, theme);
m_GlassAlpha = GetControlAlpha(_T("GlassAlpha"), 128, theme);
m_CharacterPosition = GetCharacterPosition(theme);
m_ParentTheme1 = GetParentTheme(1, theme);
m_ParentTheme2 = GetParentTheme(2, theme);
}
COLORREF CMainDialogFx::GetControlColor(CString name, BYTE defaultColor, CString theme)
{
COLORREF reverseColor;
reverseColor = GetPrivateProfileInt(_T("Color"), name, RGB(defaultColor, defaultColor, defaultColor), theme);
COLORREF color = RGB(GetBValue(reverseColor), GetGValue(reverseColor), GetRValue(reverseColor));
return color;
}
COLORREF CMainDialogFx::GetBackgroundColor(CString name, CString theme)
{
COLORREF reverseColor;
reverseColor = GetPrivateProfileInt(_T("Color"), name, 0xFFFFFFFF, theme);
if (reverseColor == 0xFFFFFFFF)
{
return 0xFFFFFFFF; // 0xFFFFFFF = Disabled
}
else
{
COLORREF color = RGB(GetBValue(reverseColor), GetGValue(reverseColor), GetRValue(reverseColor));
return color;
}
}
BYTE CMainDialogFx::GetControlAlpha(CString name, BYTE defaultAlpha, CString theme)
{
BYTE alpha = (BYTE)GetPrivateProfileInt(_T("Alpha"), name, defaultAlpha, theme);
return alpha;
}
BYTE CMainDialogFx::GetCharacterPosition(CString theme)
{
BYTE position = (BYTE)GetPrivateProfileInt(_T("Character"), _T("Position"), 0, theme);
return position;
}
CString CMainDialogFx::GetParentTheme(int i, CString theme)
{
CString cstr;
cstr.Format(_T("ParentTheme%d"), i);
TCHAR str[256];
GetPrivateProfileStringFx(_T("Info"), cstr, _T(""), str, 256, theme);
cstr = str;
return cstr;
}
CString CMainDialogFx::GetRandomTheme() {
// We need to add/subtract one to exclude first item ("Random").
UINT i = 1 + rand() % ((UINT)m_MenuArrayTheme.GetSize() - 1);
return m_MenuArrayTheme.GetAt(i);
}
void CMainDialogFx::SaveImage()
{
#if _MSC_VER > 1310
BOOL bDwmEnabled = FALSE;
HMODULE hModule = LoadLibraryEx(_T("dwmapi.dll"), NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
typedef HRESULT(WINAPI* FuncDwmGetWindowAttribute) (HWND hwnd, DWORD dwAttribute, PVOID pvAttribute, DWORD cbAttribute);
typedef HRESULT(WINAPI* FuncDwmIsCompositionEnabled)(BOOL* pfEnabled);
FuncDwmGetWindowAttribute pDwmGetWindowAttribute = NULL;
FuncDwmIsCompositionEnabled pDwmIsCompositionEnabled = NULL;
if (hModule)
{
pDwmGetWindowAttribute = (FuncDwmGetWindowAttribute)GetProcAddress(hModule, "DwmGetWindowAttribute");
pDwmIsCompositionEnabled = (FuncDwmIsCompositionEnabled)GetProcAddress(hModule, "DwmIsCompositionEnabled");
}
if (pDwmGetWindowAttribute && pDwmIsCompositionEnabled)
{
pDwmIsCompositionEnabled(&bDwmEnabled);
}
CRect rc1;
CRect rc2;
CRect rc3;
CImage* image1 = new CImage();
CImage* image2 = new CImage();
CImage* image3 = new CImage();
if (bDwmEnabled)
{
GetWindowRect(&rc1);
if (image1->Create(rc1.Width(), rc1.Height(), 32))
{
HDC hImage1DC = image1->GetDC();
if (IsWin81orLater())
{
::PrintWindow(m_hWnd, hImage1DC, 2); // PW_RENDERFULLCONTENT, Windows 8.1 or later
GetClientRect(&rc3);
if (image3->Create(rc3.Width(), rc3.Height(), 32))
{
HDC hImage3DC = image3->GetDC();
::PrintWindow(m_hWnd, hImage3DC, 1); // PW_CLIENTONLY
int targetY = 0;
int offsetX = (rc1.Width() - rc3.Width()) / 2;
int offsetY = (rc1.Height() - rc3.Height()) / 2;
// Compare Screenshot
for (int y = offsetY; y < rc1.Height() - rc3.Height(); y++)
{
for (int x = 0; x < rc3.Width(); x++)
{
if (image1->GetPixel(offsetX + x, y) == image3->GetPixel(x, 0))
{
if (x == rc3.Width() / 2)
{
for (int yy = 0; yy < rc3.Height(); yy++)
{
if (image1->GetPixel(offsetX, y + yy) == image3->GetPixel(0, yy))
{
if (yy == rc3.Height() / 2)
{
targetY = y;
goto loopEnd;
}
}
else
{
break;
}
}
}
}
else
{
break;
}
}
}
loopEnd:
if (targetY > 0)
{
::BitBlt(hImage1DC, (rc1.Width() - rc3.Width()) / 2, targetY, rc3.Width(), rc3.Height(), hImage3DC, 0, 0, SRCCOPY);
}
image3->ReleaseDC();
}
}
else
{
::PrintWindow(m_hWnd, hImage1DC, 0);
}
pDwmGetWindowAttribute(m_hWnd, DWMWA_EXTENDED_FRAME_BOUNDS, &rc2, sizeof(rc2));
// cstr.Format(_T("Width=%d/%d, Height=%d/%d"), rc1.Width(), rc2.Width(), rc1.Height(), rc2.Height());
// AfxMessageBox(cstr);
if (rc1.Width() > rc2.Width())
{
if (image2->Create(rc2.Width(), rc2.Height(), 32))
{
HDC hImage2DC = image2->GetDC();
::BitBlt(hImage2DC, 0, 0, rc2.Width(), rc2.Height(), hImage1DC, (rc1.Width() - rc2.Width()) / 2, 0, SRCCOPY);
image2->ReleaseDC();
SaveImageDlg(image2);
}
else
{
SaveImageDlg(image1);
}
}
else
{
SaveImageDlg(image1);
}
image1->ReleaseDC();
}
}
else
{
GetWindowRect(&rc1);
if (image1->Create(rc1.Width(), rc1.Height(), 32))
{
HDC hImage1DC = image1->GetDC();
::PrintWindow(m_hWnd, hImage1DC, 0);
SaveImageDlg(image1);
image1->ReleaseDC();
}
}
SAFE_DELETE(image1);
SAFE_DELETE(image2);
SAFE_DELETE(image3);
#endif
}
void CMainDialogFx::SaveImageDlg(CImage* image)
{
CString path;
SYSTEMTIME st;
GetLocalTime(&st);
path.Format(_T("%s_%04d%02d%02d%02d%02d%02d"), PRODUCT_FILENAME, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
CString filter = _T("PNG (*.png)|*.png|BMP (*.bmp)|*.bmp||");
CFileDialog save(FALSE, _T(""), path, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER, filter);
if (save.DoModal() == IDOK)
{
image->Save(save.GetPathName().GetString());
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//
// Task Tray
//
/////////////////////////////////////////////////////////////////////////////////////////////////
#ifdef OPTION_TASK_TRAY
UINT CMainDialogFx::wmTaskbarCreated = ::RegisterWindowMessage(_T("TaskbarCreated"));
// Add TaskTray
BOOL CMainDialogFx::AddTaskTray(UINT id, UINT callback, HICON icon, CString tip)
{
if(m_bResident)
{
NOTIFYICONDATA nidata = {0};
nidata.cbSize = sizeof(NOTIFYICONDATA);
nidata.hWnd = m_hWnd;
nidata.uID = id;
nidata.uFlags = NIF_TIP | NIF_ICON | NIF_MESSAGE;
nidata.hIcon = icon;
nidata.uVersion = NOTIFYICON_VERSION;
nidata.uCallbackMessage = callback;
_tcscpy_s(nidata.szTip, 128, tip.Left(127));
::Shell_NotifyIcon(NIM_SETVERSION, &nidata);
int waitCount = 10;
if(m_bStartup)
{
waitCount = 20;
}
for(int i = 0; i < waitCount; i++)
{
if(::Shell_NotifyIcon(NIM_ADD, &nidata))
{
return TRUE;
}
Sleep(100 * i);
}
}
return FALSE;
}
// Update TaskTray Icon
BOOL CMainDialogFx::ModifyTaskTrayIcon(UINT id, HICON icon)
{
if(m_bResident)
{
NOTIFYICONDATA nidata = { 0 };
nidata.cbSize = sizeof(NOTIFYICONDATA);
nidata.hWnd = m_hWnd;
nidata.uID = id;
nidata.uFlags = NIF_ICON;
nidata.hIcon = icon;
for(int i = 0; i < 3; i++)
{
if(::Shell_NotifyIcon(NIM_MODIFY, &nidata))
{
return TRUE;
}
Sleep(100 * i);
}
}
return FALSE;
}
// Update TaskTray Tips
BOOL CMainDialogFx::ModifyTaskTrayTip(UINT id, CString tip)
{
if(m_bResident)
{
NOTIFYICONDATA nidata = { 0 };
nidata.cbSize = sizeof(NOTIFYICONDATA);
nidata.hWnd = m_hWnd;
nidata.uID = id;
nidata.uFlags = NIF_TIP;
_tcscpy_s(nidata.szTip, 128, tip.Left(127));
for(int i = 0; i < 3; i++)
{
if(::Shell_NotifyIcon(NIM_MODIFY, &nidata))
{
return TRUE;
}
Sleep(100 * i);
}
}
return FALSE;
}
// Update TaskTray
BOOL CMainDialogFx::ModifyTaskTray(UINT id, HICON icon, CString tip)
{
if(m_bResident)
{
NOTIFYICONDATA nidata = { 0 };
nidata.cbSize = sizeof(NOTIFYICONDATA);
nidata.hWnd = m_hWnd;
nidata.uID = id;
nidata.uFlags = NIF_TIP|NIF_ICON;
nidata.hIcon = icon;
_tcscpy_s(nidata.szTip, 128, tip.Left(127));
for(int i = 0; i < 3; i++)
{
if(::Shell_NotifyIcon(NIM_MODIFY, &nidata))
{
return TRUE;
}
Sleep(100 * i);
}
}
return FALSE;
}
// Show Balloon
BOOL CMainDialogFx::ShowBalloon(UINT id, DWORD infoFlag, CString infoTitle, CString info)
{
if(m_bResident)
{
NOTIFYICONDATA nidata = { 0 };
nidata.cbSize = sizeof(NOTIFYICONDATA);
nidata.hWnd = m_hWnd;
nidata.uID = id;
nidata.uFlags = NIF_INFO;
nidata.dwInfoFlags = infoFlag;
_tcscpy_s(nidata.szInfo, 256, info.Left(255));
_tcscpy_s(nidata.szInfoTitle, 64, infoTitle.Left(63));
for(int i = 0; i < 3; i++)
{
if(::Shell_NotifyIcon(NIM_MODIFY, &nidata))
{
return TRUE;
}
Sleep(100 * i);
}
}
return FALSE;
}
// Remove TaskTray
BOOL CMainDialogFx::RemoveTaskTray(UINT id)
{
if(m_bResident)
{
NOTIFYICONDATA nidata = { 0 };
nidata.cbSize = sizeof(NOTIFYICONDATA);
nidata.hWnd = m_hWnd;
nidata.uID = id;
for(int i = 0; i < 3; i++)
{
if(::Shell_NotifyIcon(NIM_DELETE, &nidata))
{
return TRUE;
}
Sleep(100 * i);
}
}
return FALSE;
}
#endif