?? gui.c
字號:
static void create_traymenu(gui_t *gui){ gui->traymenu = CreatePopupMenu(); gui->trayplaybackmenu = CreatePopupMenu(); AppendMenu(gui->traymenu, MF_STRING | MF_POPUP, (UINT) gui->trayplaymenu, "Open..."); AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); AppendMenu(gui->traymenu, MF_STRING | MF_POPUP, (UINT) gui->trayplaybackmenu, "Playback"); AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_SEEKB, "Seek Backwards"); AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_PTRACK, "Previous Track"); AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_PLAY, "Play/Pause"); AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_STOP, "Stop"); AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_NTRACK, "Next Track"); AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_SEEKF, "Seek Forwards"); AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); AppendMenu(gui->traymenu, MF_STRING, ID_MUTE, "Toggle Mute"); AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); AppendMenu(gui->traymenu, MF_STRING, IDSUBTITLE_OPEN, "Open Subtitle"); AppendMenu(gui->traymenu, MF_STRING, ID_PLAYLIST, "Playlist"); AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); AppendMenu(gui->traymenu, MF_STRING, ID_SHOWHIDE, "Show/Hide"); AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); AppendMenu(gui->traymenu, MF_STRING, ID_PREFS, "Preferences"); AppendMenu(gui->traymenu, MF_STRING, ID_CONSOLE, "Debug Console"); AppendMenu(gui->traymenu, MF_STRING, ID_ONLINEHELP, "Online Help"); AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); AppendMenu(gui->traymenu, MF_STRING, IDEXIT, "&Exit");}static void create_submenu(gui_t *gui){ gui->submenu = CreatePopupMenu(); gui->dvdmenu = CreatePopupMenu(); gui->aspectmenu = CreatePopupMenu(); gui->subtitlemenu = CreatePopupMenu(); AppendMenu(gui->submenu, MF_STRING | MF_POPUP, (UINT) gui->trayplaymenu, "Open..."); AppendMenu(gui->submenu, MF_SEPARATOR, 0, 0); AppendMenu(gui->submenu, MF_STRING, ID_SEEKB, "Seek Backwards"); AppendMenu(gui->submenu, MF_STRING, ID_PTRACK, "Previous Track"); AppendMenu(gui->submenu, MF_STRING, ID_PLAY, "Play/Pause"); AppendMenu(gui->submenu, MF_STRING, ID_STOP, "Stop"); AppendMenu(gui->submenu, MF_STRING, ID_NTRACK, "Next Track"); AppendMenu(gui->submenu, MF_STRING, ID_SEEKF, "Seek Forwards"); AppendMenu(gui->submenu, MF_SEPARATOR, 0, 0); AppendMenu(gui->submenu, MF_STRING, ID_FULLSCREEN, "Toggle Fullscreen"); AppendMenu(gui->submenu, MF_STRING, ID_MUTE, "Toggle Mute"); AppendMenu(gui->submenu, MF_SEPARATOR, 0, 0); AppendMenu(gui->submenu, MF_STRING | MF_POPUP, (UINT) gui->aspectmenu, "Aspect Ratio"); AppendMenu(gui->submenu, MF_STRING | MF_POPUP, (UINT) gui->subtitlemenu, "Subtitle Options"); AppendMenu(gui->submenu, MF_STRING | MF_POPUP, (UINT) gui->dvdmenu, "DVD Options");#ifdef USE_DVDREAD AppendMenu(gui->dvdmenu, MF_STRING | MF_GRAYED, ID_CHAPTERSEL, "Select Title/Chapter...");#endif AppendMenu(gui->subtitlemenu, MF_STRING, IDSUB_TOGGLE, "Subtitle Visibility On/Off"); AppendMenu(gui->subtitlemenu, MF_STRING, IDSUB_CYCLE, "Cycle Subtitle Languages"); AppendMenu(gui->aspectmenu, MF_STRING, ID_ASPECT1, "Set 16:9"); AppendMenu(gui->aspectmenu, MF_STRING, ID_ASPECT2, "Set 4:3"); AppendMenu(gui->aspectmenu, MF_STRING, ID_ASPECT3, "Set 2.35"); AppendMenu(gui->aspectmenu, MF_SEPARATOR, 0, 0); AppendMenu(gui->aspectmenu, MF_STRING, ID_ASPECT4, "Original Aspect"); AppendMenu(gui->submenu, MF_SEPARATOR, 0, 0); AppendMenu(gui->submenu, MF_STRING, IDEXIT, "&Exit");}static void maketransparent(HWND hwnd, COLORREF crTransparent){ HDC mdc = GetDC(hwnd); RECT rd; HRGN crRgnres, crRgn, crRgnTmp; int iX = 0, iY = 0, iLeftX = 0; int width, height; GetWindowRect(hwnd, &rd); width = rd.right - rd.left; height = rd.bottom - rd.top; /* create an empty region */ crRgn = CreateRectRgn(0, 0, 0, 0); /* Create a region from a bitmap with transparency colour of Purple */ for (iY = -1; iY < height; iY++) { do { /* skip over transparent pixels at start of lines */ while (iX <= width && GetPixel(mdc,iX, iY) == crTransparent) iX++; /* remember this pixel */ iLeftX = iX; /* now find first non transparent pixel */ while (iX <= width && GetPixel(mdc,iX, iY) != crTransparent) ++iX; /* create a temp region on this info */ crRgnTmp = CreateRectRgn(iLeftX, iY, iX, iY+1); /* combine into main region */ crRgnres = crRgn; CombineRgn(crRgnres, crRgn, crRgnTmp, RGN_OR); crRgn = crRgnres; /* delete the temp region for next pass (otherwise you'll get an ASSERT) */ DeleteObject(crRgnTmp); } while (iX < width); iX = 0; } SetWindowRgn(hwnd, crRgn, TRUE); DeleteObject(crRgn); ReleaseDC(hwnd,mdc);}static int window_render(gui_t *gui, HWND hWnd, HDC hdc, window_priv_t *priv, window *desc, BITMAPINFO binfo){ int i; SetWindowLongPtr(hWnd, GWLP_USERDATA, (DWORD) gui); (gui->window_priv_count)++; gui->window_priv = realloc(gui->window_priv, sizeof(window_priv_t *) * gui->window_priv_count); priv = gui->window_priv[gui->window_priv_count - 1] = calloc(1, sizeof(window_priv_t)); priv->hwnd = hWnd; priv->type = desc->type; priv->background = desc->base->bitmap[0]; memcpy(&priv->img, desc->base->bitmap[0], sizeof(image)); hdc = GetDC(hWnd); binfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); binfo.bmiHeader.biWidth = priv->img.width; binfo.bmiHeader.biHeight = -priv->img.height; binfo.bmiHeader.biPlanes = 1; binfo.bmiHeader.biSizeImage = priv->img.width * priv->img.height * (gui->screenbpp / 8); binfo.bmiHeader.biXPelsPerMeter = 0; binfo.bmiHeader.biYPelsPerMeter = 0; binfo.bmiHeader.biClrUsed = 0; binfo.bmiHeader.biClrImportant = 0; binfo.bmiHeader.biBitCount = gui->screenbpp; binfo.bmiHeader.biCompression = BI_RGB; priv->bitmap = CreateDIBSection(hdc, &binfo, DIB_RGB_COLORS, (void **) &priv->img.data, NULL, 0); if(!priv->bitmap) { mp_msg(MSGT_GPLAYER, MSGL_FATAL, "[GUI] unable to create bitmap for skinned window\n"); return 0; } memcpy(priv->img.data, desc->base->bitmap[0]->data, binfo.bmiHeader.biSizeImage); ReleaseDC(hWnd,hdc); for (i=0; i<gui->skin->widgetcount; i++) if(gui->skin->widgets[i]->window == desc->type) renderwidget(gui->skin, &priv->img, gui->skin->widgets[i], 1); return 0;}/* creates the sub (AKA video) window,*/extern int create_subwindow(gui_t *gui, char *skindir){ HINSTANCE instance = GetModuleHandle(NULL); WNDCLASS wc; RECT rect; HWND hWnd; DWORD style = 0; HDC hdc = NULL; BITMAPINFO binfo; window_priv_t *priv = NULL; window *desc = NULL; int i, x = -1, y = -1; vo_colorkey = 0xff00ff; for (i=0; i<gui->skin->windowcount; i++) if(gui->skin->windows[i]->type == wiSub) desc = gui->skin->windows[i]; if(!desc) { mp_msg(MSGT_GPLAYER, MSGL_FATAL, "[GUI] Invalid skin description\n"); return 1; } windowcolor = vo_colorkey; colorbrush = CreateSolidBrush(windowcolor); wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wc.lpfnWndProc = SubProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = instance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = gui->icon; wc.hbrBackground = NULL; //WM_PAINT will handle background color switching; wc.lpszClassName = "MPlayer Sub for Windows"; wc.lpszMenuName = NULL; RegisterClass(&wc); /* create the sub window menu */ create_submenu(gui); rect.top = rect.left = 100; rect.bottom = rect.top+desc->base->bitmap[0]->height; rect.right = rect.left+desc->base->bitmap[0]->width; /* our window aspect */ sub_aspect = (float)(rect.right-rect.left)/(rect.bottom-rect.top); style = fullscreen?WS_VISIBLE | WS_POPUP:WS_OVERLAPPEDWINDOW | WS_SYSMENU | WS_MINIMIZEBOX; AdjustWindowRect(&rect, style, 0); if (gui_sub_pos_x >= 0) x = gui_sub_pos_x; if (gui_sub_pos_y >= 0) y = gui_sub_pos_y; /* out of bounds check */ if (x <= -1 || (x+(rect.right-rect.left) > GetSystemMetrics(SM_CXSCREEN))) x = CW_USEDEFAULT; if (y <= -1 || (y+(rect.bottom-rect.top) > GetSystemMetrics(SM_CYSCREEN))) y = x; hWnd = CreateWindowEx(0, "MPlayer Sub for Windows", "MPlayer for Windows", style, x, y, rect.right-rect.left, rect.bottom-rect.top, gui->subwindow, NULL, instance, NULL); /* load all the window images */ window_render(gui, hWnd, hdc, priv, desc, binfo); /* enable drag and drop support */ DragAcceptFiles(hWnd, TRUE); gui->subwindow = hWnd; if(sub_window) WinID = gui->subwindow; ShowWindow(gui->subwindow, SW_SHOW); UpdateWindow(gui->subwindow); return 0;}/* loads/updates a skin and creates windows for it */extern int create_window(gui_t *gui, char *skindir){ HINSTANCE instance = GetModuleHandle(NULL); WNDCLASS wc; RECT rect; DWORD style = 0; HWND hwnd; HDC hdc = NULL; BITMAPINFO binfo; window_priv_t *priv = NULL; window *desc = NULL; char dir[MAX_PATH]; unsigned int i; int x = -1, y = -1; /* destroy the current main window */ if(gui->skin) destroy_window(gui); /* get screenproperties */ gui->screenbpp = GetDesktopBitsPerPixel(); gui->screenw = GetSystemMetrics(SM_CXSCREEN); gui->screenh = GetSystemMetrics(SM_CYSCREEN); /* load the new skin */ gui->skin = loadskin(skindir, gui->screenbpp); if(!gui->skin) { mp_msg(MSGT_GPLAYER, MSGL_FATAL, "[GUI] fatal error during skinload\n"); /* Set default Skin */ if (skinName) free(skinName); skinName = strdup("Blue"); /* then force write conf */ cfg_write(); return 1; } /* find the description of the mainwindow */ for (i=0; i<gui->skin->windowcount; i++) if(gui->skin->windows[i]->type == wiMain) desc = gui->skin->windows[i]; if(!desc) { mp_msg(MSGT_GPLAYER, MSGL_FATAL, "[GUI] Invalid skin description\n"); return 1; } /* load the icon from the executable */ GetModuleFileName(NULL, dir, MAX_PATH); gui->icon = ExtractIcon(instance, dir, 0); /* create the window class */ wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = EventProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = instance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = gui->icon; wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 0)); wc.lpszClassName = gui->classname = "MPlayer GUI for Windows"; wc.lpszMenuName = NULL; RegisterClass(&wc); /* create a context menu */ create_menu(gui); /* create the systray menu */ create_traymenu(gui); /* create the mainwindow */ /* TODO implement aligning as described in skin.html */ rect.top = rect.left = 100; rect.bottom = rect.top+desc->base->bitmap[0]->height; rect.right = rect.left+desc->base->bitmap[0]->width; if(desc->decoration) style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; else style = WS_POPUP | WS_SYSMENU; AdjustWindowRect(&rect, style, 0); /* Check if out of screen */ if (gui_main_pos_x >= 0) x = gui_main_pos_x; if (gui_main_pos_y >= 0) y = gui_main_pos_y; if (x <= -1 || (x+(rect.right-rect.left) > GetSystemMetrics(SM_CXFULLSCREEN))) { x = (GetSystemMetrics(SM_CXSCREEN) / 2) - ((rect.right-rect.left) / 2); gui_main_pos_x = x; } if (y <= -1 || (y+(rect.bottom-rect.top) > GetSystemMetrics(SM_CYFULLSCREEN))) { y = ((GetSystemMetrics(SM_CYSCREEN)-40) - (rect.bottom-rect.top)); gui_main_pos_y = y; } hwnd = CreateWindowEx(0, gui->classname, "MPlayer for Windows", style, x, y, rect.right-rect.left, rect.bottom-rect.top, gui->mainwindow, NULL, instance, NULL); /* set the systray icon properties */ nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hwnd; nid.uID = 1; nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nid.uCallbackMessage = WM_SYSTRAY; nid.hIcon = gui->icon; strcpy(nid.szTip, "MPlayer for Windows"); /* register the systray icon */ Shell_NotifyIcon(NIM_ADD, &nid); /* load all the window images */ window_render(gui, hwnd, hdc, priv, desc, binfo); /* enable drag and drop support */ DragAcceptFiles(hwnd, TRUE); updatedisplay(gui, hwnd); gui->mainwindow = hwnd; /* display */ ShowWindow(gui->mainwindow, SW_SHOW); UpdateWindow(gui->mainwindow); maketransparent(gui->mainwindow, RGB(255, 0, 255)); return 0;}gui_t *create_gui(char *skindir, char *skinName, void (*playercontrol)(int event)){ gui_t *gui = calloc(1, sizeof(gui_t)); char temp[MAX_PATH]; HWND runningmplayer = FindWindow("MPlayer GUI for Windows", "MPlayer for Windows"); if(runningmplayer) { free(gui); return NULL; } gui->startplay = startplay; gui->playercontrol = playercontrol; gui->uninit = uninit; gui->updatedisplay = updatedisplay; /* create playlist */ gui->playlist = create_playlist(); if(!skinName) skinName = strdup("Blue"); sprintf(temp, "%s\\%s", skindir, skinName); if(create_window(gui, temp)) return NULL; if(create_subwindow(gui, temp)) return NULL; if(console) console_toggle(); return gui;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -