📄 main.cpp
字号:
/**************************************************************************************
* *
* *
**************************************************************************************/
#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 + -