⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 options.cpp

📁 PPC流行的播放软件gsplayer源码2.24版
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#include "GSPlayer2.h"
#include "MainWnd.h"
#include "Options.h"

#define	NAME_WINDOW_TOPMOST	_T("Window Top Most")
#define	NAME_WINDOW_LEFT	_T("Window Left")
#define	NAME_WINDOW_TOP		_T("Window Top")
#define NAME_PLAY_REPEAT	_T("Repeat")
#define NAME_PLAY_SHUFFLE	_T("Shuffle")
#define NAME_LAST_DIR		_T("LastDir")
#define NAME_SKIN_FILE		_T("SkinFile")
#define NAME_SURROUND_ENABLE	_T("SurroundEnable")
#define NAME_SURROUND_RATE		_T("SurroundRate")
#define NAME_EQ_ENABLE			_T("EqEnable")
#define NAME_EQ_PREAMP			_T("Preamp")
#define NAME_EQ_BANK1			_T("EqBank1")
#define NAME_EQ_BANK2			_T("EqBank2")
#define NAME_EQ_BANK3			_T("EqBank3")
#define NAME_EQ_BANK4			_T("EqBank4")
#define NAME_EQ_BANK5			_T("EqBank5")
#define NAME_EQ_BANK6			_T("EqBank6")
#define NAME_EQ_BANK7			_T("EqBank7")
#define NAME_EQ_BANK8			_T("EqBank8")
#define NAME_EQ_BANK9			_T("EqBank9")
#define NAME_EQ_BANK10			_T("EqBank10")
#define NAME_BASSBOOST			_T("BassBoost")
#define NAME_3DCHORUS_ENABLE	_T("3DChorusEnable")
#define NAME_3DCHORUS_RATE		_T("3DChorusRate")
#define NAME_REVERB_ENABLE		_T("ReverbEnable")
#define NAME_REVERB_RATE		_T("ReverbRate")
#define NAME_REVERB_DELAY		_T("ReverbDelay")
#define NAME_ECHO_ENABLE		_T("EchoEnable")
#define NAME_ECHO_RATE			_T("EchoRate")
#define NAME_ECHO_DELAY			_T("EchoDelay")
#define NAME_DRAW_PEEK			_T("DrawPeek")
#define NAME_TIME_REVERSE		_T("TimeReverse")
#define NAME_SAVE_DEFLIST		_T("SaveDefPlayList")
#define NAME_ADD_EXISTING		_T("AddExisting")
#define NAME_RESUME				_T("Resume")
#define NAME_RESUME_TRACK		_T("ResumeTrack")
#define NAME_RESUME_TIME		_T("ResumeTime")
#define NAME_PLAYONSTART		_T("PlayOnStart")
#define NAME_TRAYICON			_T("TrayIcon")
#define NAME_SEARCHSUBFOLDERS	_T("SearchSubFolders")
#define NAME_SCROLLTITLE		_T("ScrollTitle")
#define NAME_OUTPUT_BUFF		_T("OutputBufferLen")
#define NAME_OUTPUT_PREBUFF		_T("OutputPrebuffer")
#define NAME_OUTPUT_FADE		_T("OutputFade")
#define NAME_SCAN_COMPLETELY	_T("ScanCompletely")
#define NAME_SUPPRESS_ZERO		_T("SuppressZeroSamples")
#define NAME_ALWAYSOPENDEV		_T("AlwaysOpenDev")
#define NAME_STREAMING_BUFF		_T("StreamingBuffer")
#define NAME_STREAMING_PREBUFF	_T("StreamingPreBuffer")
#define NAME_STREAMING_PROXY	_T("StreamingProxy")
#define NAME_STREAMING_USEPROXY	_T("StreamingUseProxy")
#define NAME_SLEEP_MINUTES		_T("SleepMinutes")
#define NAME_SLEEP_POWEROFF		_T("SleepPowerOff")

#define MAX_LOCATION			5
#define KEY_LOCATION			_T("Software\\GreenSoftware\\GSPlayer\\MP3\\Location")
#define NAME_LOCATION			_T("Location")

#define KEY_AUDIOFILE			_T("GSPlayer AudioFile")
#define NAME_AUDIOFILE			_T("Audio File")
#define KEY_PLAYLIST			_T("GSPlayer Playlist")
#define NAME_PLAYLIST			_T("Play List File")
#define VALUE_BACKUP			_T("GSPlayer Backup")

#define OUTPUT_BUFF_MAX			5000
#define OUTPUT_BUFF_MIN			20
#define OUTPUT_PREBUFF_MAX		100
#define OUTPUT_PREBUFF_MIN		0
#define STREAMING_BUFF_MAX		1024
#define STREAMING_BUFF_MIN		4

#ifndef ListView_SetCheckState
#define ListView_SetCheckState(hwndLV, i, fCheck) \
   ListView_SetItemState(hwndLV, i, INDEXTOSTATEIMAGEMASK((fCheck)?2:1), LVIS_STATEIMAGEMASK)
#endif

#ifndef ListView_GetCheckState
#define ListView_GetCheckState(hwndLV, i) \
   ((((UINT)(SNDMSG((hwndLV), LVM_GETITEMSTATE, (WPARAM)i, LVIS_STATEIMAGEMASK))) >> 12) -1)
#endif

COptions::COptions()
{
	m_fTopMost = FALSE;
	m_ptInitWnd.x = (GetSystemMetrics(SM_CXSCREEN) - MAINWND_WIDTH) / 2;
	m_ptInitWnd.y = (GetSystemMetrics(SM_CYSCREEN) - MAINWND_HEIGHT) / 2;
	*m_szLastDir = NULL;
	*m_szSkinFile = NULL;
	m_fDrawPeek = FALSE;
	m_fShuffle = FALSE;
	m_fRepeat = RepeatNone;
	m_fResume = FALSE;
	m_fPlayOnStart = FALSE;
	m_fTimeReverse = FALSE;
	m_fSaveDefList = TRUE;
	m_fAddExisting = FALSE;
	m_fTrayIcon = FALSE;
	m_fSearchSubFolders = FALSE;
#ifdef _WIN32_WCE
	m_fScrollTitle = FALSE;
#else
	m_fScrollTitle = TRUE;
#endif

	m_nSleepMinutes = 30;
	m_fSleepPowerOff = TRUE;
	m_nSleepTime= -1;
	m_dwSleepLast = 0;

	m_nResumeTrack = -1;
	m_nResumeTime = 0;

	m_hMap = NULL;
	m_pszLocation = NULL;
}

COptions::~COptions()
{
}

void COptions::Load(HANDLE hMap)
{
	HKEY hKey = 0;
	TCHAR szProxy[MAX_URL] = {0};
	MAP_GetOptions(hMap, &m_Options);
	MAP_GetStreamingOptions(hMap, &m_StreamingOptions);
	if (RegOpenKeyEx(HKEY_CURRENT_USER, KEY_SETTINGS, 
						0, KEY_READ, &hKey) == ERROR_SUCCESS) {

		DWORD dwType, dwBuff, dwSize;
		dwSize = sizeof(dwBuff);

		// effect
		EFFECT effect;
		if (RegQueryValueEx(hKey, NAME_SURROUND_ENABLE, 0, &dwType, (LPBYTE)&effect.fEnable, &dwSize) != ERROR_SUCCESS)
			effect.fEnable = FALSE;
		if (RegQueryValueEx(hKey, NAME_SURROUND_RATE, 0, &dwType, (LPBYTE)&effect.nRate, &dwSize) != ERROR_SUCCESS)
			effect.nRate = 25;
		MAP_SetEffect(hMap, EFFECT_SURROUND, &effect);

		if (RegQueryValueEx(hKey, NAME_3DCHORUS_ENABLE, 0, &dwType, (LPBYTE)&effect.fEnable, &dwSize) != ERROR_SUCCESS)
			effect.fEnable = FALSE;
		if (RegQueryValueEx(hKey, NAME_3DCHORUS_RATE, 0, &dwType, (LPBYTE)&effect.nRate, &dwSize) != ERROR_SUCCESS)
			effect.nRate = 2;
		MAP_SetEffect(hMap, EFFECT_3DCHORUS, &effect);

		if (RegQueryValueEx(hKey, NAME_REVERB_ENABLE, 0, &dwType, (LPBYTE)&effect.fEnable, &dwSize) != ERROR_SUCCESS)
			effect.fEnable = FALSE;
		if (RegQueryValueEx(hKey, NAME_REVERB_RATE, 0, &dwType, (LPBYTE)&effect.nRate, &dwSize) != ERROR_SUCCESS)
			effect.nRate = 20;
		if (RegQueryValueEx(hKey, NAME_REVERB_DELAY, 0, &dwType, (LPBYTE)&effect.nDelay, &dwSize) != ERROR_SUCCESS)
			effect.nDelay = 100;
		MAP_SetEffect(hMap, EFFECT_REVERB, &effect);

		if (RegQueryValueEx(hKey, NAME_ECHO_ENABLE, 0, &dwType, (LPBYTE)&effect.fEnable, &dwSize) != ERROR_SUCCESS)
			effect.fEnable = FALSE;
		if (RegQueryValueEx(hKey, NAME_ECHO_RATE, 0, &dwType, (LPBYTE)&effect.nRate, &dwSize) != ERROR_SUCCESS)
			effect.nRate = 20;
		if (RegQueryValueEx(hKey, NAME_ECHO_DELAY, 0, &dwType, (LPBYTE)&effect.nDelay, &dwSize) != ERROR_SUCCESS)
			effect.nDelay = 100;
		MAP_SetEffect(hMap, EFFECT_ECHO, &effect);

		EQUALIZER eq;
		if (RegQueryValueEx(hKey, NAME_EQ_ENABLE, 0, &dwType, (LPBYTE)&eq.fEnable, &dwSize) != ERROR_SUCCESS)
			eq.fEnable = FALSE;
		if (RegQueryValueEx(hKey, NAME_EQ_PREAMP, 0, &dwType, (LPBYTE)&eq.preamp, &dwSize) != ERROR_SUCCESS)
			eq.preamp = 31;
		if (RegQueryValueEx(hKey, NAME_EQ_BANK1, 0, &dwType, (LPBYTE)&eq.data[0], &dwSize) != ERROR_SUCCESS)
			eq.data[0] = 31;
		if (RegQueryValueEx(hKey, NAME_EQ_BANK2, 0, &dwType, (LPBYTE)&eq.data[1], &dwSize) != ERROR_SUCCESS)
			eq.data[1] = 31;
		if (RegQueryValueEx(hKey, NAME_EQ_BANK3, 0, &dwType, (LPBYTE)&eq.data[2], &dwSize) != ERROR_SUCCESS)
			eq.data[2] = 31;
		if (RegQueryValueEx(hKey, NAME_EQ_BANK4, 0, &dwType, (LPBYTE)&eq.data[3], &dwSize) != ERROR_SUCCESS)
			eq.data[3] = 31;
		if (RegQueryValueEx(hKey, NAME_EQ_BANK5, 0, &dwType, (LPBYTE)&eq.data[4], &dwSize) != ERROR_SUCCESS)
			eq.data[4] = 31;
		if (RegQueryValueEx(hKey, NAME_EQ_BANK6, 0, &dwType, (LPBYTE)&eq.data[5], &dwSize) != ERROR_SUCCESS)
			eq.data[5] = 31;
		if (RegQueryValueEx(hKey, NAME_EQ_BANK7, 0, &dwType, (LPBYTE)&eq.data[6], &dwSize) != ERROR_SUCCESS)
			eq.data[6] = 31;
		if (RegQueryValueEx(hKey, NAME_EQ_BANK8, 0, &dwType, (LPBYTE)&eq.data[7], &dwSize) != ERROR_SUCCESS)
			eq.data[7] = 31;
		if (RegQueryValueEx(hKey, NAME_EQ_BANK9, 0, &dwType, (LPBYTE)&eq.data[8], &dwSize) != ERROR_SUCCESS)
			eq.data[8] = 31;
		if (RegQueryValueEx(hKey, NAME_EQ_BANK10, 0, &dwType, (LPBYTE)&eq.data[9], &dwSize) != ERROR_SUCCESS)
			eq.data[9] = 31;
		MAP_SetEqualizer(hMap, &eq);

		// bassboost
		int nLevel;
		if (RegQueryValueEx(hKey, NAME_BASSBOOST, 0, &dwType, (LPBYTE)&nLevel, &dwSize) != ERROR_SUCCESS)
			nLevel = 0;
		MAP_SetBassBoostLevel(hMap, nLevel);

		// window positions
		if (RegQueryValueEx(hKey, NAME_WINDOW_TOPMOST, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fTopMost = dwBuff;
		if (RegQueryValueEx(hKey, NAME_WINDOW_LEFT, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_ptInitWnd.x = dwBuff;
		if (RegQueryValueEx(hKey, NAME_WINDOW_TOP, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_ptInitWnd.y = dwBuff;

		// general settings
		if (RegQueryValueEx(hKey, NAME_PLAY_REPEAT, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fRepeat = dwBuff;
		if (RegQueryValueEx(hKey, NAME_PLAY_SHUFFLE, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fShuffle = dwBuff;
		if (RegQueryValueEx(hKey, NAME_DRAW_PEEK, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fDrawPeek = dwBuff;
		if (RegQueryValueEx(hKey, NAME_TIME_REVERSE, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fTimeReverse = dwBuff;
		if (RegQueryValueEx(hKey, NAME_SAVE_DEFLIST, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fSaveDefList = dwBuff;
		if (RegQueryValueEx(hKey, NAME_ADD_EXISTING, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fAddExisting = dwBuff;
		if (RegQueryValueEx(hKey, NAME_RESUME, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fResume = dwBuff;
		if (RegQueryValueEx(hKey, NAME_RESUME_TRACK, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_nResumeTrack = dwBuff;
		if (RegQueryValueEx(hKey, NAME_RESUME_TIME, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_nResumeTime = dwBuff;
		if (RegQueryValueEx(hKey, NAME_PLAYONSTART, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fPlayOnStart = dwBuff;
		if (RegQueryValueEx(hKey, NAME_TRAYICON, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fTrayIcon = dwBuff;
		if (RegQueryValueEx(hKey, NAME_SEARCHSUBFOLDERS, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fSearchSubFolders = dwBuff;
		if (RegQueryValueEx(hKey, NAME_SCROLLTITLE, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fScrollTitle = dwBuff;
		if (RegQueryValueEx(hKey, NAME_SLEEP_MINUTES, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_nSleepMinutes = dwBuff;
#ifdef _WIN32_WCE
		if (RegQueryValueEx(hKey, NAME_SLEEP_POWEROFF, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_fSleepPowerOff = dwBuff;
#endif


		MAP_SetScanPeek(hMap, m_fDrawPeek);

		// decoder
		if (RegQueryValueEx(hKey, NAME_OUTPUT_BUFF, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_Options.nOutputBufferLen = dwBuff;
		if (RegQueryValueEx(hKey, NAME_OUTPUT_PREBUFF, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_Options.nOutputPrebuffer = dwBuff;
		if (RegQueryValueEx(hKey, NAME_OUTPUT_FADE, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_Options.fFadeIn = dwBuff;
		if (RegQueryValueEx(hKey, NAME_SCAN_COMPLETELY, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_Options.fScanMpegCompletely = dwBuff;
		if (RegQueryValueEx(hKey, NAME_SUPPRESS_ZERO, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_Options.fSuppressZeroSamples = dwBuff;
		if (RegQueryValueEx(hKey, NAME_ALWAYSOPENDEV, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_Options.fAlwaysOpenDevice = dwBuff;

		dwSize = sizeof(m_szLastDir);
		if (RegQueryValueEx(hKey, NAME_LAST_DIR, 0, &dwType, (LPBYTE)&m_szLastDir, &dwSize) != ERROR_SUCCESS)
			*m_szLastDir = NULL;

		// skin
		dwSize = sizeof(m_szSkinFile);
		if (RegQueryValueEx(hKey, NAME_SKIN_FILE, 0, &dwType, (LPBYTE)&m_szSkinFile, &dwSize) != ERROR_SUCCESS)
			*m_szSkinFile = NULL;

		// streaming
		dwSize = sizeof(dwBuff);
		if (RegQueryValueEx(hKey, NAME_STREAMING_BUFF, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_StreamingOptions.nBuf = dwBuff;
		if (RegQueryValueEx(hKey, NAME_STREAMING_PREBUFF, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_StreamingOptions.nPreBuf = dwBuff;
		if (RegQueryValueEx(hKey, NAME_STREAMING_USEPROXY, 0, &dwType, (LPBYTE)&dwBuff, &dwSize) == ERROR_SUCCESS)
			m_StreamingOptions.fUseProxy = dwBuff;

		dwSize = sizeof(szProxy);
		if (RegQueryValueEx(hKey, NAME_STREAMING_PROXY, 0, &dwType, (LPBYTE)&szProxy, &dwSize) != ERROR_SUCCESS)
			*szProxy = NULL;
		_tcscpy(m_StreamingOptions.szProxy, szProxy);

		RegCloseKey(hKey);
	}

	MAP_SetOptions(hMap, &m_Options);
	MAP_SetStreamingOptions(hMap, &m_StreamingOptions);
}

void COptions::Save(HANDLE hMap)
{
	HKEY hKey = 0;
	DWORD dwDisposition;
	if (RegCreateKeyEx(HKEY_CURRENT_USER, KEY_SETTINGS, 0, NULL, 
		REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) {

		// effect
		EFFECT effect;
		MAP_GetEffect(hMap, EFFECT_SURROUND, &effect);
		RegSetValueEx(hKey, NAME_SURROUND_ENABLE, 0, REG_DWORD, (LPBYTE)&effect.fEnable, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_SURROUND_RATE, 0, REG_DWORD, (LPBYTE)&effect.nRate, sizeof(DWORD));
		MAP_GetEffect(hMap, EFFECT_3DCHORUS, &effect);
		RegSetValueEx(hKey, NAME_3DCHORUS_ENABLE, 0, REG_DWORD, (LPBYTE)&effect.fEnable, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_3DCHORUS_RATE, 0, REG_DWORD, (LPBYTE)&effect.nRate, sizeof(DWORD));
		MAP_GetEffect(hMap, EFFECT_REVERB, &effect);
		RegSetValueEx(hKey, NAME_REVERB_ENABLE, 0, REG_DWORD, (LPBYTE)&effect.fEnable, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_REVERB_DELAY, 0, REG_DWORD, (LPBYTE)&effect.nDelay, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_REVERB_RATE, 0, REG_DWORD, (LPBYTE)&effect.nRate, sizeof(DWORD));
		MAP_GetEffect(hMap, EFFECT_ECHO, &effect);
		RegSetValueEx(hKey, NAME_ECHO_ENABLE, 0, REG_DWORD, (LPBYTE)&effect.fEnable, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_ECHO_DELAY, 0, REG_DWORD, (LPBYTE)&effect.nDelay, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_ECHO_RATE, 0, REG_DWORD, (LPBYTE)&effect.nRate, sizeof(DWORD));

		EQUALIZER eq;
		MAP_GetEqualizer(hMap, &eq);
		RegSetValueEx(hKey, NAME_EQ_ENABLE, 0, REG_DWORD, (LPBYTE)&eq.fEnable, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_EQ_PREAMP, 0, REG_DWORD, (LPBYTE)&eq.preamp, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_EQ_BANK1, 0, REG_DWORD, (LPBYTE)&eq.data[0], sizeof(DWORD));
		RegSetValueEx(hKey, NAME_EQ_BANK2, 0, REG_DWORD, (LPBYTE)&eq.data[1], sizeof(DWORD));
		RegSetValueEx(hKey, NAME_EQ_BANK3, 0, REG_DWORD, (LPBYTE)&eq.data[2], sizeof(DWORD));
		RegSetValueEx(hKey, NAME_EQ_BANK4, 0, REG_DWORD, (LPBYTE)&eq.data[3], sizeof(DWORD));
		RegSetValueEx(hKey, NAME_EQ_BANK5, 0, REG_DWORD, (LPBYTE)&eq.data[4], sizeof(DWORD));
		RegSetValueEx(hKey, NAME_EQ_BANK6, 0, REG_DWORD, (LPBYTE)&eq.data[5], sizeof(DWORD));
		RegSetValueEx(hKey, NAME_EQ_BANK7, 0, REG_DWORD, (LPBYTE)&eq.data[6], sizeof(DWORD));
		RegSetValueEx(hKey, NAME_EQ_BANK8, 0, REG_DWORD, (LPBYTE)&eq.data[7], sizeof(DWORD));
		RegSetValueEx(hKey, NAME_EQ_BANK9, 0, REG_DWORD, (LPBYTE)&eq.data[8], sizeof(DWORD));
		RegSetValueEx(hKey, NAME_EQ_BANK10, 0, REG_DWORD, (LPBYTE)&eq.data[9], sizeof(DWORD));

		int nLevel = MAP_GetBassBoostLevel(hMap);
		RegSetValueEx(hKey, NAME_BASSBOOST, 0, REG_DWORD, (LPBYTE)&nLevel, sizeof(DWORD));

		// window positions
		RegSetValueEx(hKey, NAME_WINDOW_TOPMOST, 0, REG_DWORD, (LPBYTE)&m_fTopMost, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_WINDOW_LEFT, 0, REG_DWORD, (LPBYTE)&m_ptInitWnd.x, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_WINDOW_TOP, 0, REG_DWORD, (LPBYTE)&m_ptInitWnd.y, sizeof(DWORD));

		// general settings
		RegSetValueEx(hKey, NAME_PLAY_REPEAT, 0, REG_DWORD, (LPBYTE)&m_fRepeat, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_PLAY_SHUFFLE, 0, REG_DWORD, (LPBYTE)&m_fShuffle, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_DRAW_PEEK, 0, REG_DWORD, (LPBYTE)&m_fDrawPeek, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_TIME_REVERSE, 0, REG_DWORD, (LPBYTE)&m_fTimeReverse, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_SAVE_DEFLIST, 0, REG_DWORD, (LPBYTE)&m_fSaveDefList, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_ADD_EXISTING, 0, REG_DWORD, (LPBYTE)&m_fAddExisting, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_RESUME, 0, REG_DWORD, (LPBYTE)&m_fResume, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_RESUME_TRACK, 0, REG_DWORD, (LPBYTE)&m_nResumeTrack, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_RESUME_TIME, 0, REG_DWORD, (LPBYTE)&m_nResumeTime, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_PLAYONSTART, 0, REG_DWORD, (LPBYTE)&m_fPlayOnStart, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_TRAYICON, 0, REG_DWORD, (LPBYTE)&m_fTrayIcon, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_SEARCHSUBFOLDERS, 0, REG_DWORD, (LPBYTE)&m_fSearchSubFolders, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_SCROLLTITLE, 0, REG_DWORD, (LPBYTE)&m_fScrollTitle, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_LAST_DIR, 0, REG_SZ, (LPBYTE)m_szLastDir, sizeof(TCHAR) * (_tcslen(m_szLastDir) + 1));
		RegSetValueEx(hKey, NAME_SKIN_FILE, 0, REG_SZ, (LPBYTE)m_szSkinFile, sizeof(TCHAR) * (_tcslen(m_szSkinFile) + 1));
		RegSetValueEx(hKey, NAME_SLEEP_MINUTES, 0, REG_DWORD, (LPBYTE)&m_nSleepMinutes, sizeof(DWORD));
#ifdef _WIN32_WCE
		RegSetValueEx(hKey, NAME_SLEEP_POWEROFF, 0, REG_DWORD, (LPBYTE)&m_fSleepPowerOff, sizeof(DWORD));
#endif

		// decoder
		RegSetValueEx(hKey, NAME_OUTPUT_BUFF, 0, REG_DWORD, 
							(LPBYTE)&m_Options.nOutputBufferLen, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_OUTPUT_PREBUFF, 0, REG_DWORD, 
							(LPBYTE)&m_Options.nOutputPrebuffer, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_OUTPUT_FADE, 0, REG_DWORD, 
							(LPBYTE)&m_Options.fFadeIn, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_SCAN_COMPLETELY, 0, REG_DWORD, 
							(LPBYTE)&m_Options.fScanMpegCompletely, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_SUPPRESS_ZERO, 0, REG_DWORD, 
							(LPBYTE)&m_Options.fSuppressZeroSamples, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_ALWAYSOPENDEV, 0, REG_DWORD, 
							(LPBYTE)&m_Options.fAlwaysOpenDevice, sizeof(DWORD));

		// streaming
		RegSetValueEx(hKey, NAME_STREAMING_BUFF, 0, REG_DWORD, 
							(LPBYTE)&m_StreamingOptions.nBuf, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_STREAMING_PREBUFF, 0, REG_DWORD, 
							(LPBYTE)&m_StreamingOptions.nPreBuf, sizeof(DWORD));
		RegSetValueEx(hKey, NAME_STREAMING_USEPROXY, 0, REG_DWORD, 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -