void VLCHolderWnd::DestroyWindow() { LibVlcDetach(); if( hWnd() ) ::DestroyWindow( hWnd() ); };
void VLCControlsWnd::NeedShowControls() { if( !(GetWindowLong(hWnd(), GWL_STYLE) & WS_VISIBLE) ) { if(WM().IsFullScreen() || (PO() && PO()->get_show_toolbar() ) ) ShowWindow( hWnd(), SW_SHOW ); } //hide controls after 2 seconds SetTimer(hWnd(), 1, 2*1000, NULL); }
void VLCControlsWnd::CreateToolTip() { hToolTipWnd = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd(), NULL, hInstance(), NULL); SetWindowPos(hToolTipWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); TOOLINFO ti; ti.cbSize = sizeof(TOOLINFO); ti.uFlags = TTF_SUBCLASS|TTF_IDISHWND; ti.hwnd = hWnd(); ti.hinst = hInstance(); TCHAR HintText[100]; RECT ActivateTTRect; //end fullscreen button tooltip GetWindowRect(hFSButton, &ActivateTTRect); GetWindowText(hFSButton, HintText, sizeof(HintText)); ti.uId = (UINT_PTR)hFSButton; ti.rect = ActivateTTRect; ti.lpszText = HintText; SendMessage(hToolTipWnd, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); //play/pause button tooltip GetWindowRect(hPlayPauseButton, &ActivateTTRect); GetWindowText(hPlayPauseButton, HintText, sizeof(HintText)); ti.uId = (UINT_PTR)hPlayPauseButton; ti.rect = ActivateTTRect; ti.lpszText = HintText; SendMessage(hToolTipWnd, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); //mute button tooltip GetWindowRect(hMuteButton, &ActivateTTRect); GetWindowText(hMuteButton, HintText, sizeof(HintText)); ti.uId = (UINT_PTR)hMuteButton; ti.rect = ActivateTTRect; ti.lpszText = HintText; SendMessage(hToolTipWnd, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); }
void VLCControlsWnd::NeedShowControls() { if( PO() && ( ( !WM().IsFullScreen() && PO()->get_show_toolbar() ) || ( WM().IsFullScreen() && PO()->get_show_fs_toolbar() ) ) ) { if( !(GetWindowLong(hWnd(), GWL_STYLE) & WS_VISIBLE) ) ShowWindow( hWnd(), SW_SHOW ); //hide controls after 2 seconds //and restart timer if it already counting SetTimer(hWnd(), 1, 2*1000, NULL); } }
LRESULT VLCHolderWnd::WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_CREATE: { CREATESTRUCT* CreateStruct = (CREATESTRUCT*) lParam; RECT ParentClientRect; GetClientRect( CreateStruct->hwndParent, &ParentClientRect ); MoveWindow( hWnd(), 0, 0, ( ParentClientRect.right-ParentClientRect.left ), ( ParentClientRect.bottom-ParentClientRect.top ), FALSE ); break; } case WM_PAINT: { PAINTSTRUCT PaintStruct; HDC hDC = BeginPaint( hWnd(), &PaintStruct ); RECT rect; GetClientRect( hWnd(), &rect ); int IconX = ( ( rect.right - rect.left ) - GetSystemMetrics( SM_CXICON ) ) / 2 ; int IconY = ( ( rect.bottom - rect.top ) - GetSystemMetrics( SM_CYICON ) ) / 2; DrawIcon( hDC, IconX, IconY, RC().hBackgroundIcon ); EndPaint( hWnd(), &PaintStruct ); break; } case WM_SHOWWINDOW: { break; } case WM_TRY_SET_MOUSE_HOOK: { MouseHook( true ); break; } case WM_SIZE: break; case WM_MOUSEMOVE: case WM_LBUTTONDBLCLK: WM().OnMouseEvent( uMsg ); break; case WM_MOUSE_EVENT_NOTIFY: { WM().OnMouseEvent( wParam ); return WM_MOUSE_EVENT_NOTIFY_SUCCESS; } default: return VLCWnd::WindowProc( uMsg, wParam, lParam ); } return 0; }
LRESULT ControlMediaPlayer::Evento_Mouse_Movimiento(const int cX, const int cY, const UINT wParam) { UltimoMovimiento = GetTickCount(); if (EstaEnPantallaCompleta() == true) { DWL::SO::DWLMouse::Visible(TRUE); RECT Recta; POINT MousePos; DWL::SO::DWLMouse::ObtenerPosicion(&MousePos); HRGN RMP = CreateRectRgn(0, 0, 0, 0); GetWindowRgn(Sistema.App.ControlesMP.hWnd(), RMP); GetWindowRect(_hWnd, &Recta); int x; if (Recta.left > 0) x = ((Recta.right - Recta.left) - CONTROLESMP_ANCHO) / 2; else x = (((Recta.right + Recta.left) + CONTROLESMP_ANCHO) / 2) - CONTROLESMP_ANCHO; if (ControlesMP_Abajo == true) { int y = (Recta.bottom - Recta.top) - CONTROLESMP_ALTO; int r = OffsetRgn(RMP, x, y); if (PtInRegion(RMP, MousePos.x, MousePos.y) == TRUE) { Sistema.App.ControlesMP.Mostrar(_hWnd, ControlesMP_Abajo); } else { Sistema.App.ControlesMP.Ocultar(hWnd()); } } else { OffsetRgn(RMP, x, 0); if (PtInRegion(RMP, MousePos.x, MousePos.y) == TRUE) { Sistema.App.ControlesMP.Mostrar(_hWnd, ControlesMP_Abajo); } else { Sistema.App.ControlesMP.Ocultar(hWnd()); } } DeleteObject(RMP); } return 0; }
//libvlc events arrives from separate thread void VLCHolderWnd::OnLibVlcEvent( const libvlc_event_t* event ) { //We need set hook to catch doubleclicking (to switch to fullscreen and vice versa). //But libvlc media window may not exist yet, //and we don't know when it will be created, nor ThreadId of it. //So we try catch events, //(suppose wnd will be ever created), //and then try set mouse hook. HWND hMPWnd = FindMP_hWnd(); const DWORD WndThreadID = hMPWnd ? GetWindowThreadProcessId( hMPWnd, NULL ) : 0; //if no hook, or window thread has changed if(!_hMouseHook || ( hMPWnd && WndThreadID != _MouseHookThreadId ) ) { DWORD s = GetWindowLong( hMPWnd, GWL_STYLE ); s |= WS_CLIPSIBLINGS; SetWindowLong( hMPWnd, GWL_STYLE, s ); //libvlc events arrives from separate thread, //so we need post message to main thread, to notify it. PostMessage( hWnd(), WM_TRY_SET_MOUSE_HOOK, 0, 0 ); } }
void VLCHolderWnd::LibVlcAttach() { if( VP() ) libvlc_media_player_set_hwnd( VP()->get_mp(), hWnd() ); }
HWND VLCHolderWnd::FindMP_hWnd() { return GetWindow( hWnd(), GW_CHILD ); }
bool MyApp::initialise(HINSTANCE hInstance, int cmdShow) { if (!DxApp::initialise(hInstance, cmdShow, 1024, 768)) return false; // Build FXs if (FAILED(buildFX())) { MessageBox(hWnd(), L"Cannot create effects", L"Error", MB_OK|MB_ICONERROR); return false; } // Build Geometry if (FAILED(buildGeometry())) { MessageBox(hWnd(), L"Cannot create geometry", L"Error", MB_OK|MB_ICONERROR); return false; } // Textures HRESULT hr = D3DX11CreateShaderResourceViewFromFileA(_dxDev, (PATH_MEDIA+string("noise_texture.jpg")).c_str(), 0, 0, &m_srvRandom, 0); if (FAILED(hr)) { MessageBoxA(0, "Error loading random texture", 0, 0); return false; } // flags for heightmap texture D3DX11_IMAGE_LOAD_INFO loadInfo; loadInfo.Width = D3DX11_DEFAULT; loadInfo.Height = D3DX11_DEFAULT; loadInfo.Depth = D3DX11_DEFAULT; loadInfo.FirstMipLevel = D3DX11_DEFAULT; loadInfo.MipLevels = D3DX11_DEFAULT; loadInfo.Usage = (D3D11_USAGE)D3DX11_DEFAULT; loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; //D3DX11_DEFAULT; loadInfo.CpuAccessFlags = loadInfo.MiscFlags = D3DX11_DEFAULT; loadInfo.Format = DXGI_FORMAT_R32G32B32A32_FLOAT ; loadInfo.Filter = D3DX11_DEFAULT; loadInfo.MipFilter = D3DX11_DEFAULT; loadInfo.pSrcInfo = NULL; hr = D3DX11CreateShaderResourceViewFromFileA(_dxDev, (PATH_MEDIA+string("heightmap.jpg")).c_str(), &loadInfo, 0, &m_srvTerrainHmap, 0); if (FAILED(hr)) { MessageBoxA(0, "Error loading terrain heightmap", 0, 0); return false; } hr = D3DX11CreateShaderResourceViewFromFileA(_dxDev, (PATH_MEDIA+string("normalmap.bmp")).c_str(), 0, 0, &m_srvTerrainNmap, 0); if (FAILED(hr)) { MessageBoxA(0, "Error loading terrain normalmap", 0, 0); return false; } hr = D3DX11CreateShaderResourceViewFromFileA(_dxDev, (PATH_MEDIA+string("space_ship.jpg")).c_str(), 0, 0, &m_srvSpaceship, 0); if (FAILED(hr)) { MessageBoxA(0, "Error loading spaceship texture", 0, 0); return false; } // Dynamic terrain ID3D11Resource* resHmap = 0; m_srvTerrainHmap->GetResource(&resHmap); D3D11_RENDER_TARGET_VIEW_DESC rtd; rtd.Format = DXGI_FORMAT_R32G32B32A32_FLOAT ; rtd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; rtd.Texture2D.MipSlice = 0; hr = _dxDev->CreateRenderTargetView(resHmap, &rtd, &m_rtvDynamicHmap); if (FAILED(hr)) { MessageBoxA(0, "Error creating hmap rtv", 0, 0); return false; } //////////////////////////////////// //rs_Wireframe D3D11_RASTERIZER_DESC rsd; ZeroMemory(&rsd, sizeof(rsd)); rsd.FillMode = D3D11_FILL_WIREFRAME; rsd.CullMode = D3D11_CULL_BACK; rsd.DepthClipEnable = true; hr = _dxDev->CreateRasterizerState(&rsd, &rs_Wireframe); if (FAILED(hr)) MessageBoxA(0, "error creating rs Wireframe", 0, 0); // Camera m_camera.setProjection(0.7f, width()/(float)height(), 1.0f, 500.0f); m_camera.setPosVector(0.0f, 30.0f, 0.0f); m_camera.setRightVector(1.0f, 0.0f, 0.0f); m_camera.setUpVector(0.0f, 1.0f, 0.0f); m_camera.setLookVector(0.0f, 0.0f, 1.0f); // myAlien myAlien.setPos(0,5,0); myAlien.type = AlienTypes::GS_ALIEN; myAlien.mesh = alienMesh; // Textures/Views for Implicit surfaces if (!createImplicitResources()) return false; // Tessellation - control point(s) buffer //____ check for DX11 support__ if (dx11Support()) { // Single control point vertex buffer D3D11_BUFFER_DESC bdsc; bdsc.BindFlags = D3D11_BIND_VERTEX_BUFFER; bdsc.CPUAccessFlags = 0; bdsc.MiscFlags = 0; bdsc.StructureByteStride = 0; bdsc.Usage = D3D11_USAGE_IMMUTABLE; #ifdef _TESS_INDEX_BUFFER // Version 2 : 6 vertices - W/ Index Buffer const int numVertices = 6; Vertex ctrl_point[numVertices]; bdsc.ByteWidth = sizeof(Vertex)*numVertices; ZeroMemory(ctrl_point, sizeof(Vertex)*numVertices); ctrl_point[0].position = XMFLOAT3( 0.0f, 1.0f, 0.0f); // top ctrl_point[1].position = XMFLOAT3(-1.0f, 0.0f, 1.0f); // 1 ------> 2 (+,+) ctrl_point[2].position = XMFLOAT3( 1.0f, 0.0f, 1.0f); // ctrl_point[3].position = XMFLOAT3(-1.0f, 0.0f, -1.0f); // ctrl_point[4].position = XMFLOAT3( 1.0f, 0.0f, -1.0f); // (-,-) 3 ------> 4 ctrl_point[5].position = XMFLOAT3( 0.0f, -1.0f, 0.0f); // bottom UINT indices[24]; // top-front indices[0] = 0; indices[1] = 4; indices[2] = 3; // top-right indices[3] = 0; indices[4] = 2; indices[5] = 4; // top-left indices[6] = 0; indices[7] = 3; indices[8] = 1; // top-back indices[9] = 0; indices[10] = 1; indices[11] = 2; // bottom-front indices[12] = 5; indices[13] = 3; indices[14] = 4; // bottom-right indices[15] = 5; indices[16] = 4; indices[17] = 2; // bottom-left indices[18] = 5; indices[19] = 1; indices[20] = 3; // bottom-back indices[21] = 5; indices[22] = 2; indices[23] = 1; D3D11_BUFFER_DESC idsc; idsc.BindFlags = D3D11_BIND_INDEX_BUFFER; idsc.CPUAccessFlags = 0; idsc.MiscFlags = 0; idsc.StructureByteStride = 0; idsc.Usage = D3D11_USAGE_IMMUTABLE; idsc.ByteWidth = sizeof(UINT) * 24; D3D11_SUBRESOURCE_DATA ibdata; ibdata.pSysMem = indices; ibdata.SysMemPitch = ibdata.SysMemSlicePitch = 0; // create index buffer hr = _dxDev->CreateBuffer(&idsc, &ibdata, &m_ibControlPoints); #else // Version 1 : 24 vertices - No Index Buffer const int numVertices = 3*8; // triangle list - 8 triangles Vertex ctrl_point[numVertices]; bdsc.ByteWidth = sizeof(Vertex) * numVertices; // three control points ZeroMemory(ctrl_point, sizeof(Vertex)*numVertices); // octahedron // CW // top - front ctrl_point[0].position = XMFLOAT3( 0.0f, 1.0f, 0.0f); ctrl_point[1].position = XMFLOAT3( 1.0f, 0.0f, -1.0f); ctrl_point[2].position = XMFLOAT3(-1.0f, 0.0f, -1.0f); // top - right ctrl_point[3].position = XMFLOAT3( 0.0f, 1.0f, 0.0f); ctrl_point[4].position = XMFLOAT3( 1.0f, 0.0f, 1.0f); ctrl_point[5].position = XMFLOAT3( 1.0f, 0.0f, -1.0f); // top - left ctrl_point[6].position = XMFLOAT3( 0.0f, 1.0f, 0.0f); ctrl_point[7].position = XMFLOAT3(-1.0f, 0.0f, -1.0f); ctrl_point[8].position = XMFLOAT3( -1.0f, 0.0f, 1.0f); // top - back ctrl_point[9].position = XMFLOAT3( 0.0f, 1.0f, 0.0f); ctrl_point[10].position = XMFLOAT3(-1.0f, 0.0f, 1.0f); ctrl_point[11].position = XMFLOAT3( 1.0f, 0.0f, 1.0f); // bottom - front ctrl_point[12].position = XMFLOAT3( 0.0f, -1.0f, 0.0f); ctrl_point[13].position = XMFLOAT3(-1.0f, 0.0f, -1.0f); ctrl_point[14].position = XMFLOAT3( 1.0f, 0.0f, -1.0f); // bottom - right ctrl_point[15].position = XMFLOAT3( 0.0f, -1.0f, 0.0f); ctrl_point[16].position = XMFLOAT3( 1.0f, 0.0f, -1.0f); ctrl_point[17].position = XMFLOAT3( 1.0f, 0.0f, 1.0f); // bottom - left ctrl_point[18].position = XMFLOAT3( 0.0f, -1.0f, 0.0f); ctrl_point[19].position = XMFLOAT3(-1.0f, 0.0f, 1.0f); ctrl_point[20].position = XMFLOAT3(-1.0f, 0.0f, -1.0f); // bottom - back ctrl_point[21].position = XMFLOAT3( 0.0f, -1.0f, 0.0f); ctrl_point[22].position = XMFLOAT3( 1.0f, 0.0f, 1.0f); ctrl_point[23].position = XMFLOAT3(-1.0f, 0.0f, 1.0f); #endif D3D11_SUBRESOURCE_DATA bdata; bdata.pSysMem = ctrl_point; bdata.SysMemPitch = bdata.SysMemSlicePitch = 0; hr = _dxDev->CreateBuffer(&bdsc, &bdata, &m_vbControlPoints); if (FAILED(hr)) { MessageBoxA(0, "Error creating control points buffer", 0, 0); return false; } // Bezier surface effect if (!createEffect((PATH_SHADERS+string("tessBezierSurface.fxo")).c_str(), &m_fxTessBezierSurface)) MessageBoxA(0, "Error creating bezSurface effect", 0, 0); // PSP surface effect if (!createEffect((PATH_SHADERS+string("tessPSPSurface.fxo")).c_str(), &m_fxTessPSPSurface)) MessageBoxA(0, "Error creating pspSurface effect", 0, 0); // Sphere effect if (!createEffect((PATH_SHADERS+string("tessSphere.fxo")).c_str(), &m_fxTessSphere)) MessageBoxA(0, "Error creating tessSphere effect", 0, 0); // Mesh effect if (!createEffect((PATH_SHADERS+string("tessMesh.fxo")).c_str(), &m_fxTessMesh)) MessageBoxA(0, "Error creating tessMesh effect", 0, 0); // Terrain effect if (!createEffect((PATH_SHADERS+string("tessTerrain.fxo")).c_str(), &m_fxTessTerrain)) MessageBoxA(0, "Error creating tessMesh effect", 0, 0); ///____SINGLE_________ ZeroMemory(&bdsc, sizeof(bdsc)); bdsc.BindFlags = D3D11_BIND_VERTEX_BUFFER; bdsc.ByteWidth = sizeof(Vertex); bdsc.Usage = D3D11_USAGE_IMMUTABLE; Vertex vSingle[1]; ZeroMemory(&vSingle, sizeof(vSingle)); ZeroMemory(&bdata, sizeof(bdata)); bdata.pSysMem = vSingle; hr = _dxDev->CreateBuffer(&bdsc, &bdata, &m_vbSingle); if (FAILED(hr)) MessageBoxA(0, "Error creating single VB", 0, 0); if (!createEffect((PATH_SHADERS+string("tessSingle.fxo")).c_str(), &m_fxTessSingle)) MessageBoxA(0, "Error creating tessSingle effect", 0, 0); //_____________________ } mySphere.tessFactor = 5; mySphere.radius = 10.0f; setupScene(); // GUI TwInit(TW_DIRECT3D11, _dxDev); TwWindowSize(width(), height()); TwBar* myBar; myBar = TwNewBar("myBar"); TwAddButton(myBar, "Play", callback_Play, (void*)this, 0); TwAddButton(myBar, "Explode", callback_Explode, (void*)this, 0); // __________GS Alien TwAddVarRW(myBar, "Thorn length", TW_TYPE_FLOAT, &glb_fThornLength, "group=GS_Alien min=0.0 max=1.0 step=0.05"); // __________Selected Tessellated Object // Partitioning TwEnumVal twTessPartitioning[] = { { TessPartitioning::FRAC_EVEN, "Frac. Even" }, { TessPartitioning::FRAC_ODD, "Frac. Odd" }, { TessPartitioning::INTEGER, "Integer" }, { TessPartitioning::POW2 , "Pow2" } }; TwType twTessPartition; twTessPartition = TwDefineEnum("TessPartitioning", twTessPartitioning, 4); TwAddVarRW(myBar, "Partitioning Method", twTessPartition, &glb_selectedTessPartitioning, "group=Tessellated_Objects"); // Wireframe TwAddVarRW(myBar, "Wireframe", TW_TYPE_BOOL8, &glb_tessWireframe, "group=Tessellated_Objects"); // Inside Factor TwAddVarRW(myBar, "Inside Factor", TW_TYPE_FLOAT, &glb_insideTess, "group=Tessellated_Objects min=1 max=64 step=1"); // Edge Factor TwAddVarRW(myBar, "Edge Factor", TW_TYPE_FLOAT, &glb_edgeTess, "group=Tessellated_Objects min=1 max=64 step=1"); // Common inside/edge factor TwAddVarRW(myBar, "Common Factor", TW_TYPE_FLOAT, &glb_SingleTessFactor, "group=Tessellated_Objects min=1 max=64 step=1"); TwAddVarRW(myBar, "Single Factor", TW_TYPE_BOOL8, &glb_bSingleTessFactor, ""); ///////////////////// TwAddVarRW(myBar, "Terrain Height", TW_TYPE_FLOAT, &glb_terrainHeight, "group=Terrain min=0.0 max=1.0 step=0.05"); TwAddVarRW(myBar, "Patches Dimension", TW_TYPE_INT32, &glb_terrainPatchDim, "group=Terrain min=1 max=10 step=1"); TwAddVarRW(myBar, "Min Tess. Factor", TW_TYPE_FLOAT, &glb_terrainMinTessFactor, "group=Terrain min=1 max=63 step=1"); TwAddVarRW(myBar, "Max Tess. Factor", TW_TYPE_FLOAT, &glb_terrainMaxTessFactor, "group=Terrain min=1 max=63 step=1"); TwAddVarRW(myBar, "Min View Dist", TW_TYPE_FLOAT, &glb_terrainMinViewDist, "group=Terrain min=0.0 max=300.0 step=1.05"); TwAddVarRW(myBar, "Max View Dist", TW_TYPE_FLOAT, &glb_terrainMaxViewDist, "group=Terrain min=0.0 max=300.0 step=1.05"); TwAddVarRW(myBar, "Debug View", TW_TYPE_BOOL8, &glb_bTerrainDebugView, "group=Terrain"); // Terrain Editing TwAddVarRW(myBar, "Power", TW_TYPE_BOOL8, &glb_bOn, "group=Terrain_Edit"); TwAddVarRW(myBar, "Additive", TW_TYPE_BOOL8, &glb_bAdditive, "group=Terrain_Edit"); TwAddVarRW(myBar, "Range", TW_TYPE_FLOAT, &glb_Range, "group=Terrain_Edit min=0.0 max=1.0 step=0.05"); // Light TwAddVarRW(myBar, "Light Direction", TW_TYPE_DIR3F, &glb_lightDir, ""); TwAddVarRW(myBar, "Light Color", TW_TYPE_COLOR4F, &glb_lightColor, ""); // Implicit Depth TwAddVarRW(myBar, "Implicit Depth", TW_TYPE_INT32, &glb_iImplicitDepth, "group=Implicit min=1 max=3"); TwAddVarRW(myBar, "Wireframe Mode", TW_TYPE_BOOL8, &glb_bWireframe, ""); TwAddVarRW(myBar, "Sphere From Mesh", TW_TYPE_BOOL8, &glb_bSphereMesh, ""); return true; }
void VLCControlsWnd::NeedHideControls() { KillTimer( hWnd(), 1 ); ShowWindow( hWnd(), SW_HIDE ); }
LRESULT VLCControlsWnd::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg){ case WM_CREATE:{ const int ControlsHeight = 21+3; const int ButtonsWidth = ControlsHeight; int HorizontalOffset = xControlsSpace; int ControlWidth = ButtonsWidth; hPlayPauseButton = CreateWindow(TEXT("BUTTON"), TEXT("Play/Pause"), WS_CHILD|WS_VISIBLE|BS_BITMAP|BS_FLAT, HorizontalOffset, xControlsSpace, ControlWidth, ControlsHeight, hWnd(), (HMENU)ID_FS_PLAY_PAUSE, 0, 0); SendMessage(hPlayPauseButton, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)RC().hPauseBitmap); HorizontalOffset+=ControlWidth+xControlsSpace; ControlWidth = 200; int VideoPosControlHeight = 10; hVideoPosScroll = CreateWindow(PROGRESS_CLASS, TEXT("Video Position"), WS_CHILD|WS_DISABLED|WS_VISIBLE|SBS_HORZ|SBS_TOPALIGN|PBS_SMOOTH, HorizontalOffset, xControlsSpace+(ControlsHeight-VideoPosControlHeight)/2, ControlWidth, VideoPosControlHeight, hWnd(), (HMENU)ID_FS_VIDEO_POS_SCROLL, 0, 0); HMODULE hThModule = LoadLibrary(TEXT("UxTheme.dll")); if(hThModule){ FARPROC proc = GetProcAddress(hThModule, "SetWindowTheme"); typedef HRESULT (WINAPI* SetWindowThemeProc)(HWND, LPCWSTR, LPCWSTR); if(proc){ ((SetWindowThemeProc)proc)(hVideoPosScroll, L"", L""); } FreeLibrary(hThModule); } HorizontalOffset+=ControlWidth+xControlsSpace; ControlWidth = ButtonsWidth; hMuteButton = CreateWindow(TEXT("BUTTON"), TEXT("Mute"), WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX|BS_PUSHLIKE|BS_BITMAP, //BS_FLAT HorizontalOffset, xControlsSpace, ControlWidth, ControlsHeight, hWnd(), (HMENU)ID_FS_MUTE, 0, 0); SendMessage(hMuteButton, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)RC().hVolumeBitmap); HorizontalOffset+=ControlWidth+xControlsSpace; ControlWidth = 100; hVolumeSlider = CreateWindow(TRACKBAR_CLASS, TEXT("Volume"), WS_CHILD|WS_VISIBLE|TBS_HORZ|TBS_BOTTOM|TBS_AUTOTICKS, HorizontalOffset, xControlsSpace, ControlWidth, ControlsHeight - 4, hWnd(), (HMENU)ID_FS_VOLUME, 0, 0); HorizontalOffset+=ControlWidth+xControlsSpace; SendMessage(hVolumeSlider, TBM_SETRANGE, FALSE, (LPARAM) MAKELONG (0, 100)); SendMessage(hVolumeSlider, TBM_SETTICFREQ, (WPARAM) 10, 0); ControlWidth = ButtonsWidth; DWORD dwFSBtnStyle = WS_CHILD|BS_BITMAP|BS_FLAT; if( !PO() || PO()->get_enable_fs() ){ dwFSBtnStyle |= WS_VISIBLE; } hFSButton = CreateWindow(TEXT("BUTTON"), TEXT("Toggle fullscreen"), dwFSBtnStyle, HorizontalOffset, xControlsSpace, ControlWidth, ControlsHeight, hWnd(), (HMENU)ID_FS_SWITCH_FS, 0, 0); SendMessage(hFSButton, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)RC().hDeFullscreenBitmap); HorizontalOffset+=ControlWidth+xControlsSpace; RECT rect; GetClientRect(GetParent(hWnd()), &rect); int ControlWndWidth = HorizontalOffset; int ControlWndHeight = xControlsSpace+ControlsHeight+xControlsSpace; SetWindowPos(hWnd(), 0, 0, (rect.bottom - rect.top) - ControlWndWidth, rect.right-rect.left, ControlWndHeight, SWP_NOZORDER|SWP_NOOWNERZORDER|SWP_NOACTIVATE); //new message blinking timer SetTimer(hWnd(), 2, 500, NULL); CreateToolTip(); break; } case WM_SHOWWINDOW:{ if(FALSE!=wParam){ //showing UpdateButtons(); } break; } case WM_LBUTTONUP:{ POINT BtnUpPoint = {LOWORD(lParam), HIWORD(lParam)}; RECT VideoPosRect; GetWindowRect(hVideoPosScroll, &VideoPosRect); ClientToScreen(hWnd(), &BtnUpPoint); if(PtInRect(&VideoPosRect, BtnUpPoint)){ SetVideoPos(float(BtnUpPoint.x-VideoPosRect.left)/(VideoPosRect.right-VideoPosRect.left)); } break; } case WM_TIMER:{ switch(wParam){ case 1:{ POINT MousePoint; GetCursorPos(&MousePoint); RECT ControlWndRect; GetWindowRect(hWnd(), &ControlWndRect); if(PtInRect(&ControlWndRect, MousePoint)||GetCapture()==hVolumeSlider){ //do not allow control window to close while mouse is within NeedShowControls(); } else{ NeedHideControls(); } break; } case 2:{ UpdateButtons(); break; } } break; } case WM_SETCURSOR:{ RECT VideoPosRect; GetWindowRect(hVideoPosScroll, &VideoPosRect); DWORD dwMsgPos = GetMessagePos(); POINT MsgPosPoint = {LOWORD(dwMsgPos), HIWORD(dwMsgPos)}; if(PtInRect(&VideoPosRect, MsgPosPoint)){ SetCursor(LoadCursor(NULL, IDC_HAND)); return TRUE; } else{ return VLCWnd::WindowProc(uMsg, wParam, lParam); } break; } case WM_NCDESTROY: break; case WM_COMMAND:{ WORD NCode = HIWORD(wParam); WORD Control = LOWORD(wParam); switch(NCode){ case BN_CLICKED:{ switch(Control){ case ID_FS_SWITCH_FS: WM().ToggleFullScreen(); break; case ID_FS_PLAY_PAUSE:{ if( VP() ){ if( IsPlaying() ) VP()->pause(); else VP()->play(); } break; } case ID_FS_MUTE:{ if( VP() ){ VP()->audio().set_mute( IsDlgButtonChecked(hWnd(), ID_FS_MUTE) != FALSE ); SyncVolumeSliderWithVLCVolume(); } break; } } break; } } break; } case WM_SIZE:{ if( (GetWindowLong(hWnd(), GWL_STYLE) & WS_VISIBLE) && ( !PO() || ( !WM().IsFullScreen() && !PO()->get_show_toolbar() ) || ( WM().IsFullScreen() && !PO()->get_show_fs_toolbar() ) ) ) { //hide controls when they are not allowed NeedHideControls(); } const int new_client_width = LOWORD(lParam); bool isFSBtnVisible = (GetWindowLong(hFSButton, GWL_STYLE) & WS_VISIBLE) != 0; HDWP hDwp = BeginDeferWindowPos(4); int VideoScrollWidth = new_client_width; POINT pt = {0, 0}; RECT rect; GetWindowRect(hPlayPauseButton, &rect); pt.x = rect.right; ScreenToClient(hWnd(), &pt); VideoScrollWidth -= pt.x; VideoScrollWidth -= xControlsSpace; RECT VideoSrcollRect; GetWindowRect(hVideoPosScroll, &VideoSrcollRect); RECT MuteRect; GetWindowRect(hMuteButton, &MuteRect); VideoScrollWidth -= xControlsSpace; VideoScrollWidth -= (MuteRect.right - MuteRect.left); RECT VolumeRect; GetWindowRect(hVolumeSlider, &VolumeRect); VideoScrollWidth -= xControlsSpace; VideoScrollWidth -= (VolumeRect.right - VolumeRect.left); RECT FSRect = {0, 0, 0, 0}; if( isFSBtnVisible ) { GetWindowRect(hFSButton, &FSRect); VideoScrollWidth -= xControlsSpace; VideoScrollWidth -= (FSRect.right - FSRect.left); VideoScrollWidth -= xControlsSpace; } pt.x = VideoSrcollRect.left; pt.y = VideoSrcollRect.top; ScreenToClient(hWnd(), &pt); hDwp = DeferWindowPos(hDwp, hVideoPosScroll, 0, pt.x, pt.y, VideoScrollWidth, VideoSrcollRect.bottom - VideoSrcollRect.top, SWP_NOACTIVATE|SWP_NOOWNERZORDER); int HorizontalOffset = pt.x + VideoScrollWidth + xControlsSpace; pt.x = 0; pt.y = MuteRect.top; ScreenToClient(hWnd(), &pt); hDwp = DeferWindowPos(hDwp, hMuteButton, 0, HorizontalOffset, pt.y, 0, 0, SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOOWNERZORDER); HorizontalOffset += MuteRect.right - MuteRect.left + xControlsSpace; pt.x = 0; pt.y = VolumeRect.top; ScreenToClient(hWnd(), &pt); hDwp = DeferWindowPos(hDwp, hVolumeSlider, 0, HorizontalOffset, pt.y, 0, 0, SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOOWNERZORDER); HorizontalOffset += VolumeRect.right - VolumeRect.left + xControlsSpace; if( isFSBtnVisible ) { pt.x = 0; pt.y = FSRect.top; ScreenToClient(hWnd(), &pt); hDwp = DeferWindowPos(hDwp, hFSButton, 0, HorizontalOffset, pt.y, 0, 0, SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOOWNERZORDER); } EndDeferWindowPos(hDwp); break; } case WM_HSCROLL: case WM_VSCROLL: { if( VP() ){ if(hVolumeSlider==(HWND)lParam){ LRESULT SliderPos = SendMessage(hVolumeSlider, (UINT) TBM_GETPOS, 0, 0); SetVLCVolumeBySliderPos(SliderPos); } } break; } default: return VLCWnd::WindowProc(uMsg, wParam, lParam); } return 0L; }