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

📄 gui.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * MPlayer GUI for Win32 * Copyright (C) 2003 Sascha Sommer <saschasommer@freenet.de> * Copyright (C) 2006 Erik Augustson <erik_27can@yahoo.com> * Copyright (C) 2006 Gianluigi Tiesi <sherpya@netfarm.it> * * This file is part of MPlayer. * * MPlayer is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MPlayer 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MPlayer; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */#include <mplaylib.h>#include <mplaylib.h>#include <ctype.h>#include <fcntl.h>#include <windows.h>#include <windowsx.h>#include <shlobj.h>#include "version.h"#include "mplayer.h"#include "mp_fifo.h"#include "mp_msg.h"#include "help_mp.h"#include "input/input.h"#include "input/mouse.h"#include "osdep/keycodes.h"#include "stream/stream.h"#include "libvo/video_out.h"#include "interface.h"#include "gui.h"#include "wincfg.h"#include "dialogs.h"// HACK around bug in old mingw#undef INVALID_FILE_ATTRIBUTES#define INVALID_FILE_ATTRIBUTES ((DWORD)-1)#ifndef WM_XBUTTONDOWN# define WM_XBUTTONDOWN    0x020B# define WM_XBUTTONUP      0x020C# define WM_XBUTTONDBLCLK  0x020D#endif/* Globals / Externs */extern void renderinfobox(skin_t *skin, window_priv_t *priv);extern void renderwidget(skin_t *skin, image *dest, widget *item, int state);extern void mplayer_put_key(int code);extern void print_version(void);extern int WinID;float sub_aspect;DWORD oldtime;NOTIFYICONDATA nid;int console_state = 0;play_tree_t *playtree = NULL;static HBRUSH    colorbrush = NULL;           //Handle to colorkey brushstatic COLORREF windowcolor = RGB(255,0,255); //Windowcolor == colorkeyvoid console_toggle(void){    if (console_state)    {        FreeConsole();        console = 0;        console_state = 0;    }    else    {        /* This code comes from: http://dslweb.nwnexus.com/~ast/dload/guicon.htm */        CONSOLE_SCREEN_BUFFER_INFO coninfo;        FILE *fp;        HWND hwnd = NULL;        console = 1;        AllocConsole();        SetConsoleTitle(MP_TITLE);        /* disable the close button for now */        while (!hwnd)        {            hwnd = FindWindow(NULL, MP_TITLE);            Sleep(100);        }        DeleteMenu(GetSystemMenu(hwnd, 0), SC_CLOSE, MF_BYCOMMAND);        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);        coninfo.dwSize.Y = 1000;        SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);        fp = freopen("con", "w", stdout);        *stdout = *fp;        setvbuf(stdout, NULL, _IONBF, 0);        fp = freopen("con", "r", stdin);        *stdin = *fp;        setvbuf(stdin, NULL, _IONBF, 0);        fp = freopen("con", "w", stdout);        *stderr = *fp;        setvbuf(stderr, NULL, _IONBF, 0);        print_version();        console_state = 1;    }}void capitalize(char *filename){    unsigned int i;    BOOL cap = TRUE;    for (i=0; i < strlen(filename); i++)    {        if (cap)        {            cap = FALSE;            filename[i] = toupper(filename[i]);        }        else if (filename[i] == ' ')            cap = TRUE;        else            filename[i] = tolower(filename[i]);    }}static image *get_drawground(HWND hwnd){    gui_t * gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA);    unsigned int i;    if(!gui) return NULL;    for(i=0; i<gui->window_priv_count; i++)        if(gui->window_priv[i]->hwnd==hwnd)            return &gui->window_priv[i]->img;    return NULL;}static HBITMAP get_bitmap(HWND hwnd){    gui_t *gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA);    unsigned int i;    if(!gui) return NULL;    for(i=0; i<gui->window_priv_count; i++)        if(gui->window_priv[i]->hwnd == hwnd)            return gui->window_priv[i]->bitmap;    return NULL;}static int get_windowtype(HWND hwnd){    gui_t *gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA);    unsigned int i;    if(!gui) return -1;    for(i=0; i<gui->window_priv_count; i++)        if(gui->window_priv[i]->hwnd == hwnd)            return gui->window_priv[i]->type;    return -1;}static void uninit(gui_t *gui){    if(gui->skin) destroy_window(gui);    if(gui->playlist) gui->playlist->free_playlist(gui->playlist);    gui->playlist = NULL;}/*    the gui message handler    tries to handle the incoming messages    and passes them to the player's message handler if it can't handle them*/static void handlemsg(HWND hWnd, int msg){    gui_t *gui = (gui_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA);    if(msg == evNone) return;    switch(msg)    {        case evLoadPlay:        case evLoad:            if(display_openfilewindow(gui, 0) && (msg == evLoadPlay))                handlemsg(hWnd, evDropFile);            return;        case evLoadSubtitle:            display_opensubtitlewindow(gui);            break;        case evPreferences:            display_prefswindow(gui);            return;        case evPlayList:            display_playlistwindow(gui);            return;        case evSkinBrowser:            display_skinbrowser(gui);            break;        case evEqualizer:            display_eqwindow(gui);            break;        case evAbout:            MessageBox(hWnd, COPYRIGHT, "About", MB_OK);            break;        case evIconify:            ShowWindow(hWnd, SW_MINIMIZE);            break;        case evIncVolume:            mplayer_put_key(KEY_VOLUME_UP);            break;        case evDecVolume:            mplayer_put_key(KEY_VOLUME_DOWN);            break;        default:            mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] received msg %s (%i)\n", gui->skin->geteventname(msg), msg);            break;    }    gui->playercontrol(msg);}static widget *clickedinsidewidget(gui_t *gui, int window, int x, int y){    unsigned int i;    widget *item;    for(i=0; i<gui->skin->widgetcount; i++)    {        item = gui->skin->widgets[i];        if((item->window == window) && (item->x <= x) && (item->x + item->width >= x) &&           (item->y <= y) && (item->y + item->height >= y))            return item;    }    return NULL;}/* updates sliders and the display */static void updatedisplay(gui_t *gui, HWND hwnd){    unsigned int i;    window_priv_t *priv = NULL;    DWORD time = timeGetTime();    if(!hwnd) return;    /* load all potmeters hpotmeters */    for(i=0; i<gui->skin->widgetcount; i++)    {        if(gui->skin->widgets[i]->type == tyHpotmeter || gui->skin->widgets[i]->type == tyPotmeter)        {            if(gui->skin->widgets[i]->msg == evSetVolume)                gui->skin->widgets[i]->value = guiIntfStruct.Volume;            else if(gui->skin->widgets[i]->msg == evSetMoviePosition)                gui->skin->widgets[i]->value = guiIntfStruct.Position;            else if(gui->skin->widgets[i]->msg == evSetBalance)                gui->skin->widgets[i]->value = guiIntfStruct.Balance;            if(gui->skin->widgets[i]->window == get_windowtype(hwnd))                renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i],                             gui->skin->widgets[i]->pressed ? 0 : 1);        }        /* update some buttons */        if(gui->skin->widgets[i]->type == tyButton && gui->skin->widgets[i]->window == get_windowtype(hwnd))        {            if(gui->skin->widgets[i]->msg == evPlaySwitchToPause)            {                gui->skin->widgets[i]->value = guiIntfStruct.Playing;                    renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i],                                 guiIntfStruct.Playing == 1 ? 0 : 1);            }            if(gui->skin->widgets[i]->msg == evMute)            {                gui->skin->widgets[i]->value = guiIntfStruct.Volume;                    renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i],                                 guiIntfStruct.Volume == 0.0f ? 0 : 1);            }        }    }    /* updating the display once a 100.second is enough imo */    if((time - oldtime) < 100) return;    oldtime=time;    /* suppress directx's fullscreen window when using the sub window */    if(sub_window && &video_driver_list[0] && strstr("directx", video_driver_list[0]))    {        HWND hWndFS = NULL; //handle to directx's fullscreen window        if(hWndFS == NULL)        {            hWndFS = FindWindow(NULL, "MPlayer Fullscreen");            if(hWndFS != NULL) DestroyWindow(hWndFS); //sub window handles fullscreen        }    }    for (i=0; i<gui->window_priv_count; i++)    {        if(gui->window_priv[i]->hwnd == hwnd)            priv=gui->window_priv[i];    }// Sherpya    /* display the status msgs */    renderinfobox(gui->skin, priv);    RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE);}static LRESULT CALLBACK SubProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    gui_t *gui = (gui_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA);    if (gui && (gui->subwindow != hWnd)) return FALSE;    switch (message)    {        case WM_CLOSE:            handlemsg(hWnd, evExit);            return 0;        case WM_DESTROY:            PostQuitMessage(0);            return 0;        case WM_KEYDOWN:        {            switch(wParam)            {                case VK_LEFT:                    mplayer_put_key(KEY_LEFT);                    break;                case VK_UP:                    mplayer_put_key(KEY_UP);                    break;                case VK_RIGHT:                    mplayer_put_key(KEY_RIGHT);                    break;                case VK_DOWN:                    mplayer_put_key(KEY_DOWN);                    break;                case VK_TAB:                    mplayer_put_key(KEY_TAB);                    break;                case VK_BACK:                    mplayer_put_key(KEY_BS);                    break;                case VK_DELETE:                    mplayer_put_key(KEY_DELETE);                    break;                case VK_INSERT:                    mplayer_put_key(KEY_INSERT);                    break;                case VK_HOME:                    mplayer_put_key(KEY_HOME);                    break;                case VK_END:                    mplayer_put_key(KEY_END);                    break;                case VK_PRIOR:                    mplayer_put_key(KEY_PAGE_UP);                    break;                case VK_NEXT:                    mplayer_put_key(KEY_PAGE_DOWN);                    break;                case VK_ESCAPE:                    mplayer_put_key(KEY_ESC);                    break;            }            break;        }        case WM_COMMAND:        {            switch(LOWORD(wParam))            {                case IDEXIT:                    PostQuitMessage(0);                    handlemsg(hWnd, evExit);                    break;                case IDFILE_OPEN:                    handlemsg(hWnd, evLoadPlay);                    break;                case IDURL_OPEN:                    display_openurlwindow(gui, 0);                    break;                case IDDIR_OPEN:                {                    static char path[MAX_PATH];                    BROWSEINFO bi;                    LPITEMIDLIST pidl;                    memset(&bi, 0, sizeof(BROWSEINFO));                    bi.lpszTitle = "Choose a Directory...";                    pidl = SHBrowseForFolder(&bi);                    if (SHGetPathFromIDList(pidl, path))                    {                        gui->playlist->clear_playlist(gui->playlist);

⌨️ 快捷键说明

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