void GuiManager::HandleEvent(std::shared_ptr<Event> e) { if(mGuiSystem == nullptr) return; // inject the events into the gui system auto mygui_inputmgr = MyGUI::InputManager::getInstancePtr(); if(mygui_inputmgr == nullptr) { return; } if(e->GetType() == "DT_MOUSEEVENT") { std::shared_ptr<MouseEvent> m = std::dynamic_pointer_cast<MouseEvent>(e); if(m->GetAction() == MouseEvent::MOVED) { mygui_inputmgr->injectMouseMove(m->GetMouseState().X.abs, m->GetMouseState().Y.abs, m->GetMouseState().Z.abs); } else if(m->GetAction() == MouseEvent::PRESSED) { mygui_inputmgr->injectMousePress(m->GetMouseState().X.abs, m->GetMouseState().Y.abs, MyGUI::MouseButton::Enum(m->GetButton())); } else if(m->GetAction() == MouseEvent::RELEASED) { mygui_inputmgr->injectMouseRelease(m->GetMouseState().X.abs, m->GetMouseState().Y.abs, MyGUI::MouseButton::Enum(m->GetButton())); } } else if(e->GetType() == "DT_KEYBOARDEVENT") { std::shared_ptr<KeyboardEvent> k = std::dynamic_pointer_cast<KeyboardEvent>(e); if(k->GetAction() == KeyboardEvent::PRESSED) { mygui_inputmgr->injectKeyPress(MyGUI::KeyCode::Enum(k->GetCode()), k->GetText()); } else if(k->GetAction() == KeyboardEvent::RELEASED) { mygui_inputmgr->injectKeyRelease(MyGUI::KeyCode::Enum(k->GetCode())); } } }
/************************************************************************* Method that injects a new position for the mouse cursor. *************************************************************************/ bool System::injectMousePosition(float x_pos, float y_pos) { // set new mouse position MouseCursor::getSingleton().setPosition(Point(x_pos, y_pos)); // do the real work return injectMouseMove(0, 0); }
bool InputManager::mouseMoved(const OIS::MouseEvent& _arg) { mCursorX += _arg.state.X.rel; mCursorY += _arg.state.Y.rel; checkPosition(); injectMouseMove(mCursorX, mCursorY, _arg.state.Z.abs); return true; }
bool InputManager::injectMouseRelease(int _absx, int _absy, MouseButton _id) { if (isFocusMouse()) { // если активный элемент заблокирован if (!mWidgetMouseFocus->getInheritedEnabled()) return true; if (_id != MouseButton::None && _id != MouseButton::MAX) { if (mMouseCapture[_id.getValue()]) { // drop capture mMouseCapture[_id.getValue()] = false; } } IntPoint point (_absx, _absy); if (mLayerMouseFocus != nullptr) point = mLayerMouseFocus->getPosition(_absx, _absy); mWidgetMouseFocus->_riseMouseButtonReleased(point.left, point.top, _id); // после вызова, виджет может быть сброшен if (nullptr != mWidgetMouseFocus) { if (MouseButton::Left == _id) { if (mTimerDoubleClick < INPUT_TIME_DOUBLE_CLICK) { mWidgetMouseFocus->_riseMouseButtonClick(); // после вызова, виджет может быть сброшен if (nullptr != mWidgetMouseFocus) mWidgetMouseFocus->_riseMouseButtonDoubleClick(); } else { // проверяем над тем ли мы окном сейчас что и были при нажатии Widget* item = LayerManager::getInstance().getWidgetFromPoint(_absx, _absy); if ( item == mWidgetMouseFocus) { mWidgetMouseFocus->_riseMouseButtonClick(); } mTimerDoubleClick = 0; } } } // для корректного отображения injectMouseMove(_absx, _absy, mOldAbsZ); return true; } return false; }
bool InputManager::injectMouseRelease(int _absx, int _absy, MouseButton _id) { if (isFocusMouse()) { // если активный элемент заблокирован if (!mWidgetMouseFocus->getEnabled()) return true; if (_id == MouseButton::Left && mLeftMouseCapture) { // сбрасываем захват mLeftMouseCapture = false; } if (_id == MouseButton::Right && mRightMouseCapture) { // сбрасываем захват mRightMouseCapture = false; } mWidgetMouseFocus->_riseMouseButtonReleased(_absx, _absy, _id); // после вызова, виджет может быть сброшен if (nullptr != mWidgetMouseFocus) { if (MouseButton::Left == _id) { if (mTimer.getMilliseconds() < INPUT_TIME_DOUBLE_CLICK) { mWidgetMouseFocus->_riseMouseButtonClick(); // после вызова, виджет может быть сброшен if (nullptr != mWidgetMouseFocus) mWidgetMouseFocus->_riseMouseButtonDoubleClick(); } else { // проверяем над тем ли мы окном сейчас что и были при нажатии Widget* item = LayerManager::getInstance().getWidgetFromPoint(_absx, _absy); if ( item == mWidgetMouseFocus) { mWidgetMouseFocus->_riseMouseButtonClick(); } mTimer.reset(); } } } // для корректного отображения injectMouseMove(_absx, _absy, mOldAbsZ); return true; } return false; }
bool DiInputManager::mouseMoved(const OIS::MouseEvent& _arg) { mCursorX += _arg.state.X.rel; mCursorY += _arg.state.Y.rel; checkPosition(); injectMouseMove(_arg.state.X.abs, _arg.state.Y.abs, _arg.state.Z.abs); for (auto it = mMouseMoves.begin(); it != mMouseMoves.end(); ++it) if (it->second) it->second(_arg); return true; }
bool InputManager::injectMouseRelease(int _absx, int _absy, MouseButton _id) { if (isFocusMouse() && mIsWidgetMouseCapture) { // если активный элемент заблокирован if (false == mWidgetMouseFocus->isEnabled()) return true; // сбрасываем захват mIsWidgetMouseCapture = false; mWidgetMouseFocus->_onMouseButtonReleased(_absx, _absy, _id); //mWidgetMouseFocus->_onMouseButtonReleased(_id); // после вызова, виджет может быть удален if (null != mWidgetMouseFocus) { if ((MB_Left == _id) && mTime.getMilliseconds() < INPUT_TIME_DOUBLE_CLICK) { mWidgetMouseFocus->_onMouseButtonDoubleClick(); } else { mTime.reset(); // проверяем над тем ли мы окном сейчас что и были при нажатии LayerItem * rootItem = null; WidgetPtr item = static_cast<WidgetPtr>(LayerManager::getInstance()._findLayerItem(_absx, _absy, rootItem)); if ( item == mWidgetMouseFocus) { mWidgetMouseFocus->_onMouseButtonClick(); } } } // для корректного отображения injectMouseMove(_absx, _absy, mOldAbsZ); return true; } return false; }
bool InputManager::injectMousePress(int _absx, int _absy, MouseButton _id) { injectMouseMove(_absx, _absy, mOldAbsZ); // если мы щелкнули не на гуй if (!isFocusMouse()) { resetKeyFocusWidget(); return false; } // если активный элемент заблокирован //FIXME if (!mWidgetMouseFocus->getInheritedEnabled()) return true; if (MouseButton::None != _id && MouseButton::MAX != _id) { // start capture mMouseCapture[_id.getValue()] = true; // remember last pressed position if (mLayerMouseFocus != nullptr) { IntPoint point = mLayerMouseFocus->getPosition(_absx, _absy); mLastPressed[_id.getValue()] = point; } } // ищем вверх тот виджет который может принимать фокус Widget* item = mWidgetMouseFocus; while ((item != nullptr) && (!item->getNeedKeyFocus())) item = item->getParent(); // устанавливаем перед вызовом т.к. возможно внутри ктонить поменяет фокус под себя setKeyFocusWidget(item); if (isFocusMouse()) { IntPoint point (_absx, _absy); if (mLayerMouseFocus != nullptr) point = mLayerMouseFocus->getPosition(_absx, _absy); mWidgetMouseFocus->_riseMouseButtonPressed(point.left, point.top, _id); // после пресса может сброситься if (mWidgetMouseFocus) { // поднимаем виджет, надо подумать что делать если поменялся фокус клавы LayerManager::getInstance().upLayerItem(mWidgetMouseFocus); // поднимаем пикинг Overlapped окон Widget* pick = mWidgetMouseFocus; do { // если оверлаппед, то поднимаем пикинг if (pick->getWidgetStyle() == WidgetStyle::Overlapped) { if (pick->getParent()) pick->getParent()->_forcePick(pick); } pick = pick->getParent(); } while (pick); } } return true; }
void InputManager::updateCursorPosition() { const OIS::MouseState& ms = mMouse->getMouseState(); injectMouseMove(mCursorX, mCursorY, ms.Z.abs); }
void MyGUIRenderClick::PerformRendering(unsigned int uiFrameID) { NiRenderer* pkRenderer = NiRenderer::GetRenderer(); NIASSERT(pkRenderer); if(!pkRenderer) return; // pkRenderer->SetScreenSpaceCameraData(); // pkRenderer->BeginUsingRenderTargetGroup(m_spRenderTargetGroup, // NiRenderer::CLEAR_ALL); // 处理输入 NiInputMousePtr pMouse; NiInputKeyboardPtr pKeyboard; if(m_pInputService->GetInputSystem()) { pMouse = m_pInputService->GetInputSystem()->GetMouse(); pKeyboard = m_pInputService->GetInputSystem()->GetKeyboard(); if (pMouse) { POINT point; GetCursorPos(&point); ScreenToClient(hWnd, &point); m_nCursorX = point.x; m_nCursorY = point.y; if (m_nCursorX < 0) m_nCursorX = 0; else if (m_nCursorX >= 1280) m_nCursorX = 1280 - 1; if (m_nCursorY < 0) m_nCursorY = 0; else if (m_nCursorY >= 720) m_nCursorY = 720 - 1; injectMouseMove(m_nCursorX, m_nCursorY, 0); unsigned int ui; for (ui = NiInputMouse::NIM_LEFT; ui < NiInputMouse::NIM_NUM_BUTTONS; ui++) { if (pMouse->ButtonWasPressed((NiInputMouse::Button)ui)) { injectMousePress(m_nCursorX, m_nCursorY, MyGUI::MouseButton(MyGUI::MouseButton::Enum(ui))); } else if (pMouse->ButtonWasReleased((NiInputMouse::Button)ui)) { injectMouseRelease(m_nCursorX, m_nCursorY, MyGUI::MouseButton(MyGUI::MouseButton::Enum(ui))); } } } if (pKeyboard) { unsigned int ui; for (ui = NiInputKeyboard::KEY_ESCAPE; ui < NiInputKeyboard::KEY_TOTAL_COUNT; ui++) { if (pKeyboard->KeyWasPressed((NiInputKeyboard::KeyCode)ui)) { MyGUI::KeyCode key = MyGUI::KeyCode(MyGUI::KeyCode::Enum(ui)); MyGUI::Char text; int scan_code = ui; if (scan_code > 70 && scan_code < 84) { static MyGUI::Char nums[13] = { 55, 56, 57, 45, 52, 53, 54, 43, 49, 50, 51, 48, 46 }; text = nums[scan_code-71]; } else if (key == MyGUI::KeyCode::Divide) { text = '/'; } else { text = translateWin32Text(key); } injectKeyPress(key, text); } else if (pKeyboard->KeyWasReleased((NiInputKeyboard::KeyCode)ui)) { injectKeyRelease(MyGUI::KeyCode(MyGUI::KeyCode::Enum(ui))); } } } } run(); // m_pDevice->SetTexture(0, ppTexture); // m_pDevice->SetStreamSource(0, mpBuffer, 0, sizeof(MyGUI::Vertex)) // // count in vertexes, triangle_list = vertexes / 3 // m_pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, _count / 3); // pkRenderer->EndUsingRenderTargetGroup(); }
bool MGUI_System::InjectMouseEvent() { bool inject = false; if (IMouse::Instance()->MouseMoved() || IMouse::Instance()->MouseWheel()) { static int pt_z = 0; Point2i pt = IMouse::Instance()->GetPosition(); pt_z += IMouse::Instance()->MouseWheel(); if (injectMouseMove(pt.x, pt.y, pt_z)) inject = true; } if (IMouse::Instance()->KeyDown(MKC_BUTTON0)) { Point2i pt = IMouse::Instance()->GetPosition(); if (injectMousePress(pt.x, pt.y, MyGUI::MouseButton::Left)) inject = true; } if (IMouse::Instance()->KeyDown(MKC_BUTTON1)) { Point2i pt = IMouse::Instance()->GetPosition(); if (injectMousePress(pt.x, pt.y, MyGUI::MouseButton::Right)) inject = true; } if (IMouse::Instance()->KeyDown(MKC_BUTTON2)) { Point2i pt = IMouse::Instance()->GetPosition(); if (injectMousePress(pt.x, pt.y, MyGUI::MouseButton::Middle)) inject = true; } if (IMouse::Instance()->KeyUp(MKC_BUTTON0)) { Point2i pt = IMouse::Instance()->GetPosition(); if (injectMouseRelease(pt.x, pt.y, MyGUI::MouseButton::Left)) inject = true; } if (IMouse::Instance()->KeyUp(MKC_BUTTON1)) { Point2i pt = IMouse::Instance()->GetPosition(); if (injectMouseRelease(pt.x, pt.y, MyGUI::MouseButton::Right)) inject = true; } if (IMouse::Instance()->KeyUp(MKC_BUTTON2)) { Point2i pt = IMouse::Instance()->GetPosition(); if (injectMouseRelease(pt.x, pt.y, MyGUI::MouseButton::Middle)) inject = true; } return inject; }