win32_theme.cpp

来自「VLC媒体播放程序」· C++ 代码 · 共 360 行

CPP
360
字号
/***************************************************************************** * win32_theme.cpp: Win32 implementation of the Theme class ***************************************************************************** * Copyright (C) 2003 VideoLAN * $Id: win32_theme.cpp,v 1.12 2003/10/30 17:59:12 gbazin Exp $ * * Authors: Olivier Teuli鑢e <ipkiss@via.ecp.fr> *          Emmanuel Puig    <karibu@via.ecp.fr> * * This program 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. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, * USA. *****************************************************************************/#ifdef WIN32#ifdef _MSC_VER#   define _WIN32_WINNT 0x0500#endif//--- WIN32 -----------------------------------------------------------------#include <windows.h>//--- VLC -------------------------------------------------------------------#include <vlc/intf.h>//--- SKIN ------------------------------------------------------------------#include "../os_api.h"#include "../src/banks.h"#include "../src/window.h"#include "../os_window.h"#include "../src/event.h"#include "../os_event.h"#include "../src/theme.h"#include "../os_theme.h"#include "../src/vlcproc.h"#include "../src/skin_common.h"//---------------------------------------------------------------------------int SkinManage( intf_thread_t *p_intf );//---------------------------------------------------------------------------// Refresh Timer Callback//---------------------------------------------------------------------------void CALLBACK RefreshTimer( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime ){    intf_thread_t *p_intf = (intf_thread_t *)GetWindowLongPtr( hwnd,        GWLP_USERDATA );    SkinManage( p_intf );}//---------------------------------------------------------------------------// Win32 interface//---------------------------------------------------------------------------LRESULT CALLBACK Win32Proc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ){    // Get pointer to thread info    intf_thread_t *p_intf = (intf_thread_t *)GetWindowLongPtr( hwnd,        GWLP_USERDATA );    // If doesn't exist, treat windows message normally    if( p_intf == NULL )        return DefWindowProc( hwnd, uMsg, wParam, lParam );    // Create event to dispatch in windows    Event *evt = (Event *)new OSEvent( p_intf, hwnd, uMsg, wParam, lParam );    // Find window matching with hwnd    list<SkinWindow *>::const_iterator win;    for( win = p_intf->p_sys->p_theme->WindowList.begin();         win != p_intf->p_sys->p_theme->WindowList.end(); win++ )    {        // If it is the correct window        if( hwnd == ( (Win32Window *)(*win) )->GetHandle() )        {            // Send event and check if processed            if( (*win)->ProcessEvent( evt ) )            {                delete (OSEvent *)evt;                return 0;            }            else            {                break;            }        }    }    delete (OSEvent *)evt;    // If Window is parent window    if( hwnd == ( (Win32Theme *)p_intf->p_sys->p_theme )->GetParentWindow() )    {        if( uMsg == WM_SYSCOMMAND )        {            if( (Event *)wParam != NULL )                ( (Event *)wParam )->SendEvent();            return 0;        }        else if( uMsg == WM_RBUTTONDOWN && wParam == 42 &&                 lParam == WM_RBUTTONDOWN )        {            int x, y;            OSAPI_GetMousePos( x, y );            TrackPopupMenu(                ( (Win32Theme *)p_intf->p_sys->p_theme )->GetSysMenu(),                0, x, y, 0, hwnd, NULL );        }    }    // If closing parent window    if( uMsg == WM_CLOSE )    {        OSAPI_PostMessage( NULL, VLC_HIDE, VLC_QUIT, 0 );        return 0;    }    // If hwnd does not match any window or message not processed    return DefWindowProc( hwnd, uMsg, wParam, lParam );}//---------------------------------------------------------------------------//---------------------------------------------------------------------------// THEME//---------------------------------------------------------------------------Win32Theme::Win32Theme( intf_thread_t *_p_intf ) : Theme( _p_intf ){    // Get instance handle    hinst = GetModuleHandle( NULL );    // Create window class    WNDCLASS SkinWindow;    SkinWindow.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;    SkinWindow.lpfnWndProc = (WNDPROC) Win32Proc;    SkinWindow.lpszClassName = "SkinWindow";    SkinWindow.lpszMenuName = NULL;    SkinWindow.cbClsExtra = 0;    SkinWindow.cbWndExtra = 0;    SkinWindow.hbrBackground = HBRUSH (COLOR_WINDOW);    SkinWindow.hCursor = LoadCursor( NULL , IDC_ARROW );    SkinWindow.hIcon = LoadIcon( hinst, "VLC_ICON" );    SkinWindow.hInstance = hinst;    if( !RegisterClass( &SkinWindow ) )    {        WNDCLASS wndclass;        // Check why it failed. If it's because the class already exists        // then fine, otherwise return with an error.        if( !GetClassInfo( hinst, "SkinWindow", &wndclass ) )        {            msg_Err( p_intf, "Cannot register window class" );            return;        }    }    // Initialize the OLE library    OleInitialize( NULL );    //Initialize value    ParentWindow = NULL;}//---------------------------------------------------------------------------Win32Theme::~Win32Theme(){    // Unregister the window class if needed    WNDCLASS wndclass;    if( GetClassInfo( hinst, "SkinWindow", &wndclass ) )    {        UnregisterClass( "SkinWindow", hinst );    }    if( GetClassInfo( hinst, "ParentWindow", &wndclass ) )    {        UnregisterClass( "ParentWindow", hinst );    }    // Delete tray icon if exists    if( ShowInTray )    {        Shell_NotifyIcon( NIM_DELETE, &TrayIcon );    }    // Destroy parent window    if( ParentWindow )    {        DestroyWindow( ParentWindow );    }    // Uninitialize the OLE library    OleUninitialize();}//---------------------------------------------------------------------------void Win32Theme::OnLoadTheme(){    // Create window class    WNDCLASS ParentClass;    ParentClass.style = CS_VREDRAW|CS_HREDRAW|CS_DBLCLKS;    ParentClass.lpfnWndProc = (WNDPROC) Win32Proc;    ParentClass.lpszClassName = "ParentWindow";    ParentClass.lpszMenuName = NULL;    ParentClass.cbClsExtra = 0;    ParentClass.cbWndExtra = 0;    ParentClass.hbrBackground = HBRUSH (COLOR_WINDOW);    ParentClass.hCursor = LoadCursor( NULL , IDC_ARROW );    ParentClass.hIcon = LoadIcon( hinst, "VLC_ICON" );    ParentClass.hInstance = hinst;    // register class and check it    if( !RegisterClass( &ParentClass ) )    {        WNDCLASS wndclass;        // Check why it failed. If it's because the class already exists        // then fine, otherwise return with an error.        if( !GetClassInfo( hinst, "ParentWindow", &wndclass ) )        {            msg_Err( p_intf, "Cannot register window class" );            return;        }    }    // Create Window    ParentWindow = CreateWindowEx( WS_EX_TOOLWINDOW, "ParentWindow",        "VLC Media Player", WS_SYSMENU, 0, 0, 0, 0, 0, 0, hinst, NULL );    // We do it this way otherwise CreateWindowEx will fail    // if WS_EX_LAYERED is not supported    SetWindowLongPtr( ParentWindow, GWL_EXSTYLE, GetWindowLong( ParentWindow,                      GWL_EXSTYLE ) | WS_EX_LAYERED );    // Store with it a pointer to the interface thread    SetWindowLongPtr( ParentWindow, GWLP_USERDATA, (LONG_PTR)p_intf );    ShowWindow( ParentWindow, SW_SHOW );    // System tray icon    TrayIcon.cbSize = sizeof( PNOTIFYICONDATA );    TrayIcon.hWnd = ParentWindow;    TrayIcon.uID = 42;    TrayIcon.uFlags = NIF_ICON|NIF_TIP|NIF_MESSAGE;    TrayIcon.uCallbackMessage = WM_RBUTTONDOWN;    TrayIcon.hIcon = LoadIcon( hinst, "VLC_ICON" );    strcpy( TrayIcon.szTip, "VLC Media Player" );    // Remove default entries from system menu popup    SysMenu = GetSystemMenu( ParentWindow, false );    RemoveMenu( SysMenu, SC_RESTORE,  MF_BYCOMMAND );    RemoveMenu( SysMenu, SC_MOVE,     MF_BYCOMMAND );    RemoveMenu( SysMenu, SC_SIZE,     MF_BYCOMMAND );    RemoveMenu( SysMenu, SC_MINIMIZE, MF_BYCOMMAND );    RemoveMenu( SysMenu, SC_MAXIMIZE, MF_BYCOMMAND );    RemoveMenu( SysMenu, SC_CLOSE,    MF_BYCOMMAND );    RemoveMenu( SysMenu, 0,           MF_BYPOSITION );    // The create menu    CreateSystemMenu();    // Create refresh timer    SetTimer( ParentWindow, 42, 200, (TIMERPROC)RefreshTimer );}//---------------------------------------------------------------------------void Win32Theme::AddSystemMenu( string name, Event *event ){    if( name == "SEPARATOR" )    {        AppendMenu( SysMenu, MF_SEPARATOR, 0, NULL );    }    else    {        AppendMenu( SysMenu, MF_STRING, (unsigned int)event,                    (char *)name.c_str() );    }}//---------------------------------------------------------------------------void Win32Theme::ChangeClientWindowName( string name ){    SetWindowText( ParentWindow, name.c_str() );}//---------------------------------------------------------------------------void Win32Theme::AddWindow( string name, int x, int y, bool visible,    int fadetime, int alpha, int movealpha, bool dragdrop, bool playondrop ){    HWND hwnd;    hwnd = CreateWindowEx( WS_EX_TOOLWINDOW,        "SkinWindow", name.c_str(), WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT,        0, 0, ParentWindow, 0, hinst, NULL );    if( !hwnd )    {        msg_Err( p_intf, "CreateWindow failed" );        return;    }    // We do it this way otherwise CreateWindowEx will fail    // if WS_EX_LAYERED is not supported    SetWindowLongPtr( hwnd, GWL_EXSTYLE,                      GetWindowLong( hwnd, GWL_EXSTYLE ) | WS_EX_LAYERED );    SetWindowLongPtr( hwnd, GWLP_USERDATA, (LONG_PTR)p_intf );    WindowList.push_back( (SkinWindow *)new OSWindow( p_intf, hwnd, x, y,        visible, fadetime, alpha, movealpha, dragdrop, playondrop ) ) ;}//---------------------------------------------------------------------------void Win32Theme::ChangeTray(){    if( ShowInTray )    {        Shell_NotifyIcon( NIM_DELETE, &TrayIcon );        ShowInTray = false;    }    else    {        Shell_NotifyIcon( NIM_ADD, &TrayIcon );        ShowInTray = true;    }}//---------------------------------------------------------------------------void Win32Theme::ChangeTaskbar(){    if( ShowInTaskbar )    {        ShowWindow( ParentWindow, SW_HIDE );        SetWindowLongPtr( ParentWindow, GWL_EXSTYLE,                          WS_EX_LAYERED|WS_EX_TOOLWINDOW );        ShowWindow( ParentWindow, SW_SHOW );        ShowInTaskbar = false;    }    else    {        ShowWindow( ParentWindow, SW_HIDE );        SetWindowLongPtr( ParentWindow, GWL_EXSTYLE,                          WS_EX_LAYERED|WS_EX_APPWINDOW );        ShowWindow( ParentWindow, SW_SHOW );        ShowInTaskbar = true;    }}//---------------------------------------------------------------------------#endif

⌨️ 快捷键说明

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