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

📄 main.cpp

📁 <VC++视频音频开发>一书的光盘资料。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/**************************************************************************************
 *                                                                                    *
 *                                                                                    *
 **************************************************************************************/

#include "Playa.h"
#include "Skin.h"
#include "Playlist.h"
#include "MediaPlayback.h"
#include "DirDialog.h"
#include "SkinList.h"
#include "Resizer.h"
#include "DebugFile.h"

/*
 * 资源文件
 *
 */

#ifdef WIN32
#include "../build/win32/ressources.h"
#include "../build/win32/resource.h"
#endif

#include <math.h>
#include <commctrl.h>
#include <windows.h>
#include <windowsx.h>
#include <shlobj.h>

/*
 * 记时器间隔
 */

#define TIMER_ID     1
#define TIMER_RATE  50

/*
 * 变量
 */

BOOL      openning_network;
DWORD     anonymous;
HWND      hwndDisplay;
BOOL      screenSaverActive;
int       action  = ACTION_NONE;
DWORD     count = 0;
DWORD     use_subtitles         = 1;
DWORD     no_resize             = 0;
char      skinPath[MAX_PATH];
COLORREF  backColor;
UINT      uTimerID;
RECT      clientRect, cwindowRect;
RECT      windowRect, fullwindowRect;
int       moveX = 0, moveY = 0;
Skin     *skin;
MediaPlayback *playback;
CDirDialog *dirChooser;
SkinList   *skinList;
Resizer   *resizer;
Playlist  *playlist;
char      Name[] = "The \"Playa\"";
char     *RecentFiles[5];
HWND      hwnd, about, urlW = NULL;
HMENU     popupMenu;
HACCEL    hAccel;
DWORD     id;
HINSTANCE hInstance;
int       showing_cursor;
int       compact_mode;
BOOL      openOK;
char     *url;
DWORD     firstStart;
options_t options, tmpOptions;
WCHAR     wallpaper[MAX_PATH];
WCHAR     pattern[MAX_PATH];

/*
 * 主消息循环方法
 *
 */

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void             UpdateMainWindow();

/*
 * 打开当前播放链表的位置
 *
 */

void             OpenFileForPlaying(HWND hwnd);

/*
 * 重建播放链表浮动菜单
 *
 */

void             ReBuildPlaylistMenu();

/**************************************************************************************
 *                                                                                    *
 *                              保存和装载选项                                        *
 *                                                                                    *
 **************************************************************************************/

void LoadOptions() {

	HKEY     key;
	DWORD created, size;
	LONG     result;
	DWORD  type, i;
	char      file[256], name[5];
	
	/*
	 * 放置缺省选项
	 *
	 */

	compact_mode = 0;
    strcpy(skinPath, "Default");

	options.change_fullscreen_res = 0;
	options.loop                  = 1;
	options.on_top                = 1;
	options.use_bilinear          = 0;
	options.aspect_ratio          = ASPECT_RATIO_FREE;
	options.disable_screen_saver  = 1;
	options.save_pos              = 1;
	options.posX                  = 100;
	options.posY                  = 30;
	options.postprocessing        = 60;
	options.startFullscreen       = 0;

	/*
	 * 初始化最近的文件链表
	 */

	for(i=0; i < 5; i++) {

		RecentFiles[i] = NULL;
	}

	/*
	 * 打开注册键
	 */

	result = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\DivXNetworks\\ThePlaya",
 			                0, "CONFIG", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 
							NULL, &key, &created);

	if(result != ERROR_SUCCESS) {

		MP_ERROR("Couldn't load options");
		return;
	}

	switch(created) {

	case REG_CREATED_NEW_KEY:

		/*
		 * 第一次启动 (缺省)
		 * 
		 */

		break;

	case REG_OPENED_EXISTING_KEY:

		/*
		 * 读值
 		 */

		size = 4;
		result = RegQueryValueEx(key, "UseBilinear", 0, &type, (BYTE *)&options.use_bilinear, &size);
		size = 4;
		result = RegQueryValueEx(key, "MaintainAspectRatio", 0, &type, (BYTE *)&options.aspect_ratio, &size);
		size = 4;
		result = RegQueryValueEx(key, "ChangeFullscreenRes", 0, &type, (BYTE *)&options.change_fullscreen_res, &size);
		size = 4;
		result = RegQueryValueEx(key, "UseSubtitles", 0, &type, (BYTE *)&use_subtitles, &size);
		
		size = 4;
		result = RegQueryValueEx(key, "Loop", 0, &type, (BYTE *)&options.loop, &size);
		size = 4;
		result = RegQueryValueEx(key, "OnTop", 0, &type, (BYTE *)&options.on_top, &size);
		size = 4;
		result = RegQueryValueEx(key, "PreventScreenSaver", 0, &type, (BYTE *)&options.disable_screen_saver, &size);

		size = 4;
		result = RegQueryValueEx(key, "SavePlayerPos", 0, &type, (BYTE *)&options.save_pos, &size);

		size = 4;
		result = RegQueryValueEx(key, "PostProcessing", 0, &type, (BYTE *)&options.postprocessing, &size);

		size = 4;
		result = RegQueryValueEx(key, "CustomAspectX", 0, &type, (BYTE *)&aspectRatios[ASPECT_RATIO_CUSTOM].xFactor, &size);

		size = 4;
		result = RegQueryValueEx(key, "CustomAspectY", 0, &type, (BYTE *)&aspectRatios[ASPECT_RATIO_CUSTOM].yFactor, &size);

		if(options.save_pos) {
			
			size = 4;
			result = RegQueryValueEx(key, "PlayerPosX", 0, &type, (BYTE *)&options.posX, &size);
			
			size = 4;
			result = RegQueryValueEx(key, "PlayerPosY", 0, &type, (BYTE *)&options.posY, &size);
		}

		size = MAX_PATH;
		result = RegQueryValueEx(key, "SkinPath", 0, &type, (BYTE *)skinPath, &size);

		/*
		 * 最近的文件
		 */

		for(i=0; i < 5; i++) {

			sprintf(name, "File%d", i+1);

			size = 256;
			result = RegQueryValueEx(key, name, 0, &type, (BYTE *)&file, &size);

			if(result == ERROR_SUCCESS) {
			
				RecentFiles[i] = (char *) new char[size];
				strncpy(RecentFiles[i], file, size);
			}
		}

		break;

	default:
		break;
	}

	RegCloseKey(key);

}

void SaveOptions() {

	HKEY     key;
	LONG     result;
	DWORD created, i;
	char      name[5];

	options.postprocessing = playback->videoDecoder->decoreDecoder->GetQuality();

	/*
	 * 尝试打开注册键
	 */

	result = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\DivXNetworks\\ThePlaya",
							              0, "CONFIG", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 
							              NULL, &key, &created);

	if(result != ERROR_SUCCESS) {

		MP_ERROR("Couldn't save options");
		
		RegCloseKey(key);
		return;
	}

	RegSetValueEx(key, "UseBilinear", 0, REG_DWORD, (BYTE *) &options.use_bilinear, 4);
	RegSetValueEx(key, "MaintainAspectRatio", 0, REG_DWORD, (BYTE *) &options.aspect_ratio, 4);
	RegSetValueEx(key, "ChangeFullscreenRes", 0, REG_DWORD, (BYTE *) &options.change_fullscreen_res, 4);
	RegSetValueEx(key, "UseSubtitles", 0, REG_DWORD, (BYTE *) &use_subtitles, 4);
	RegSetValueEx(key, "Loop", 0, REG_DWORD, (BYTE *) &options.loop, 4);
	RegSetValueEx(key, "OnTop", 0, REG_DWORD, (BYTE *) &options.on_top, 4);
	RegSetValueEx(key, "PreventScreenSaver", 0, REG_DWORD, (BYTE *) &options.disable_screen_saver, 4);

	RegSetValueEx(key, "SavePlayerPos", 0, REG_DWORD, (BYTE *) &options.save_pos, 4);
	RegSetValueEx(key, "PostProcessing", 0, REG_DWORD, (BYTE *) &options.postprocessing, 4);

	RegSetValueEx(key, "CustomAspectX", 0, REG_DWORD, (BYTE *) &aspectRatios[ASPECT_RATIO_CUSTOM].xFactor, 4);
	RegSetValueEx(key, "CustomAspectY", 0, REG_DWORD, (BYTE *) &aspectRatios[ASPECT_RATIO_CUSTOM].yFactor, 4);

	if(options.save_pos) {

		options.posX = windowRect.left;
		options.posY = windowRect.top;

		RegSetValueEx(key, "PlayerPosX", 0, REG_DWORD, (BYTE *) &options.posX, 4);
		RegSetValueEx(key, "PlayerPosY", 0, REG_DWORD, (BYTE *) &options.posY, 4);
	}

	if(strcmp(skinPath, "Default") != 0)
		RegSetValueEx(key, "SkinPath", 0, REG_SZ, (BYTE *) skinPath, strlen(skinPath));
	else 
		RegSetValueEx(key, "SkinPath", 0, REG_SZ, (BYTE *) "Default", strlen("Default"));
	
	/*
	 * 最近文件链表
	 */

	for(i=0; i < 5; i++) {
		
		sprintf(name, "File%d\0", i+1);

		if(RecentFiles[i] != NULL) {
		
			RegSetValueEx(key, name, 0, REG_SZ, 
							      (BYTE *) RecentFiles[i], strlen(RecentFiles[i]));
		}
		else {
		
			RegDeleteValue(key, name);
 		}
	}

	RegCloseKey(key);
}

/**************************************************************************************
 *                                                                                    *
 *                             DlgProc用于定制屏幕高宽比                              *
 *                        -----------------------------------                         *
 **************************************************************************************/

static BOOL APIENTRY CustomAspectDlgProc( HWND hDlg, UINT message, UINT wParam, LONG lParam) {

	switch(message) {

		case WM_INITDIALOG:

			char buffer[256];

			sprintf(buffer, "%d", aspectRatios[ASPECT_RATIO_CUSTOM].xFactor);
			SendMessage(GetDlgItem(hDlg, IDC_CUSTOM_ASPECT_X), WM_SETTEXT, 0, (LPARAM) buffer);

			sprintf(buffer, "%d", aspectRatios[ASPECT_RATIO_CUSTOM].yFactor);
			SendMessage(GetDlgItem(hDlg, IDC_CUSTOM_ASPECT_Y), WM_SETTEXT, 0, (LPARAM) buffer);

			return TRUE;

	  case WM_COMMAND:

        switch (LOWORD(wParam))
		{
		case IDC_CUSTOM_ASPECT_CANCEL:
			EndDialog(hDlg, TRUE);
			break;

		case IDC_CUSTOM_ASPECT_OK:
			EndDialog(hDlg, TRUE);

			DWORD xFactor, yFactor;
			char *data;
			SHORT lineLength;
		
			lineLength = (short) SendMessage(GetDlgItem(hDlg, IDC_CUSTOM_ASPECT_X), EM_LINELENGTH, 0, 0);

			/*
			 * 将url缓冲写入头两个字节
			 * 
			 *
			 */

			data = (char *) new char[lineLength + 1];
			memcpy(data, &lineLength, 2);
	
			SendMessage(GetDlgItem(hDlg, IDC_CUSTOM_ASPECT_X), EM_GETLINE, 0, (LONG)(LPVOID)data);
			data[lineLength] = '\0';

			sscanf(data, "%d", &xFactor);

			lineLength = (short) SendMessage(GetDlgItem(hDlg, IDC_CUSTOM_ASPECT_Y), EM_LINELENGTH, 0, 0);

			/*
			 * 将url缓冲写入头两个字节
			 * 
			 *
			 */

			data = (char *) new char[lineLength + 1];
			memcpy(data, &lineLength, 2);
	
			SendMessage(GetDlgItem(hDlg, IDC_CUSTOM_ASPECT_Y), EM_GETLINE, 0, (LONG)(LPVOID)data);
			data[lineLength] = '\0';

			sscanf(data, "%d", &yFactor);

			aspectRatios[ASPECT_RATIO_CUSTOM].xFactor = xFactor;
			aspectRatios[ASPECT_RATIO_CUSTOM].yFactor = yFactor;

			/*
			 * 进行真正的填充
			 */
			switch(options.aspect_ratio) {

				case ASPECT_RATIO_ORIGINAL:

					CheckMenuItem(popupMenu, (UINT)ID_ASPECT_ORIGINAL, MF_UNCHECKED);
					break;

				case ASPECT_RATIO_TV:

					CheckMenuItem(popupMenu, (UINT)ID_ASPECT_43, MF_UNCHECKED);
					break;

				case ASPECT_RATIO_FREE:

					CheckMenuItem(popupMenu, (UINT)ID_ASPECT_FREE, MF_UNCHECKED);
					break;

				case ASPECT_RATIO_WIDE:

					CheckMenuItem(popupMenu, (UINT)ID_ASPECT_169, MF_UNCHECKED);
					break;
			}

			options.aspect_ratio = ASPECT_RATIO_CUSTOM;
			CheckMenuItem(popupMenu, (UINT)ID_ASPECT_CUSTOM, MF_CHECKED);
				
			RECT  src;

			GetClientRect(hwnd, &src);
			GetWindowRect(hwnd, &windowRect);

			if(compact_mode) {

				src.bottom = (src.right - src.left)*yFactor/xFactor;
			}
			else {

				src.bottom = (src.right - src.left - 15)*yFactor/xFactor + 115 + 22;
			}

			AdjustWindowRect(&src, WS_POPUP|WS_SIZEBOX, 0);

			MoveWindow( hwnd, windowRect.left, 
						windowRect.top, 
						src.right - src.left, 
						src.bottom - src.top, TRUE);
				
			playback->SetVideoRect(skin->GetVideoRect());

			break;
		}

		case WM_DESTROY:
			return TRUE;
	}

	return FALSE;
}

/**************************************************************************************
 *                                                                                    *
 *                              DlgProc用于一般的参数选择                             *
 *                        -----------------------------------                         *
 **************************************************************************************/


static BOOL APIENTRY PreferencesGeneralDlgProc( HWND hDlg, UINT message, UINT wParam, LONG lParam) {

	switch(message) {
		case WM_INITDIALOG:

			SetWindowPos(hDlg, HWND_TOP, 15, 35, 0, 0, SWP_NOSIZE);

		    CheckDlgButton(hDlg, IDC_CHECK_LOOP,   tmpOptions.loop);
		    CheckDlgButton(hDlg, IDC_CHECK_ON_TOP, tmpOptions.on_top);
		    CheckDlgButton(hDlg, IDC_CHECK_DISABLE_SS, tmpOptions.disable_screen_saver);
		    CheckDlgButton(hDlg, IDC_CHECK_SAVE_POS, tmpOptions.save_pos);

			return TRUE;

	  case WM_COMMAND:

        switch (wParam)
		{
			case IDC_CHECK_LOOP:

				tmpOptions.loop = tmpOptions.loop ? 0 : 1;
				break;

			case IDC_CHECK_ON_TOP:

				tmpOptions.on_top = tmpOptions.on_top ? 0 : 1;
				break;

			case IDC_CHECK_DISABLE_SS:

⌨️ 快捷键说明

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