mirror of
https://github.com/reactos/reactos.git
synced 2024-08-20 18:35:32 +00:00
336 lines
9.7 KiB
C
336 lines
9.7 KiB
C
/*
|
|
* Star field screensaver
|
|
*
|
|
* Copyright 2011 Carlo Bramini
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
#include <tchar.h>
|
|
#include <commctrl.h>
|
|
#include <shellapi.h>
|
|
|
|
#include "resource.h"
|
|
#include "settings.h"
|
|
|
|
#define SIZEOF(_v) (sizeof(_v) / sizeof(*_v))
|
|
|
|
// Options for the starfield
|
|
SSSTARS Settings;
|
|
|
|
// Factory default settings.
|
|
static const SSSTARS FactoryDefaults = {
|
|
MAX_STARS,
|
|
20,
|
|
ROTATION_PERIODIC,
|
|
|
|
TRUE,
|
|
TRUE,
|
|
TRUE,
|
|
TRUE
|
|
};
|
|
|
|
static const DWORD RotoStrings[] = {
|
|
IDS_ROTATION_NONE,
|
|
IDS_ROTATION_LINEAR,
|
|
IDS_ROTATION_PERIODIC
|
|
};
|
|
|
|
static DWORD QueryDWORD(HKEY hKey, LPCTSTR pszValueName, DWORD Default)
|
|
{
|
|
DWORD dwData, dwType, cbData;
|
|
LONG lRes;
|
|
|
|
dwType = REG_DWORD;
|
|
cbData = sizeof(DWORD);
|
|
|
|
lRes = RegQueryValueEx(
|
|
hKey,
|
|
pszValueName,
|
|
NULL,
|
|
&dwType,
|
|
(LPBYTE)&dwData,
|
|
&cbData);
|
|
|
|
if (lRes != ERROR_SUCCESS || dwType != REG_DWORD)
|
|
return Default;
|
|
|
|
return dwData;
|
|
}
|
|
|
|
static void SaveDWORD(HKEY hKey, LPCTSTR pszValueName, DWORD dwValue)
|
|
{
|
|
RegSetValueEx(hKey, pszValueName, 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(dwValue));
|
|
}
|
|
|
|
|
|
void LoadSettings(void)
|
|
{
|
|
HKEY hKey;
|
|
LONG lRes;
|
|
|
|
Settings = FactoryDefaults;
|
|
|
|
lRes = RegCreateKeyEx(
|
|
HKEY_CURRENT_USER,
|
|
_T("Software\\Microsoft\\ScreenSavers\\Ssstars"),
|
|
0,
|
|
_T(""),
|
|
0,
|
|
KEY_READ,
|
|
NULL,
|
|
&hKey,
|
|
NULL);
|
|
|
|
if (lRes != ERROR_SUCCESS)
|
|
return;
|
|
|
|
Settings.uiNumStars = QueryDWORD(hKey, _T("NumberOfStars"), Settings.uiNumStars);
|
|
Settings.uiSpeed = QueryDWORD(hKey, _T("Speed"), Settings.uiSpeed);
|
|
Settings.uiRotation = QueryDWORD(hKey, _T("TypeOfRotation"), Settings.uiRotation);
|
|
|
|
Settings.bDoBlending = QueryDWORD(hKey, _T("DoBlending"), Settings.bDoBlending);
|
|
Settings.bFinePerspective = QueryDWORD(hKey, _T("FinePerspective"), Settings.bFinePerspective);
|
|
Settings.bEnableFiltering = QueryDWORD(hKey, _T("EnableFiltering"), Settings.bEnableFiltering);
|
|
Settings.bSmoothShading = QueryDWORD(hKey, _T("SmoothShading"), Settings.bSmoothShading);
|
|
|
|
// Check the number of stars to be in range
|
|
if (Settings.uiNumStars < MIN_STARS)
|
|
Settings.uiNumStars = MIN_STARS;
|
|
else
|
|
if (Settings.uiNumStars > MAX_STARS)
|
|
Settings.uiNumStars = MAX_STARS;
|
|
|
|
// Check the speed to be in range
|
|
if (Settings.uiSpeed < MIN_SPEED)
|
|
Settings.uiSpeed = MIN_SPEED;
|
|
else
|
|
if (Settings.uiSpeed > MAX_SPEED)
|
|
Settings.uiSpeed = MAX_SPEED;
|
|
|
|
// Check type of rotation to be in range
|
|
if (Settings.uiRotation != ROTATION_NONE &&
|
|
Settings.uiRotation != ROTATION_LINEAR &&
|
|
Settings.uiRotation != ROTATION_PERIODIC)
|
|
Settings.uiRotation = ROTATION_PERIODIC;
|
|
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
void SaveSettings(void)
|
|
{
|
|
HKEY hKey;
|
|
LONG lRes;
|
|
|
|
lRes = RegCreateKeyEx(
|
|
HKEY_CURRENT_USER,
|
|
_T("Software\\Microsoft\\ScreenSavers\\Ssstars"),
|
|
0,
|
|
_T(""),
|
|
0,
|
|
KEY_WRITE,
|
|
NULL,
|
|
&hKey,
|
|
NULL);
|
|
|
|
if (lRes != ERROR_SUCCESS)
|
|
return;
|
|
|
|
SaveDWORD(hKey, _T("NumberOfStars"), Settings.uiNumStars);
|
|
SaveDWORD(hKey, _T("Speed"), Settings.uiSpeed);
|
|
SaveDWORD(hKey, _T("TypeOfRotation"), Settings.uiRotation);
|
|
|
|
SaveDWORD(hKey, _T("DoBlending"), Settings.bDoBlending);
|
|
SaveDWORD(hKey, _T("FinePerspective"), Settings.bFinePerspective);
|
|
SaveDWORD(hKey, _T("EnableFiltering"), Settings.bEnableFiltering);
|
|
SaveDWORD(hKey, _T("SmoothShading"), Settings.bSmoothShading);
|
|
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
static void SetupControls(HWND hWnd)
|
|
{
|
|
TCHAR Strings[256];
|
|
HINSTANCE hInstance;
|
|
UINT x, gap;
|
|
LOGFONT lf;
|
|
HFONT hFont;
|
|
HBITMAP hCosmos;
|
|
HDC hDC, hMemDC;
|
|
HGDIOBJ hOldBmp, hOldFnt;
|
|
SIZE sizeReactOS;
|
|
SIZE sizeStarfield;
|
|
BITMAP bm;
|
|
|
|
hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
|
|
|
|
SendDlgItemMessage(hWnd, IDC_SLIDER_NUM_OF_STARS, TBM_SETRANGE, FALSE, MAKELPARAM(MIN_STARS, MAX_STARS));
|
|
|
|
SendDlgItemMessage(hWnd, IDC_SLIDER_SPEED, TBM_SETRANGE, FALSE, MAKELPARAM(1, 100));
|
|
|
|
for (x = 0; x < ROTATION_ITEMS; x++)
|
|
{
|
|
LoadString(hInstance, RotoStrings[x], Strings, sizeof(Strings)/sizeof(TCHAR));
|
|
SendDlgItemMessage(hWnd, IDC_COMBO_ROTATION, CB_ADDSTRING, 0, (LPARAM)Strings);
|
|
}
|
|
|
|
hCosmos = LoadImage(hInstance, MAKEINTRESOURCE(IDB_COSMOS), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
|
|
|
|
hDC = GetDC(hWnd);
|
|
hMemDC = CreateCompatibleDC(hDC);
|
|
|
|
// Create the font for the title
|
|
ZeroMemory(&lf, sizeof(lf));
|
|
|
|
lf.lfWeight = FW_THIN;
|
|
lf.lfCharSet = ANSI_CHARSET;
|
|
lf.lfQuality = PROOF_QUALITY;
|
|
lf.lfHeight = 36;
|
|
_tcscpy(lf.lfFaceName, _T("Tahoma"));
|
|
|
|
hFont = CreateFontIndirect(&lf);
|
|
|
|
hOldBmp = SelectObject(hMemDC, hCosmos);
|
|
hOldFnt = SelectObject(hMemDC, hFont);
|
|
|
|
SetBkMode(hMemDC, TRANSPARENT);
|
|
SetTextColor(hMemDC, RGB(0xFF, 0xFF, 0xFF));
|
|
|
|
x = LoadString(hInstance, IDS_DESCRIPTION, Strings, sizeof(Strings)/sizeof(TCHAR));
|
|
|
|
GetTextExtentPoint32(hMemDC, _T("ReactOS"), 7, &sizeReactOS);
|
|
GetTextExtentPoint32(hMemDC, Strings, x, &sizeStarfield);
|
|
|
|
GetObject(hCosmos, sizeof(BITMAP), &bm);
|
|
|
|
gap = bm.bmHeight - sizeReactOS.cy - sizeStarfield.cy;
|
|
|
|
TextOut(hMemDC, 16, gap * 2 / 5, _T("ReactOS"), 7);
|
|
TextOut(hMemDC, 16, gap * 3 / 5 + sizeReactOS.cy, Strings, x);
|
|
|
|
SelectObject(hMemDC, hOldBmp);
|
|
SelectObject(hMemDC, hOldFnt);
|
|
|
|
DeleteObject(hFont);
|
|
|
|
DeleteDC(hMemDC);
|
|
ReleaseDC(hWnd, hDC);
|
|
|
|
SendDlgItemMessage(hWnd, IDC_IMAGE_COSMOS, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hCosmos);
|
|
}
|
|
|
|
static void ApplySettings(HWND hWnd)
|
|
{
|
|
SendDlgItemMessage(hWnd, IDC_SLIDER_NUM_OF_STARS, TBM_SETPOS, TRUE, Settings.uiNumStars);
|
|
SetDlgItemInt(hWnd, IDC_TEXT_NUM_OF_STARS, Settings.uiNumStars, FALSE);
|
|
|
|
SendDlgItemMessage(hWnd, IDC_SLIDER_SPEED, TBM_SETPOS, TRUE, Settings.uiSpeed);
|
|
SetDlgItemInt(hWnd, IDC_TEXT_SPEED, Settings.uiSpeed, FALSE);
|
|
|
|
SendDlgItemMessage(hWnd, IDC_COMBO_ROTATION, CB_SETCURSEL, (WPARAM)Settings.uiRotation, 0);
|
|
|
|
SendDlgItemMessage(hWnd, IDC_CHECK_DOBLENDING, BM_SETCHECK, (WPARAM)Settings.bDoBlending, 0);
|
|
SendDlgItemMessage(hWnd, IDC_CHECK_PERSPECTIVE, BM_SETCHECK, (WPARAM)Settings.bFinePerspective, 0);
|
|
SendDlgItemMessage(hWnd, IDC_CHECK_FILTERING, BM_SETCHECK, (WPARAM)Settings.bEnableFiltering, 0);
|
|
SendDlgItemMessage(hWnd, IDC_CHECK_SHADING, BM_SETCHECK, (WPARAM)Settings.bSmoothShading, 0);
|
|
}
|
|
|
|
static void ReadSettings(HWND hWnd)
|
|
{
|
|
Settings.uiNumStars = SendDlgItemMessage(hWnd, IDC_SLIDER_NUM_OF_STARS, TBM_GETPOS, 0, 0);
|
|
SetDlgItemInt(hWnd, IDC_TEXT_NUM_OF_STARS, Settings.uiNumStars, FALSE);
|
|
|
|
Settings.uiSpeed = SendDlgItemMessage(hWnd, IDC_SLIDER_SPEED, TBM_GETPOS, 0, 0);
|
|
SetDlgItemInt(hWnd, IDC_TEXT_SPEED, Settings.uiSpeed, FALSE);
|
|
|
|
Settings.uiRotation = SendDlgItemMessage(hWnd, IDC_COMBO_ROTATION, CB_GETCURSEL, 0, 0);
|
|
|
|
Settings.bDoBlending = SendDlgItemMessage(hWnd, IDC_CHECK_DOBLENDING, BM_GETCHECK, 0, 0);
|
|
Settings.bFinePerspective = SendDlgItemMessage(hWnd, IDC_CHECK_PERSPECTIVE, BM_GETCHECK, 0, 0);
|
|
Settings.bEnableFiltering = SendDlgItemMessage(hWnd, IDC_CHECK_FILTERING, BM_GETCHECK, 0, 0);
|
|
Settings.bSmoothShading = SendDlgItemMessage(hWnd, IDC_CHECK_SHADING, BM_GETCHECK, 0, 0);
|
|
}
|
|
|
|
static BOOL OnCommandAbout(HWND hWnd)
|
|
{
|
|
HINSTANCE hInstance;
|
|
HICON hIcon;
|
|
TCHAR szAppName[256];
|
|
TCHAR szAuthor[256];
|
|
TCHAR szLicense[1024];
|
|
|
|
hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
|
|
|
|
hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_STARFIELD));
|
|
|
|
LoadString(hInstance, IDS_DESCRIPTION, szAppName, SIZEOF(szAppName));
|
|
LoadString(hInstance, IDS_AUTHOR, szAuthor, SIZEOF(szAuthor));
|
|
LoadString(hInstance, IDS_LICENSE, szLicense, SIZEOF(szLicense));
|
|
|
|
_tcscat(szAppName, _T("#"));
|
|
_tcscat(szAppName, szAuthor);
|
|
|
|
ShellAbout(hWnd, szAppName, szLicense, hIcon);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// Dialogbox procedure for Configuration window
|
|
//
|
|
BOOL CALLBACK ScreenSaverConfigureDialog(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (uMsg) {
|
|
case WM_INITDIALOG:
|
|
LoadSettings();
|
|
SetupControls(hDlg);
|
|
ApplySettings(hDlg);
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD( wParam )) {
|
|
|
|
case IDOK:
|
|
// Write configuration
|
|
SaveSettings();
|
|
|
|
// Fall down...
|
|
case IDCANCEL:
|
|
EndDialog( hDlg, LOWORD( wParam ));
|
|
return TRUE;
|
|
|
|
case IDC_BUTTON_ABOUT:
|
|
return OnCommandAbout(hDlg);
|
|
}
|
|
|
|
case WM_HSCROLL:
|
|
ReadSettings(hDlg);
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
|
|
{
|
|
InitCommonControls();
|
|
|
|
return TRUE;
|
|
}
|
|
|