win32_factory.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:11k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * win32_factory.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 VideoLAN
  5.  * $Id: win32_factory.cpp 8864 2004-09-30 19:44:43Z gbazin $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *          Olivier Teuli鑢e <ipkiss@via.ecp.fr>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. #ifdef WIN32_SKINS
  25. #include "win32_factory.hpp"
  26. #include "win32_graphics.hpp"
  27. #include "win32_timer.hpp"
  28. #include "win32_window.hpp"
  29. #include "win32_tooltip.hpp"
  30. #include "win32_loop.hpp"
  31. #include "../src/theme.hpp"
  32. LRESULT CALLBACK Win32Proc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
  33. {
  34.     // Get pointer to thread info: should only work with the parent window
  35.     intf_thread_t *p_intf = (intf_thread_t *)GetWindowLongPtr( hwnd,
  36.         GWLP_USERDATA );
  37.     // If doesn't exist, treat windows message normally
  38.     if( p_intf == NULL || p_intf->p_sys->p_osFactory == NULL )
  39.     {
  40.         return DefWindowProc( hwnd, uMsg, wParam, lParam );
  41.     }
  42.     // Here we know we are getting a message for the parent window, since it is
  43.     // the only one to store p_intf...
  44.     // Yes, it is a kludge :)
  45. //Win32Factory *pFactory = (Win32Factory*)Win32Factory::instance( p_intf );
  46. //msg_Err( p_intf, "Parent window %p %p %u %in", pFactory->m_hParentWindow, hwnd, uMsg, wParam );
  47.     // If Window is parent window
  48.     // XXX: this test isn't needed, see the kludge above...
  49. //    if( hwnd == pFactory->m_hParentWindow )
  50.     {
  51.         if( uMsg == WM_SYSCOMMAND )
  52.         {
  53.             // If closing parent window
  54.             if( wParam == SC_CLOSE )
  55.             {
  56.                 Win32Loop *pLoop = (Win32Loop*)Win32Loop::instance( p_intf );
  57.                 pLoop->exit();
  58.                 return 0;
  59.             }
  60.             else
  61.             {
  62.                 msg_Err( p_intf, "WM_SYSCOMMAND %i", wParam );
  63.             }
  64. //            if( (Event *)wParam != NULL )
  65. //                ( (Event *)wParam )->SendEvent();
  66. //            return 0;
  67.         }
  68.     }
  69.     // If hwnd does not match any window or message not processed
  70.     return DefWindowProc( hwnd, uMsg, wParam, lParam );
  71. }
  72. Win32Factory::Win32Factory( intf_thread_t *pIntf ):
  73.     OSFactory( pIntf ), TransparentBlt( NULL ), AlphaBlend( NULL ),
  74.     SetLayeredWindowAttributes( NULL ), m_hParentWindow( NULL ),
  75.     m_dirSep( "\" )
  76. {
  77.     // see init()
  78. }
  79. bool Win32Factory::init()
  80. {
  81.     // Get instance handle
  82.     m_hInst = GetModuleHandle( NULL );
  83.     if( m_hInst == NULL )
  84.     {
  85.         msg_Err( getIntf(), "Cannot get module handle" );
  86.     }
  87.     // Create window class
  88.     WNDCLASS skinWindowClass;
  89.     skinWindowClass.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
  90.     skinWindowClass.lpfnWndProc = (WNDPROC) Win32Proc;
  91.     skinWindowClass.lpszClassName = "SkinWindowClass";
  92.     skinWindowClass.lpszMenuName = NULL;
  93.     skinWindowClass.cbClsExtra = 0;
  94.     skinWindowClass.cbWndExtra = 0;
  95.     skinWindowClass.hbrBackground = HBRUSH (COLOR_WINDOW);
  96.     skinWindowClass.hCursor = LoadCursor( NULL , IDC_ARROW );
  97.     skinWindowClass.hIcon = LoadIcon( m_hInst, "VLC_ICON" );
  98.     skinWindowClass.hInstance = m_hInst;
  99.     // Register class and check it
  100.     if( !RegisterClass( &skinWindowClass ) )
  101.     {
  102.         WNDCLASS wndclass;
  103.         // Check why it failed. If it's because the class already exists
  104.         // then fine, otherwise return with an error.
  105.         if( !GetClassInfo( m_hInst, "SkinWindowClass", &wndclass ) )
  106.         {
  107.             msg_Err( getIntf(), "Cannot register window class" );
  108.             return false;
  109.         }
  110.     }
  111.     // Create Window
  112.     m_hParentWindow = CreateWindowEx( WS_EX_APPWINDOW, "SkinWindowClass",
  113.         "VLC media player", WS_SYSMENU|WS_POPUP, -200, -200, 0, 0, 0, 0, m_hInst, 0 );
  114.     if( m_hParentWindow == NULL )
  115.     {
  116.         msg_Err( getIntf(), "Cannot create parent window" );
  117.         return false;
  118.     }
  119.     // We do it this way otherwise CreateWindowEx will fail
  120.     // if WS_EX_LAYERED is not supported
  121.     SetWindowLongPtr( m_hParentWindow, GWL_EXSTYLE,
  122.                       GetWindowLong( m_hParentWindow, GWL_EXSTYLE )
  123.                       | WS_EX_LAYERED );
  124.     // Store with it a pointer to the interface thread
  125.     SetWindowLongPtr( m_hParentWindow, GWLP_USERDATA, (LONG_PTR)getIntf() );
  126.     ShowWindow( m_hParentWindow, SW_SHOW );
  127.     // Initialize the OLE library (for drag & drop)
  128.     OleInitialize( NULL );
  129.     // We dynamically load msimg32.dll to get a pointer to TransparentBlt()
  130.     m_hMsimg32 = LoadLibrary( "msimg32.dll" );
  131.     if( !m_hMsimg32 ||
  132.         !( TransparentBlt =
  133.             (BOOL (WINAPI*)(HDC, int, int, int, int,
  134.                             HDC, int, int, int, int, unsigned int))
  135.             GetProcAddress( m_hMsimg32, "TransparentBlt" ) ) )
  136.     {
  137.         TransparentBlt = NULL;
  138.         msg_Dbg( getIntf(), "Couldn't find TransparentBlt(), "
  139.                  "falling back to BitBlt()" );
  140.     }
  141.     if( !m_hMsimg32 ||
  142.         !( AlphaBlend =
  143.             (BOOL (WINAPI*)( HDC, int, int, int, int, HDC, int, int,
  144.                               int, int, BLENDFUNCTION ))
  145.             GetProcAddress( m_hMsimg32, "AlphaBlend" ) ) )
  146.     {
  147.         AlphaBlend = NULL;
  148.         msg_Dbg( getIntf(), "Couldn't find AlphaBlend()" );
  149.     }
  150.     // Idem for user32.dll and SetLayeredWindowAttributes()
  151.     m_hUser32 = LoadLibrary( "user32.dll" );
  152.     if( !m_hUser32 ||
  153.         !( SetLayeredWindowAttributes =
  154.             (BOOL (WINAPI *)(HWND, COLORREF, BYTE, DWORD))
  155.             GetProcAddress( m_hUser32, "SetLayeredWindowAttributes" ) ) )
  156.     {
  157.         SetLayeredWindowAttributes = NULL;
  158.         msg_Dbg( getIntf(), "Couldn't find SetLayeredWindowAttributes()" );
  159.     }
  160.     // Initialize the resource path
  161.     m_resourcePath.push_back( (string)getIntf()->p_vlc->psz_homedir +
  162.                                "\" + CONFIG_DIR + "\skins" );
  163.     m_resourcePath.push_back( (string)getIntf()->p_libvlc->psz_vlcpath +
  164.                               "\skins" );
  165.     m_resourcePath.push_back( (string)getIntf()->p_libvlc->psz_vlcpath +
  166.                               "\skins2" );
  167.     m_resourcePath.push_back( (string)getIntf()->p_libvlc->psz_vlcpath +
  168.                               "\share\skins" );
  169.     m_resourcePath.push_back( (string)getIntf()->p_libvlc->psz_vlcpath +
  170.                               "\share\skins2" );
  171.     // All went well
  172.     return true;
  173. }
  174. Win32Factory::~Win32Factory()
  175. {
  176.     // Uninitialize the OLE library
  177.     OleUninitialize();
  178.     if( m_hParentWindow ) DestroyWindow( m_hParentWindow );
  179.     // Unload msimg32.dll and user32.dll
  180.     if( m_hMsimg32 )
  181.         FreeLibrary( m_hMsimg32 );
  182.     if( m_hUser32 )
  183.         FreeLibrary( m_hUser32 );
  184. }
  185. OSGraphics *Win32Factory::createOSGraphics( int width, int height )
  186. {
  187.     return new Win32Graphics( getIntf(), width, height );
  188. }
  189. OSLoop *Win32Factory::getOSLoop()
  190. {
  191.     return Win32Loop::instance( getIntf() );
  192. }
  193. void Win32Factory::destroyOSLoop()
  194. {
  195.     Win32Loop::destroy( getIntf() );
  196. }
  197. void Win32Factory::minimize()
  198. {
  199.     /* Make sure no tooltip is visible first */
  200.     getIntf()->p_sys->p_theme->getWindowManager().hideTooltip();
  201.     ShowWindow( m_hParentWindow, SW_MINIMIZE );
  202. }
  203. OSTimer *Win32Factory::createOSTimer( const Callback &rCallback )
  204. {
  205.     return new Win32Timer( getIntf(), rCallback, m_hParentWindow );
  206. }
  207. OSWindow *Win32Factory::createOSWindow( GenericWindow &rWindow, bool dragDrop,
  208.                                         bool playOnDrop, OSWindow *pParent )
  209. {
  210.     return new Win32Window( getIntf(), rWindow, m_hInst, m_hParentWindow,
  211.                             dragDrop, playOnDrop, (Win32Window*)pParent );
  212. }
  213. OSTooltip *Win32Factory::createOSTooltip()
  214. {
  215.     return new Win32Tooltip( getIntf(), m_hInst, m_hParentWindow );
  216. }
  217. int Win32Factory::getScreenWidth() const
  218. {
  219.     return GetSystemMetrics(SM_CXSCREEN);
  220. }
  221. int Win32Factory::getScreenHeight() const
  222. {
  223.     return GetSystemMetrics(SM_CYSCREEN);
  224. }
  225. Rect Win32Factory::getWorkArea() const
  226. {
  227.     RECT r;
  228.     SystemParametersInfo( SPI_GETWORKAREA, 0, &r, 0 );
  229.     // Fill a Rect object
  230.     Rect rect( r.left, r.top, r.right, r.bottom );
  231.     return rect;
  232. }
  233. void Win32Factory::getMousePos( int &rXPos, int &rYPos ) const
  234. {
  235.     POINT mousePos;
  236.     GetCursorPos( &mousePos );
  237.     rXPos = mousePos.x;
  238.     rYPos = mousePos.y;
  239. }
  240. void Win32Factory::changeCursor( CursorType_t type ) const
  241. {
  242.     LPCTSTR id;
  243.     switch( type )
  244.     {
  245.         case kDefaultArrow:
  246.             id = IDC_ARROW;
  247.             break;
  248.         case kResizeNWSE:
  249.             id = IDC_SIZENWSE;
  250.             break;
  251.         case kResizeNS:
  252.             id = IDC_SIZENS;
  253.             break;
  254.         case kResizeWE:
  255.             id = IDC_SIZEWE;
  256.             break;
  257.         case kResizeNESW:
  258.             id = IDC_SIZENESW;
  259.             break;
  260.         default:
  261.             id = IDC_ARROW;
  262.             break;
  263.     }
  264.     HCURSOR hCurs = LoadCursor( NULL, id );
  265.     SetCursor( hCurs );
  266. }
  267. void Win32Factory::rmDir( const string &rPath )
  268. {
  269.     WIN32_FIND_DATA find;
  270.     string file;
  271.     string findFiles = rPath + "\*";
  272.     HANDLE handle    = FindFirstFile( findFiles.c_str(), &find );
  273.     while( handle != INVALID_HANDLE_VALUE )
  274.     {
  275.         // If file is neither "." nor ".."
  276.         if( strcmp( find.cFileName, "." ) && strcmp( find.cFileName, ".." ) )
  277.         {
  278.             // Set file name
  279.             file = rPath + "\" + (string)find.cFileName;
  280.             // If file is a directory, delete it recursively
  281.             if( find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
  282.             {
  283.                 rmDir( file );
  284.             }
  285.             // Else, it is a file so simply delete it
  286.             else
  287.             {
  288.                 DeleteFile( file.c_str() );
  289.             }
  290.         }
  291.         // If no more file in directory, exit while
  292.         if( !FindNextFile( handle, &find ) )
  293.             break;
  294.     }
  295.     // Now directory is empty so can be removed
  296.     FindClose( handle );
  297.     RemoveDirectory( rPath.c_str() );
  298. }
  299. #endif