CWindow release candidate 25.
Also updated templates for the WinFBE editor.
In the updated templates I'm using GET_WM_COMMAND_ID(wParam, lParam) instead of LOWORD(lParam) and GET_WM_COMMAND_CMD(wParam, lParam) instead of HIWORD(lParam). These are standard macros located at windowsx.bi.
Template to embed a YouTube video using the YouTube HTML5 player. By default, YouTube uses the old Shockwave-Flash player, that does not scale text and its UI elements when embedded in a DPI aware application.
2
FBGUI
.bas
CWindow: WebBrowser: YouTube (HTML5 player)
' ########################################################################################
' Microsoft Windows
' File: CW_WB_YouTube_HTML5.fbtpl
' Contents: WebBrowser - YouTube HTML5 Player
' Compiler: FreeBasic 32 & 64 bit
' Copyright (c) 2016 Jose Roca. Freeware. Use at your own risk.
' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
' EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
' MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
' ########################################################################################
#define UNICODE
#INCLUDE ONCE "Afx/CWindow.inc"
#INCLUDE ONCE "Afx/CWebBrowser/CWebBrowser.inc"
USING Afx
CONST IDC_WEBBROWSER = 1001
DECLARE FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _
BYVAL hPrevInstance AS HINSTANCE, _
BYVAL szCmdLine AS ZSTRING PTR, _
BYVAL nCmdShow AS LONG) AS LONG
END WinMain(GetModuleHandleW(NULL), NULL, COMMAND(), SW_NORMAL)
' // Forward declaration
DECLARE FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT
' ========================================================================================
' Build the script
' Notes: For some reason, using 'height=100%' with iframe does not work as expected; the
' height attribute only works with pixel values, not percentage. As a workaround, we style
' the iframe by giving it a relative height value in viewport units (vh) instead of
' absolute pixels (style='height:100vh'). To force YouTube to use the HTML5 player
' instead of the Shockwave-Flash player, we have to add ""?html5=1'".
' ========================================================================================
FUNCTION BuildYouTubeScript (BYVAL strCode AS STRING) AS STRING
DIM s AS STRING
s = "<!DOCTYPE html>"
s += "<html>"
s += "<head>"
s += " <title>YouTube video (HTML5 player)</title>"
s += " <meta http-equiv='X-UA-Compatible' content='IE=edge' />"
s += " <meta http-equiv='MSThemeCompatible' content='Yes'>"
s += "</head>"
s += "<body scroll='no' style='MARGIN: 0px 0px 0px 0px'>"
s += "<iframe width='100%' style='height:100vh'"
s += " src='http://www.youtube.com/embed/" & strCode & "?html5=1'>"
s += "</iframe>"
s += "</body>"
s += "</html>"
FUNCTION = s
END FUNCTION
' ========================================================================================
' ========================================================================================
' Main
' ========================================================================================
FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _
BYVAL hPrevInstance AS HINSTANCE, _
BYVAL szCmdLine AS ZSTRING PTR, _
BYVAL nCmdShow AS LONG) AS LONG
' // Set process DPI aware
' // The recommended way is to use a manifest file
AfxSetProcessDPIAware
' // Creates the main window
DIM pWindow AS CWindow
' -or- DIM pWindow AS CWindow = "MyClassName" (use the name that you wish)
DIM hwndMain AS HWND = pWindow.Create(NULL, "WebBrowser - YouTube HTML5 Player", @WndProc)
' // Sizes it by setting the wanted width and height of its client area
pWindow.SetClientSize(750, 450)
' // Centers the window
pWindow.Center
' // Add a WebBrowser control
DIM pwb AS CWebBrowser = CWebBrowser(@pWindow, IDC_WEBBROWSER, 0, 0, pWindow.ClientWidth, pWindow.ClientHeight)
' // Set the IDocHostUIHandler interface
pwb.SetUIHandler
' // Build the script
DIM strCode AS STRING = "IUGfC7GYi18" ' --> Change me: 11 character video code
DIM s AS STRING = BuildYouTubeScript(strCode)
' // Save the script as a temporary file
DIM wszPath AS WSTRING * MAX_PATH = AfxSaveTempFile(s, "html")
' // Navigate to the path
pwb.Navigate(wszPath)
' // Processes pending Windows messages to allow the page to load
' // Needed if the message pump isn't running
AfxPumpMessages
' // Kill the temporary file
KILL wszPath
' // Displays the window and dispatches the Windows messages
FUNCTION = pWindow.DoEvents(nCmdShow)
END FUNCTION
' ========================================================================================
' ========================================================================================
' Main window procedure
' ========================================================================================
FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT
SELECT CASE uMsg
CASE WM_COMMAND
SELECT CASE GET_WM_COMMAND_ID(wParam, lParam)
CASE IDCANCEL
' // If ESC key pressed, close the application by sending an WM_CLOSE message
IF GET_WM_COMMAND_CMD(wParam, lParam) = BN_CLICKED THEN
SendMessageW hwnd, WM_CLOSE, 0, 0
EXIT FUNCTION
END IF
END SELECT
CASE WM_SIZE
IF wParam <> SIZE_MINIMIZED THEN
' // Retrieve a pointer to the CWindow class
DIM pWindow AS CWindow PTR = AfxCWindowPtr(hwnd)
' // Move the position of the button
IF pWindow THEN pWindow->MoveWindow GetDlgItem(hwnd, IDC_WEBBROWSER), _
0, 0, pWindow->ClientWidth, pWindow->ClientHeight, CTRUE
END IF
CASE WM_DESTROY
' // Ends the application by sending a WM_QUIT message
PostQuitMessage(0)
EXIT FUNCTION
END SELECT
' // Default processing of Windows messages
FUNCTION = DefWindowProcW(hwnd, uMsg, wParam, lParam)
END FUNCTION
' ========================================================================================
This one loads an .mp4 video using the HTML5 video player.
2
FBGUI
.bas
CWindow: WebBrowser: HTML5 Video Player
' ########################################################################################
' Microsoft Windows
' File: CW_WB_HTML5_VideoPlayer.fbtpl
' Contents: WebBrowser - HTML5 Video Player
' Compiler: FreeBasic 32 & 64 bit
' Copyright (c) 2016 Jose Roca. Freeware. Use at your own risk.
' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
' EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
' MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
' ########################################################################################
#define UNICODE
#INCLUDE ONCE "Afx/CWindow.inc"
#INCLUDE ONCE "Afx/CWebBrowser/CWebBrowser.inc"
USING Afx
CONST IDC_WEBBROWSER = 1001
DECLARE FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _
BYVAL hPrevInstance AS HINSTANCE, _
BYVAL szCmdLine AS ZSTRING PTR, _
BYVAL nCmdShow AS LONG) AS LONG
END WinMain(GetModuleHandleW(NULL), NULL, COMMAND(), SW_NORMAL)
' // Forward declaration
DECLARE FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT
' ========================================================================================
' Build the script
' ========================================================================================
FUNCTION BuildScript () AS STRING
DIM s AS STRING
s = "<!DOCTYPE html>"
s += "<html>"
s += "<head>"
s += " <title>HTML5 video control</title>"
s += " <meta http-equiv='X-UA-Compatible' content='IE=edge' />"
s += " <meta http-equiv='MSThemeCompatible' content='Yes'>"
s += " <style type='text/css'>"
s += " /* Set basic style for video */"
s += " #theVideo"
s += " {"
s += " display:block;"
s += " position:absolute;"
s += " left:0px;"
s += " top:0px;"
s += " width:100%;"
s += " height:100%;"
' s += " border: 2px solid red;"
' s += " border-radius: 20px;"
s += " }"
s += " </style>"
s += "</head>"
s += "<body>"
s += " <video src='http://ie.microsoft.com/testdrive/ieblog/2011/nov/pp4_blog_demo.mp4' id='theVideo' controls >"
s += " This browser or mode doesn't support HTML5 video."
s += " </video>"
s += "</body>"
s += "</html>"
FUNCTION = s
END FUNCTION
' ========================================================================================
' ========================================================================================
' Main
' ========================================================================================
FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _
BYVAL hPrevInstance AS HINSTANCE, _
BYVAL szCmdLine AS ZSTRING PTR, _
BYVAL nCmdShow AS LONG) AS LONG
' // Set process DPI aware
' // The recommended way is to use a manifest file
AfxSetProcessDPIAware
' // Creates the main window
DIM pWindow AS CWindow
' -or- DIM pWindow AS CWindow = "MyClassName" (use the name that you wish)
DIM hwndMain AS HWND = pWindow.Create(NULL, "WebBrowser - HTML5 Video Player", @WndProc)
' // Sizes it by setting the wanted width and height of its client area
pWindow.SetClientSize(750, 450)
' // Centers the window
pWindow.Center
' // Add a WebBrowser control
DIM pwb AS CWebBrowser = CWebBrowser(@pWindow, IDC_WEBBROWSER, 0, 0, pWindow.ClientWidth, pWindow.ClientHeight)
' // Set the IDocHostUIHandler interface
pwb.SetUIHandler
' // Build the script
DIM s AS STRING = BuildScript
' // Save the script as a temporary file
DIM wszPath AS WSTRING * MAX_PATH = AfxSaveTempFile(s, "html")
' // Navigate to the path
pwb.Navigate(wszPath)
' // Processes pending Windows messages to allow the page to load
' // Needed if the message pump isn't running
AfxPumpMessages
' // Kill the temporary file
KILL wszPath
|
' // Displays the window and dispatches the Windows messages
FUNCTION = pWindow.DoEvents(nCmdShow)
END FUNCTION
' ========================================================================================
' ========================================================================================
' Main window procedure
' ========================================================================================
FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT
SELECT CASE uMsg
CASE WM_COMMAND
SELECT CASE GET_WM_COMMAND_ID(wParam, lParam)
CASE IDCANCEL
' // If ESC key pressed, close the application by sending an WM_CLOSE message
IF GET_WM_COMMAND_CMD(wParam, lParam) = BN_CLICKED THEN
SendMessageW hwnd, WM_CLOSE, 0, 0
EXIT FUNCTION
END IF
END SELECT
CASE WM_SIZE
IF wParam <> SIZE_MINIMIZED THEN
' // Retrieve a pointer to the CWindow class
DIM pWindow AS CWindow PTR = AfxCWindowPtr(hwnd)
' // Move the position of the button
IF pWindow THEN pWindow->MoveWindow GetDlgItem(hwnd, IDC_WEBBROWSER), _
0, 0, pWindow->ClientWidth, pWindow->ClientHeight, CTRUE
END IF
CASE WM_DESTROY
' // Ends the application by sending a WM_QUIT message
PostQuitMessage(0)
EXIT FUNCTION
END SELECT
' // Default processing of Windows messages
FUNCTION = DefWindowProcW(hwnd, uMsg, wParam, lParam)
END FUNCTION
' ========================================================================================
thank you Jose :)
I think that I may eventually use the YouTube HTML5 player embedded into the WinFBE Editor. The code would be hardwired to play WinFBE instructional videos that I will post to YouTube. That would be pretty cool and also serve to highlight use of Jose's awesome code.