PLAYER_NS_BEGIN PlayerMenuItemWin *PlayerMenuItemWin::create(const std::string &menuId, const std::string &title) { PlayerMenuItemWin *item = new PlayerMenuItemWin(); item->_menuId = menuId; item->_title = title; item->autorelease(); return item; }
LRESULT CALLBACK PlayerWin::windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (!_instance) return 0; switch (uMsg) { case WM_COMMAND: { if (HIWORD(wParam) == 0) { // menu WORD menuId = LOWORD(wParam); PlayerMenuItemWin *menuItem = _instance->_menuService->getItemByCommandId(menuId); if (menuItem) { cocos2d::EventCustom event("APP.EVENT"); std::stringstream buf; buf << "{\"data\":\"" << menuItem->getMenuId().c_str() << "\""; buf << ",\"name\":" << "\"menuClicked\"" << "}"; event.setDataString(buf.str()); Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); } } break; } case WM_KEYDOWN: { if (wParam == VK_F5) { PlayerProtocol::getInstance()->relaunch(); } break; } case WM_COPYDATA: { PCOPYDATASTRUCT pMyCDS = (PCOPYDATASTRUCT) lParam; if (pMyCDS->dwData == 1) { const char *szBuf = (const char*)(pMyCDS->lpData); PlayerWin::getInstance()->writeDebugLog(szBuf); break; } } } return g_oldWindowProc(hWnd, uMsg, wParam, lParam); }
LRESULT CALLBACK SimulatorWin::windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (!_instance) return 0; switch (uMsg) { case WM_COMMAND: { if (HIWORD(wParam) == 0) { // menu WORD menuId = LOWORD(wParam); PlayerMenuItemWin *menuItem = _instance->_menuService->getItemByCommandId(menuId); if (menuItem) { AppEvent event("APP.EVENT", APP_EVENT_MENU); std::stringstream buf; buf << "{\"data\":\"" << menuItem->getMenuId().c_str() << "\""; buf << ",\"name\":" << "\"menuClicked\"" << "}"; event.setDataString(buf.str()); event.setUserData(menuItem); Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); } if (menuId == ID_HELP_ABOUT) { onHelpAbout(); } } break; } case WM_KEYDOWN: { if (wParam == VK_F5) { PlayerProtocol::getInstance()->relaunch(); } break; } case WM_COPYDATA: { PCOPYDATASTRUCT pMyCDS = (PCOPYDATASTRUCT) lParam; if (pMyCDS->dwData == 1) { const char *szBuf = (const char*)(pMyCDS->lpData); SimulatorWin::getInstance()->writeDebugLog(szBuf); break; } } case WM_DESTROY: { DragAcceptFiles(hWnd, FALSE); break; } case WM_DROPFILES: { HDROP hDrop = (HDROP)wParam; const int count = DragQueryFileW(hDrop, 0xffffffff, NULL, 0); if (count > 0) { int fileIndex = 0; const UINT length = DragQueryFileW(hDrop, fileIndex, NULL, 0); WCHAR* buffer = (WCHAR*)calloc(length + 1, sizeof(WCHAR)); DragQueryFileW(hDrop, fileIndex, buffer, length + 1); char *utf8 = SimulatorWin::convertTCharToUtf8(buffer); std::string firstFile(utf8); CC_SAFE_FREE(utf8); DragFinish(hDrop); // broadcast drop event AppEvent forwardEvent("APP.EVENT.DROP", APP_EVENT_DROP); forwardEvent.setDataString(firstFile); Director::getInstance()->getEventDispatcher()->dispatchEvent(&forwardEvent); } } // WM_DROPFILES } return g_oldWindowProc(hWnd, uMsg, wParam, lParam); }
PlayerMenuItem *PlayerMenuServiceWin::addItem(const std::string &menuId, const std::string &title, const std::string &parentId, int order /* = MAX_ORDER */) { if (menuId.length() == 0 || title.length() == 0) { CCLOG("MenuServiceWin::addItem() - menuId and title must is non-empty"); return nullptr; } // check menu id is exists if (_items.find(menuId) != _items.end()) { CCLOG("MenuServiceWin::addItem() - menu id (%s) is exists", menuId.c_str()); return false; } // set parent PlayerMenuItemWin *parent = &_root; if (parentId.length()) { // query parent menu auto it = _items.find(parentId); if (it != _items.end()) { parent = it->second; } } if (!parent->_hmenu) { // create menu handle for parent (convert parent to submenu) parent->_hmenu = CreateMenu(); parent->_isGroup = true; MENUITEMINFO menuitem; menuitem.cbSize = sizeof(menuitem); menuitem.fMask = MIIM_SUBMENU; menuitem.hSubMenu = parent->_hmenu; if (!SetMenuItemInfo(parent->_parent->_hmenu, parent->_commandId, MF_BYCOMMAND, &menuitem)) { DWORD err = GetLastError(); CCLOG("MenuServiceWin::addItem() - set menu handle failed, menu id (%s). error code = %u", parent->_menuId.c_str(), err); return nullptr; } } // create new menu item _newCommandId++; PlayerMenuItemWin *item = PlayerMenuItemWin::create(menuId, title); item->_commandId = _newCommandId; item->_parent = parent; item->_parent->retain(); // add menu item to menu bar MENUITEMINFO menuitem; menuitem.cbSize = sizeof(menuitem); menuitem.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STATE | MIIM_STRING; menuitem.fType = (item->_title.compare("-") == 0) ? MFT_SEPARATOR : MFT_STRING; menuitem.fState = (item->_isEnabled) ? MFS_ENABLED : MFS_DISABLED; menuitem.fState |= (item->_isChecked) ? MFS_CHECKED : MFS_UNCHECKED; std::u16string u16title; cocos2d::StringUtils::UTF8ToUTF16(item->_title, u16title); menuitem.dwTypeData = (LPTSTR)u16title.c_str(); menuitem.wID = _newCommandId; // check new menu item position if (order > parent->_children.size()) { order = parent->_children.size(); } else if (order < 0) { order = 0; } // create new menu item if (!InsertMenuItem(parent->_hmenu, order, TRUE, &menuitem)) { DWORD err = GetLastError(); CCLOG("MenuServiceWin::addItem() - insert new menu item failed, menu id (%s). error code = %u", item->_menuId.c_str(), err); item->release(); return nullptr; } // update menu state parent->_children.insert(order, item); _items[item->_menuId] = item; _commandId2menuId[item->_commandId] = item->_menuId; updateChildrenOrder(parent); return item; }