win32_window.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:6k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * win32_window.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 the VideoLAN team
  5.  * $Id: 4725d83592df6cf9b3fdee0984e588529fb255d9 $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *          Olivier Teulière <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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #ifdef WIN32_SKINS
  25. #include "../src/generic_window.hpp"
  26. #include "../src/vlcproc.hpp"
  27. #include "win32_window.hpp"
  28. #include "win32_dragdrop.hpp"
  29. #include "win32_factory.hpp"
  30. /// Fading API
  31. #ifndef LWA_COLORKEY
  32. #   define LWA_COLORKEY  0x00000001
  33. #   define LWA_ALPHA     0x00000002
  34. #endif
  35. // XXX layered windows are supposed to work only with at least win2k
  36. #ifndef WS_EX_LAYERED
  37. #   define WS_EX_LAYERED 0x00080000
  38. #endif
  39. Win32Window::Win32Window( intf_thread_t *pIntf, GenericWindow &rWindow,
  40.                           HINSTANCE hInst, HWND hParentWindow,
  41.                           bool dragDrop, bool playOnDrop,
  42.                           Win32Window *pParentWindow ):
  43.     OSWindow( pIntf ), m_dragDrop( dragDrop ), m_isLayered( false ),
  44.     m_pParent( pParentWindow )
  45. {
  46.     // Create the window
  47.     if( pParentWindow )
  48.     {
  49.         // Child window (for vout)
  50.         m_hWnd_parent = pParentWindow->getHandle();
  51.         m_hWnd = CreateWindowEx( WS_EX_TOOLWINDOW | WS_EX_NOPARENTNOTIFY,
  52.                      "SkinWindowClass", "default name", WS_CHILD,
  53.                      CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  54.                      m_hWnd_parent, 0, hInst, NULL );
  55.     }
  56.     else
  57.     {
  58.         // Normal window
  59.         m_hWnd_parent = hParentWindow;
  60.         m_hWnd = CreateWindowEx( WS_EX_TOOLWINDOW, "SkinWindowClass",
  61.             "default name", WS_POPUP | WS_CLIPCHILDREN,
  62.             CW_USEDEFAULT, CW_USEDEFAULT,
  63.             CW_USEDEFAULT, CW_USEDEFAULT, m_hWnd_parent, 0, hInst, NULL );
  64.     }
  65.     if( !m_hWnd )
  66.     {
  67.         msg_Err( getIntf(), "CreateWindow failed" );
  68.         return;
  69.     }
  70.     // Store a pointer to the GenericWindow in a map
  71.     Win32Factory *pFactory = (Win32Factory*)Win32Factory::instance( getIntf() );
  72.     pFactory->m_windowMap[m_hWnd] = &rWindow;
  73.     // Drag & drop
  74.     if( m_dragDrop )
  75.     {
  76.         m_pDropTarget = (LPDROPTARGET) new Win32DragDrop( getIntf(),
  77.                                                           playOnDrop );
  78.         // Register the window as a drop target
  79.         RegisterDragDrop( m_hWnd, m_pDropTarget );
  80.     }
  81. }
  82. Win32Window::~Win32Window()
  83. {
  84.     Win32Factory *pFactory = (Win32Factory*)Win32Factory::instance( getIntf() );
  85.     pFactory->m_windowMap[m_hWnd] = NULL;
  86.     if( m_hWnd )
  87.     {
  88.         if( m_dragDrop )
  89.         {
  90.             // Remove the window from the list of drop targets
  91.             RevokeDragDrop( m_hWnd );
  92.             m_pDropTarget->Release();
  93.         }
  94.         DestroyWindow( m_hWnd );
  95.     }
  96. }
  97. void Win32Window::reparent( void* OSHandle, int x, int y, int w, int h )
  98. {
  99.     // Reparent the window
  100.     SetParent( m_hWnd, (HWND)OSHandle );
  101.     MoveWindow( m_hWnd, x, y, w, h, true );
  102. }
  103. void Win32Window::show( int left, int top ) const
  104. {
  105.     ShowWindow( m_hWnd, SW_SHOW );
  106. }
  107. void Win32Window::hide() const
  108. {
  109.     ShowWindow( m_hWnd, SW_HIDE );
  110. }
  111. void Win32Window::moveResize( int left, int top, int width, int height ) const
  112. {
  113.     MoveWindow( m_hWnd, left, top, width, height, true );
  114. }
  115. void Win32Window::raise() const
  116. {
  117. //     SetWindowPos( m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
  118.     SetForegroundWindow( m_hWnd );
  119. }
  120. void Win32Window::setOpacity( uint8_t value ) const
  121. {
  122.     Win32Factory *pFactory = (Win32Factory*)Win32Factory::instance( getIntf() );
  123.     if( value == 255 )
  124.     {
  125.         // If the window is opaque, we remove the WS_EX_LAYERED attribute
  126.         // which slows down resizing for nothing
  127.         if( m_isLayered )
  128.         {
  129.             SetWindowLongPtr( m_hWnd, GWL_EXSTYLE,
  130.                 GetWindowLong( m_hWnd, GWL_EXSTYLE ) & ~WS_EX_LAYERED );
  131.             // Redraw the window, otherwise we may end up with a grey rectangle
  132.             // for some strange reason
  133.             RedrawWindow(m_hWnd, NULL, NULL,
  134.                 RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
  135.             m_isLayered = false;
  136.         }
  137.     }
  138.     else
  139.     {
  140.         if( pFactory->SetLayeredWindowAttributes )
  141.         {
  142.             if( ! m_isLayered )
  143.             {
  144.                 // (Re)Add the WS_EX_LAYERED attribute.
  145.                 // Resizing will be very slow, now :)
  146.                 SetWindowLongPtr( m_hWnd, GWL_EXSTYLE,
  147.                     GetWindowLong( m_hWnd, GWL_EXSTYLE ) | WS_EX_LAYERED );
  148.                 // Redraw the window, otherwise we may end up with a grey
  149.                 // rectangle for some strange reason
  150.                 RedrawWindow(m_hWnd, NULL, NULL,
  151.                     RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
  152.                 m_isLayered = true;
  153.             }
  154.             // Change the opacity
  155.             pFactory->SetLayeredWindowAttributes(
  156.                 m_hWnd, 0, value, LWA_ALPHA|LWA_COLORKEY );
  157.         }
  158.     }
  159. }
  160. void Win32Window::toggleOnTop( bool onTop ) const
  161. {
  162.     if( onTop )
  163.     {
  164.         // Set the window on top
  165.         SetWindowPos( m_hWnd, HWND_TOPMOST, 0, 0, 0, 0,
  166.                       SWP_NOSIZE | SWP_NOMOVE );
  167.     }
  168.     else
  169.     {
  170.         // Set the window not on top
  171.         SetWindowPos( m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0,
  172.                       SWP_NOSIZE | SWP_NOMOVE );
  173.     }
  174. }
  175. #endif