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

📄 gui.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 4 页
字号:
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 + -