#include "CCApplication.h" #include "CCEGLView.h" #include "CCDirector.h" #include #include "platform/CCFileUtils.h" /** @brief This function change the PVRFrame show/hide setting in register. @param bEnable If true show the PVRFrame window, otherwise hide. */ static void PVRFrameEnableControlWindow(bool bEnable); NS_CC_BEGIN // sharedApplication pointer Application * Application::sm_pSharedApplication = 0; Application::Application() : _instance(NULL) , _accelTable(NULL) { _instance = GetModuleHandle(NULL); _animationInterval.QuadPart = 0; CC_ASSERT(! sm_pSharedApplication); sm_pSharedApplication = this; } Application::~Application() { CC_ASSERT(this == sm_pSharedApplication); sm_pSharedApplication = NULL; } int Application::run() { PVRFrameEnableControlWindow(false); // Main message loop: MSG msg; LARGE_INTEGER nFreq; LARGE_INTEGER nLast; LARGE_INTEGER nNow; QueryPerformanceFrequency(&nFreq); QueryPerformanceCounter(&nLast); // Initialize instance and cocos2d. if (!applicationDidFinishLaunching()) { return 0; } EGLView* pMainWnd = EGLView::getInstance(); pMainWnd->centerWindow(); ShowWindow(pMainWnd->getHWnd(), SW_SHOW); while (1) { if (! PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { // Get current time tick. QueryPerformanceCounter(&nNow); // If it's the time to draw next frame, draw it, else sleep a while. if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart) { nLast.QuadPart = nNow.QuadPart; Director::getInstance()->mainLoop(); } else { Sleep(0); } continue; } if (WM_QUIT == msg.message) { // Quit message loop. break; } // Deal with windows message. if (! _accelTable || ! TranslateAccelerator(msg.hwnd, _accelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } void Application::setAnimationInterval(double interval) { LARGE_INTEGER nFreq; QueryPerformanceFrequency(&nFreq); _animationInterval.QuadPart = (LONGLONG)(interval * nFreq.QuadPart); } ////////////////////////////////////////////////////////////////////////// // static member function ////////////////////////////////////////////////////////////////////////// Application* Application::getInstance() { CC_ASSERT(sm_pSharedApplication); return sm_pSharedApplication; } // @deprecated Use getInstance() instead Application* Application::sharedApplication() { return Application::getInstance(); } LanguageType Application::getCurrentLanguage() { LanguageType ret = LanguageType::ENGLISH; LCID localeID = GetUserDefaultLCID(); unsigned short primaryLanguageID = localeID & 0xFF; switch (primaryLanguageID) { case LANG_CHINESE: ret = LanguageType::CHINESE; break; case LANG_ENGLISH: ret = LanguageType::ENGLISH; break; case LANG_FRENCH: ret = LanguageType::FRENCH; break; case LANG_ITALIAN: ret = LanguageType::ITALIAN; break; case LANG_GERMAN: ret = LanguageType::GERMAN; break; case LANG_SPANISH: ret = LanguageType::SPANISH; break; case LANG_RUSSIAN: ret = LanguageType::RUSSIAN; break; case LANG_KOREAN: ret = LanguageType::KOREAN; break; case LANG_JAPANESE: ret = LanguageType::JAPANESE; break; case LANG_HUNGARIAN: ret = LanguageType::HUNGARIAN; break; case LANG_PORTUGUESE: ret = LanguageType::PORTUGUESE; break; case LANG_ARABIC: ret = LanguageType::ARABIC; break; case LANG_NORWEGIAN: ret = LanguageType::NORWEGIAN; break; case LANG_POLISH: ret = LanguageType::POLISH; break; } return ret; } Application::Platform Application::getTargetPlatform() { return Platform::OS_WINDOWS; } void Application::setResourceRootPath(const std::string& rootResDir) { _resourceRootPath = rootResDir; std::replace(_resourceRootPath.begin(), _resourceRootPath.end(), '\\', '/'); if (_resourceRootPath[_resourceRootPath.length() - 1] != '/') { _resourceRootPath += '/'; } FileUtils* pFileUtils = FileUtils::getInstance(); std::vector searchPaths = pFileUtils->getSearchPaths(); searchPaths.insert(searchPaths.begin(), _resourceRootPath); pFileUtils->setSearchPaths(searchPaths); } const std::string& Application::getResourceRootPath(void) { return _resourceRootPath; } void Application::setStartupScriptFilename(const std::string& startupScriptFile) { _startupScriptFilename = startupScriptFile; std::replace(_startupScriptFilename.begin(), _startupScriptFilename.end(), '\\', '/'); } NS_CC_END ////////////////////////////////////////////////////////////////////////// // Local function ////////////////////////////////////////////////////////////////////////// static void PVRFrameEnableControlWindow(bool bEnable) { HKEY hKey = 0; // Open PVRFrame control key, if not exist create it. if(ERROR_SUCCESS != RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\Imagination Technologies\\PVRVFRame\\STARTUP\\", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, NULL)) { return; } const WCHAR* wszValue = L"hide_gui"; const WCHAR* wszNewData = (bEnable) ? L"NO" : L"YES"; WCHAR wszOldData[256] = {0}; DWORD dwSize = sizeof(wszOldData); LSTATUS status = RegQueryValueExW(hKey, wszValue, 0, NULL, (LPBYTE)wszOldData, &dwSize); if (ERROR_FILE_NOT_FOUND == status // the key not exist || (ERROR_SUCCESS == status // or the hide_gui value is exist && 0 != wcscmp(wszNewData, wszOldData))) // but new data and old data not equal { dwSize = sizeof(WCHAR) * (wcslen(wszNewData) + 1); RegSetValueEx(hKey, wszValue, 0, REG_SZ, (const BYTE *)wszNewData, dwSize); } RegCloseKey(hKey); }