📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class//#include "stdafx.h"#include "Osmo4.h"#include "MainFrm.h"#include "resource.h"#include <gpac/network.h>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CChildViewCChildView::CChildView(){}CChildView::~CChildView(){ /*since the wndproc is overwritten by the terminal, we detach the handle otherwise we get a nice assertion failure from windows*/ HWND hWnd = Detach(); ::PostMessage(hWnd, WM_QUIT, 0, 0);}BEGIN_MESSAGE_MAP(CChildView,CWnd ) //{{AFX_MSG_MAP(CChildView) //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CChildView message handlersBOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) { cs.dwExStyle = 0; cs.style &= ~WS_BORDER; cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, ::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL); return TRUE;}/////////////////////////////////////////////////////////////////////////////// CMainFrameIMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_WM_SETFOCUS() ON_WM_INITMENUPOPUP() ON_WM_SIZE() ON_WM_MOVE() ON_MESSAGE(WM_SETSIZE,OnSetSize) ON_MESSAGE(WM_NAVIGATE,OnNavigate) ON_MESSAGE(WM_OPENURL, Open) ON_MESSAGE(WM_NEWINSTANCE, NewInstanceOpened) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONDBLCLK() ON_WM_LBUTTONUP() ON_WM_CHAR() ON_WM_SYSKEYDOWN() ON_WM_SYSKEYUP() ON_WM_KEYDOWN() ON_WM_KEYUP() ON_WM_DROPFILES() ON_MESSAGE(WM_CONSOLEMSG, OnConsoleMessage) ON_COMMAND(ID_VIEW_ORIGINAL, OnViewOriginal) ON_COMMAND(ID_VIEW_FULLSCREEN, OnViewFullscreen) ON_COMMAND(ID_AR_KEEP, OnArKeep) ON_COMMAND(ID_AR_FILL, OnArFill) ON_COMMAND(ID_AR_43, OnAr43) ON_COMMAND(ID_AR_169, OnAr169) ON_UPDATE_COMMAND_UI(ID_AR_169, OnUpdateAr169) ON_UPDATE_COMMAND_UI(ID_AR_43, OnUpdateAr43) ON_UPDATE_COMMAND_UI(ID_AR_FILL, OnUpdateArFill) ON_UPDATE_COMMAND_UI(ID_AR_KEEP, OnUpdateArKeep) ON_COMMAND(ID_NAVIGATE_NONE, OnNavigateNone) ON_COMMAND(ID_NAVIGATE_WALK, OnNavigateWalk) ON_COMMAND(ID_NAVIGATE_FLY, OnNavigateFly) ON_COMMAND(ID_NAVIGATE_EXAM, OnNavigateExam) ON_COMMAND(ID_NAVIGATE_SLIDE, OnNavigateSlide) ON_COMMAND(ID_NAVIGATE_PAN, OnNavigatePan) ON_COMMAND(ID_NAVIGATE_ORBIT, OnNavigateOrbit) ON_COMMAND(ID_NAVIGATE_GAME, OnNavigateGame) ON_COMMAND(ID_NAVIGATE_VR, OnNavigateVR) ON_COMMAND(ID_NAV_RESET, OnNavigateReset) ON_COMMAND(ID_SHORTCUTS, OnShortcuts) ON_COMMAND(IDD_CONFIGURE, OnConfigure) ON_COMMAND(ID_FILE_PROP, OnFileProp) ON_COMMAND(ID_VIEW_PL, OnViewPlaylist) ON_UPDATE_COMMAND_UI(ID_FILE_PROP, OnUpdateFileProp) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_NONE, OnUpdateNavigate) ON_COMMAND(ID_REC_ENABLE, OnCacheEnable) ON_UPDATE_COMMAND_UI(ID_REC_ENABLE, OnUpdateCacheEnable) ON_COMMAND(ID_REC_STOP, OnCacheStop) ON_COMMAND(ID_REC_ABORT, OnCacheAbort) ON_UPDATE_COMMAND_UI(ID_REC_STOP, OnUpdateCacheStop) ON_COMMAND(ID_COLLIDE_DISP, OnCollideDisp) ON_UPDATE_COMMAND_UI(ID_COLLIDE_DISP, OnUpdateCollideDisp) ON_COMMAND(ID_COLLIDE_NONE, OnCollideNone) ON_UPDATE_COMMAND_UI(ID_COLLIDE_NONE, OnUpdateCollideNone) ON_COMMAND(ID_COLLIDE_REG, OnCollideReg) ON_UPDATE_COMMAND_UI(ID_COLLIDE_REG, OnUpdateCollideReg) ON_COMMAND(ID_HEADLIGHT, OnHeadlight) ON_UPDATE_COMMAND_UI(ID_HEADLIGHT, OnUpdateHeadlight) ON_COMMAND(ID_GRAVITY, OnGravity) ON_UPDATE_COMMAND_UI(ID_GRAVITY, OnUpdateGravity) ON_COMMAND(ID_NAV_INFO, OnNavInfo) ON_COMMAND(ID_NAV_NEXT, OnNavNext) ON_COMMAND(ID_NAV_PREV, OnNavPrev) ON_UPDATE_COMMAND_UI(ID_NAV_NEXT, OnUpdateNavNext) ON_UPDATE_COMMAND_UI(ID_NAV_PREV, OnUpdateNavPrev) ON_COMMAND(ID_CLEAR_NAV, OnClearNav) ON_UPDATE_COMMAND_UI(ID_VIEW_PL, OnUpdateViewPlaylist) ON_COMMAND(ID_PLAYLIST_LOOP, OnPlaylistLoop) ON_UPDATE_COMMAND_UI(ID_PLAYLIST_LOOP, OnUpdatePlaylistLoop) ON_COMMAND(ID_ADD_SUBTITLE, OnAddSubtitle) ON_UPDATE_COMMAND_UI(ID_REC_ABORT, OnUpdateCacheStop) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_WALK, OnUpdateNavigate) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_FLY, OnUpdateNavigate) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_EXAM, OnUpdateNavigate) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_PAN, OnUpdateNavigate) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_SLIDE, OnUpdateNavigate) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_ORBIT, OnUpdateNavigate) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_VR, OnUpdateNavigate) ON_UPDATE_COMMAND_UI(ID_NAVIGATE_GAME, OnUpdateNavigate) ON_COMMAND(ID_FILE_EXIT, OnFileExit) ON_COMMAND(ID_VIEW_CPU, OnViewCPU) ON_UPDATE_COMMAND_UI(ID_VIEW_CPU, OnUpdateViewCPU) //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMainFrame construction/destructionCMainFrame::CMainFrame(){ m_icoerror = AfxGetApp()->LoadIcon(IDI_ERR); m_icomessage = AfxGetApp()->LoadIcon(IDI_MESSAGE); m_bFullScreen = m_bRestoreFS = 0; m_aspect_ratio = GF_ASPECT_RATIO_KEEP; m_pProps = NULL; m_pOpt = NULL; m_pPlayList = NULL; m_pWndView = new CChildView(); m_bInitShow = TRUE; m_bStartupFile = TRUE; m_num_chapters = 0; m_chapters_start = NULL; m_last_prog = -1; m_timer_on = 0; m_show_rti = 0; nb_viewpoints = 0;}CMainFrame::~CMainFrame(){ if (m_chapters_start) free(m_chapters_start); if (m_pProps != NULL) m_pProps->DestroyWindow(); if (m_pOpt != NULL) m_pOpt->DestroyWindow(); if (m_pPlayList != NULL) delete m_pPlayList; delete m_pWndView;}#define RTI_TIMER 22#define RTI_REFRESH_MS 500void CALLBACK EXPORT RTInfoTimer(HWND , UINT , UINT nID , DWORD ){ char szMsg[100]; GF_SystemRTInfo rti; if (nID != RTI_TIMER) return; WinGPAC *app = GetApp(); CMainFrame *pFrame = (CMainFrame *) app->m_pMainWnd; /*shutdown*/ if (!pFrame) return; if (pFrame->m_show_rti && !pFrame->m_timer_on) { if (!gf_sys_get_rti(RTI_REFRESH_MS, &rti, 0)) return; if (!rti.gpac_memory) rti.gpac_memory = rti.process_memory ? rti.process_memory : rti.physical_memory; if (pFrame->m_show_rti && !pFrame->m_timer_on) { sprintf(szMsg, "FPS %02.2f - CPU %02d (%02d) - Mem %d kB", gf_term_get_framerate(app->m_term, 0), rti.total_cpu_usage, rti.process_cpu_usage, rti.gpac_memory/1024); pFrame->m_wndStatusBar.SetPaneText(1, szMsg); } } u32 ms = gf_term_get_time_in_ms(app->m_term); u32 h = ms / 1000 / 3600; u32 m = ms / 1000 / 60 - h*60; u32 s = ms / 1000 - h*3600 - m*60; sprintf(szMsg, "%02d:%02d.%02d", h, m, s); pFrame->m_wndStatusBar.SetPaneText(0, szMsg);}static UINT status_indics[] ={ ID_TIMER, ID_SEPARATOR, // status line indicator};int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){ UINT buttonArray[50]; TBBUTTONINFO bi; u32 *ba; if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // create a view to occupy the client area of the frame if (!m_pWndView->CreateEx(0, NULL, NULL, WS_CHILD, 0, 0, 300, 200, m_hWnd, NULL, NULL)) { TRACE0("Failed to create view window\n"); return -1; } m_pPlayList = new Playlist(); m_pPlayList->Create(); m_pPlayList->ShowWindow(SW_HIDE); if (!m_wndToolBar.CreateEx(this, WS_CHILD | CBRS_TOP | CBRS_FLYBY) || !m_wndToolBar.LoadBitmap(IDR_MAINTOOLS)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } ba = &buttonArray[0]; *ba = ID_FILEOPEN; ba++; *ba = ID_SEPARATOR; ba++; *ba = ID_NAV_PREV; ba++; *ba = ID_NAV_NEXT; ba++; *ba = ID_SEPARATOR; ba++; *ba = ID_FILE_PLAY; ba++; *ba = ID_FILE_STEP; ba++; *ba = ID_FILE_STOP; ba++; *ba = ID_SEPARATOR; ba++; *ba = ID_FILE_PROP; ba++; *ba = ID_SEPARATOR; ba++; *ba = ID_FILE_PROP; ba++; *ba = ID_SWITCH_RENDER; m_wndToolBar.SetButtons(buttonArray, 13); m_wndToolBar.SetButtonInfo(0, ID_FILEOPEN, TBBS_BUTTON, 0); m_wndToolBar.SetButtonInfo(1, ID_SEPARATOR, TBBS_SEPARATOR, 0); m_wndToolBar.SetButtonInfo(2, ID_NAV_PREV, TBBS_DROPDOWN, 1); m_wndToolBar.SetButtonInfo(3, ID_NAV_NEXT, TBBS_DROPDOWN, 2); m_wndToolBar.SetButtonInfo(4, ID_SEPARATOR, TBBS_SEPARATOR, 0); m_wndToolBar.SetButtonInfo(5, ID_FILE_PLAY, TBBS_BUTTON, 3); m_wndToolBar.SetButtonInfo(6, ID_FILE_STEP, TBBS_BUTTON, 5); m_wndToolBar.SetButtonInfo(7, ID_FILE_STOP, TBBS_BUTTON, 6); m_wndToolBar.SetButtonInfo(8, ID_SEPARATOR, TBBS_SEPARATOR, 0); m_wndToolBar.SetButtonInfo(9, ID_FILE_PROP, TBBS_BUTTON, 7); m_wndToolBar.SetButtonInfo(10, ID_SEPARATOR, TBBS_SEPARATOR, 0); m_wndToolBar.SetButtonInfo(11, IDD_CONFIGURE, TBBS_BUTTON, 8); m_wndToolBar.SetButtonInfo(12, ID_SWITCH_RENDER, TBBS_BUTTON, 9); CToolBarCtrl &ctrl = m_wndToolBar.GetToolBarCtrl(); ctrl.SetStyle(TBSTYLE_FLAT | TBSTYLE_DROPDOWN); ctrl.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS); memset(&bi, 0, sizeof(bi)); bi.cbSize = sizeof(bi); ctrl.GetButtonInfo(2, &bi); bi.fsStyle |= TBSTYLE_DROPDOWN; ctrl.SetButtonInfo(ID_NAV_PREV, &bi); memset(&bi, 0, sizeof(bi)); bi.cbSize = sizeof(bi); ctrl.GetButtonInfo(3, &bi); bi.fsStyle |= TBSTYLE_DROPDOWN; ctrl.SetButtonInfo(ID_NAV_NEXT, &bi); if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(status_indics, sizeof(status_indics)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } if (!m_Address.Create(this, IDD_NAVBAR, WS_CHILD | CBRS_TOP | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, IDD_NAVBAR) ) { return -1; // fail to create } if (!m_Sliders.Create(IDD_SLIDERS, this) ) { return -1; // fail to create } m_wndStatusBar.SetPaneInfo(0, ID_TIMER, SBPS_NORMAL, 60); m_wndStatusBar.SetPaneInfo(1, ID_SEPARATOR, SBPS_STRETCH, 0); SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE); SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), FALSE); SetTimer(RTI_TIMER, RTI_REFRESH_MS, RTInfoTimer); return 0;}BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){ if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.dwExStyle &= ~WS_EX_CLIENTEDGE; cs.lpszClass = AfxRegisterWndClass(0); return TRUE;}/////////////////////////////////////////////////////////////////////////////// CMainFrame diagnostics#ifdef _DEBUGvoid CMainFrame::AssertValid() const{ CFrameWnd::AssertValid();}void CMainFrame::Dump(CDumpContext& dc) const{ CFrameWnd::Dump(dc);}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CMainFrame message handlersvoid CMainFrame::OnSetFocus(CWnd* pOldWnd){ m_pWndView->SetFocus(); if (m_bRestoreFS==1) { m_bRestoreFS=2; } else if (m_bRestoreFS==2) { m_bRestoreFS = 0; SetFullscreen(); }}BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo){ // let the view have first crack at the command if (m_pWndView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; // otherwise, do default handling return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);}void CMainFrame::OnSize(UINT nType, int cx, int cy) { RECT rc2; u32 tool_h, slide_h, add_h, stat_h; if (m_bInitShow) { CFrameWnd::OnSize(nType, cx, cy); return; } m_wndToolBar.GetClientRect(&rc2); tool_h = rc2.bottom - rc2.top; m_Address.GetClientRect(&rc2); add_h = rc2.bottom - rc2.top; m_Sliders.GetClientRect(&rc2); slide_h = rc2.bottom - rc2.top; m_wndStatusBar.GetClientRect(&rc2); stat_h = rc2.bottom - rc2.top; if ((u32) cy <= tool_h+add_h+slide_h+stat_h) { OnSetSize(cx, 1); return; } CFrameWnd::OnSize(nType, cx, cy); cy -= tool_h + add_h + slide_h + stat_h; m_Address.SetWindowPos(this, 0, 0, cx, add_h, SWP_SHOWWINDOW | SWP_NOMOVE); m_pWndView->ShowWindow(SW_SHOW); m_pWndView->SetWindowPos(this, 0, add_h + tool_h, cx, cy, SWP_NOZORDER); m_Sliders.SetWindowPos(this, 0, add_h + tool_h + cy, cx, slide_h, SWP_NOZORDER|SWP_SHOWWINDOW); /*and resize term*/ gf_term_set_size(GetApp()->m_term, cx, cy);}LONG CMainFrame::OnSetSize(WPARAM wParam, LPARAM lParam){ UINT width, height; width = wParam; height = lParam; if (m_bInitShow) { m_wndToolBar.UpdateWindow(); m_wndToolBar.ShowWindow(SW_SHOW); m_Address.UpdateWindow(); m_Address.ShowWindow(SW_SHOW); m_Sliders.UpdateWindow(); m_Sliders.ShowWindow(SW_SHOW); m_Sliders.m_PosSlider.EnableWindow(FALSE); m_pWndView->ShowWindow(SW_SHOW); ShowWindow(SW_SHOW); m_bInitShow = FALSE; } RECT winRect; winRect.left = 0; winRect.right = width; winRect.top = 0; winRect.bottom = height; AdjustWindowRectEx(&winRect, GetStyle(), TRUE, GetExStyle()); winRect.bottom -= winRect.top; winRect.right -= winRect.left; winRect.left = winRect.top = 0; RECT rc2; m_Address.GetClientRect(&rc2); winRect.bottom += rc2.bottom; m_wndToolBar.GetClientRect(&rc2); winRect.bottom += rc2.bottom; m_Sliders.GetClientRect(&rc2); winRect.bottom += rc2.bottom; m_wndStatusBar.GetClientRect(&rc2); winRect.bottom += rc2.bottom; GetWindowRect(&rc2); rc2.bottom -= rc2.top; rc2.right -= rc2.left; if ((rc2.right != winRect.right) || (rc2.bottom != winRect.bottom)) { SetWindowPos(NULL, 0, 0, winRect.right, winRect.bottom, SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW); } else { /*just resize term*/ gf_term_set_size(GetApp()->m_term, width, height); } return 0;}void CMainFrame::OnMove(int x, int y) { CFrameWnd::OnMove(x, y); RECT rc; m_wndToolBar.GetClientRect(&rc); m_wndToolBar.SetWindowPos(this, x, y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); y += rc.bottom - rc.top; m_Address.SetWindowPos(this, x, y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); m_Address.GetClientRect(&rc); y += rc.bottom - rc.top; m_pWndView->SetWindowPos(this, x, y, 0, 0, SWP_NOSIZE); m_pWndView->GetClientRect(&rc); y += rc.bottom; m_Sliders.SetWindowPos(this, x, y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -