CursesWindow::CursesWindow(CursesWindow *parent, const std::string & name, const Size & s, const Point & p, int default_cp, int bk_cp, bool lvok) : Component(parent, name), m_win(0), topLeft(p), absTopLeft(p), sz(s) { if (parent) absTopLeft += parent->absPos(); m_win = newwin(size().rows(), size().cols(), absPos().y(), absPos().x()); setDefaultColor(default_cp); setBackgroundColor(bk_cp); setLeaveOK(lvok); }
Vector2f Widget::GetAbsolutePosition() const { Vector2f absPos(0.f, 0.f); const Widget* currentWidget = this; while (currentWidget) { absPos += currentWidget->GetPosition(); currentWidget = currentWidget->GetParent(); } return absPos; }
void Widget::setPositionPercent(const Vec2 &percent) { if (_usingLayoutComponent) { auto component = this->getOrCreateLayoutComponent(); component->setPositionPercentX(percent.x); component->setPositionPercentY(percent.y); component->refreshLayout(); } else { _positionPercent = percent; if (_running) { Widget* widgetParent = getWidgetParent(); if (widgetParent) { Size parentSize = widgetParent->getContentSize(); Vec2 absPos(parentSize.width * _positionPercent.x, parentSize.height * _positionPercent.y); setPosition(absPos); } } } }
bool CCommonWidget::winEvent (MSG* msg, long *result) { switch(msg->message) { case WM_INPUTLANGCHANGEREQUEST: { HKL hkl = (HKL)msg->lParam; //激活对应输入法 ActivateKeyboardLayout(hkl, KLF_REPLACELANG); //不允许默认处理,否则某些输入法会导致程序卡死 *result = 0; } return true; case WM_GETMINMAXINFO: { MINMAXINFO *mmi = (MINMAXINFO *)msg->lParam; const QRect rect = QApplication::desktop()->availableGeometry(); RECT clientRect,wndRect; POINT point = {0,0}; ::GetClientRect(winId(),&clientRect); ::ClientToScreen(winId(),&point); ::OffsetRect(&clientRect,point.x,point.y); ::GetWindowRect(winId(),&wndRect); if(clientRect.right - clientRect.left > 0) { int leftOffset = clientRect.left - wndRect.left; int topOffset = clientRect.top - wndRect.top; int rightOffset = wndRect.right - clientRect.right; int bottomOffset = wndRect.bottom - clientRect.bottom; m_oMaxMargins.setLeft(leftOffset); m_oMaxMargins.setTop(topOffset); m_oMaxMargins.setRight(rightOffset); m_oMaxMargins.setBottom(bottomOffset); mmi->ptMaxPosition.x = rect.left() - leftOffset; mmi->ptMaxPosition.y = rect.top() - topOffset; mmi->ptMaxSize.x = rect.width() + leftOffset + rightOffset; mmi->ptMaxSize.y = rect.height() + topOffset + bottomOffset; mmi->ptMaxTrackSize.x = mmi->ptMaxSize.x; mmi->ptMaxTrackSize.y = mmi->ptMaxSize.y; } else { mmi->ptMaxPosition.x = rect.left() - m_oMaxMargins.left(); mmi->ptMaxPosition.y = rect.top() - m_oMaxMargins.top(); mmi->ptMaxSize.x = rect.width() + m_oMaxMargins.left() + m_oMaxMargins.right(); mmi->ptMaxSize.y = rect.height() + m_oMaxMargins.top() + m_oMaxMargins.bottom(); mmi->ptMaxTrackSize.x = mmi->ptMaxSize.x; mmi->ptMaxTrackSize.y = mmi->ptMaxSize.y; } } break; case WM_NCHITTEST: { QPoint absPos(LOWORD(msg->lParam), HIWORD(msg->lParam)); QPoint pos = mapFromGlobal(absPos); int x = pos.x(); int y = pos.y(); int w = width(); int h = height(); if(x >= 0 && x <= w && y >= 0 && y <= h) { if((m_lWndFlag & enum_GGWndResizeHint) && !isMaximized() && !isMinimized()) { if(x < DEF_NOCLIENT_SIZE) { if(y < DEF_NOCLIENT_SIZE) { *result = HTTOPLEFT; } else if(y > h - DEF_NOCLIENT_SIZE) { *result = HTBOTTOMLEFT; } else { *result = HTLEFT; } } else if(x > w - DEF_NOCLIENT_SIZE) { if(y < DEF_NOCLIENT_SIZE) { *result = HTTOPRIGHT; } else if(y > h - DEF_NOCLIENT_SIZE) { *result = HTBOTTOMRIGHT; } else { *result = HTRIGHT; } } else if(y < DEF_NOCLIENT_SIZE) { *result = HTTOP; } else if(y > h - DEF_NOCLIENT_SIZE) { *result = HTBOTTOM; } else if(y < TITLE_HEIGHT) { if(m_pTitleLabel) { const QRect rcTitle = m_pTitleLayout->geometry(); if(x > rcTitle.x() && x < rcTitle.right() && y > rcTitle.y() && y < rcTitle.bottom()) { *result = HTCAPTION; } else { *result = HTCLIENT; } } else { *result = HTCLIENT; } } else { *result = HTCLIENT; } } else { if(y < TITLE_HEIGHT) { if(m_pTitleLabel) { const QRect rcTitle = m_pTitleLayout->geometry(); if(x > rcTitle.x() && x < rcTitle.right() && y > rcTitle.y() && y < rcTitle.bottom()) { *result = HTCAPTION; } else { *result = HTCLIENT; } } else { *result = HTCLIENT; } } else { *result = HTCLIENT; } } } else { return false; } } return true; case WM_NCLBUTTONDBLCLK: { BOOL bCaption = FALSE; if((m_lWndFlag & (enum_GGWndResizeHint | enum_GGWndMaximizeButtonHint))) { QPoint absPos(LOWORD(msg->lParam), HIWORD(msg->lParam)); QPoint pos = mapFromGlobal(absPos); int x = pos.x(); int y = pos.y(); int w = width(); int h = height(); if(y < TITLE_HEIGHT && x >= DEF_NOCLIENT_SIZE && x <= w - DEF_NOCLIENT_SIZE) { if(m_pTitleLabel) { const QRect rcTitle = m_pTitleLayout->geometry(); if(x > rcTitle.x() && x < rcTitle.right() && y > rcTitle.y() && y < rcTitle.bottom()) { bCaption = TRUE; } } } } if(bCaption) { if(isMaximized()) { showNormal(); } else if(isMinimized()) { showNormal(); } else { showMaximized(); } } } return true; case WM_NCLBUTTONDOWN: if(isMaximized()) { if(!COSInfo::IsAboveWinXP()) return true; } break; case WM_NCCALCSIZE: if(msg->wParam) { NCCALCSIZE_PARAMS* lpncsp = (NCCALCSIZE_PARAMS*)msg->lParam; if(lpncsp->rgrc[0].right - lpncsp->rgrc[0].left > 10) { lpncsp->rgrc[0].left += 1; lpncsp->rgrc[0].top += 1; lpncsp->rgrc[0].right -= 1; lpncsp->rgrc[0].bottom -= 1; } //*result = WVR_ALIGNTOP | WVR_ALIGNLEFT | WVR_ALIGNBOTTOM | WVR_ALIGNRIGHT; } *result = 0; return true; case WM_ACTIVATE: { MARGINS margins = {-1}; HINSTANCE hInst = LoadLibraryW(L"dwmapi.dll"); if (hInst) { typedef HRESULT (WINAPI * TmpFun)(HWND,MARGINS*); TmpFun DwmExtendFrameIntoClientArea = (TmpFun)::GetProcAddress(hInst, "DwmExtendFrameIntoClientArea"); if (DwmExtendFrameIntoClientArea) { DwmExtendFrameIntoClientArea(winId(),&margins); } FreeLibrary(hInst); } ::SetWindowLongA(winId(),GWL_EXSTYLE, WS_EX_LEFT); } break; case WM_NCACTIVATE: case 0x00AE: case 0x00AF: *result = 0; return false; } return false; }
bool CCommonDialog::winEvent (MSG* msg, long *result) { switch(msg->message) { case WM_GETMINMAXINFO: { MINMAXINFO *mmi = (MINMAXINFO *)msg->lParam; const QRect rect = QApplication::desktop()->availableGeometry(); RECT clientRect,wndRect; POINT point = {0,0}; ::GetClientRect(winId(),&clientRect); ::ClientToScreen(winId(),&point); ::OffsetRect(&clientRect,point.x,point.y); ::GetWindowRect(winId(),&wndRect); if(clientRect.right - clientRect.left > 0) { int leftOffset = clientRect.left - wndRect.left; int topOffset = clientRect.top - wndRect.top; int rightOffset = wndRect.right - clientRect.right; int bottomOffset = wndRect.bottom - clientRect.bottom; m_oMaxMargins.setLeft(leftOffset); m_oMaxMargins.setTop(topOffset); m_oMaxMargins.setRight(rightOffset); m_oMaxMargins.setBottom(bottomOffset); mmi->ptMaxPosition.x = rect.left() - leftOffset; mmi->ptMaxPosition.y = rect.top() - topOffset; mmi->ptMaxSize.x = rect.width() + leftOffset + rightOffset; mmi->ptMaxSize.y = rect.height() + topOffset + bottomOffset; mmi->ptMaxTrackSize.x = mmi->ptMaxSize.x; mmi->ptMaxTrackSize.y = mmi->ptMaxSize.y; } else { mmi->ptMaxPosition.x = rect.left() - m_oMaxMargins.left(); mmi->ptMaxPosition.y = rect.top() - m_oMaxMargins.top(); mmi->ptMaxSize.x = rect.width() + m_oMaxMargins.left() + m_oMaxMargins.right(); mmi->ptMaxSize.y = rect.height() + m_oMaxMargins.top() + m_oMaxMargins.bottom(); mmi->ptMaxTrackSize.x = mmi->ptMaxSize.x; mmi->ptMaxTrackSize.y = mmi->ptMaxSize.y; } } break; case WM_NCHITTEST: { QPoint absPos(LOWORD(msg->lParam), HIWORD(msg->lParam)); QPoint pos = mapFromGlobal(absPos); int x = pos.x(); int y = pos.y(); int w = width(); int h = height(); if(x >= 0 && x <= w && y >= 0 && y <= h) { if((m_lWndFlag & enum_GGWndResizeHint) && !isMaximized() && !isMinimized()) { if(x < DEF_NOCLIENT_SIZE) { if(y < DEF_NOCLIENT_SIZE) { *result = HTTOPLEFT; } else if(y > h - DEF_NOCLIENT_SIZE) { *result = HTBOTTOMLEFT; } else { *result = HTLEFT; } } else if(x > w - DEF_NOCLIENT_SIZE) { if(y < DEF_NOCLIENT_SIZE) { *result = HTTOPRIGHT; } else if(y > h - DEF_NOCLIENT_SIZE) { *result = HTBOTTOMRIGHT; } else { *result = HTRIGHT; } } else if(y < DEF_NOCLIENT_SIZE) { *result = HTTOP; } else if(y > h - DEF_NOCLIENT_SIZE) { *result = HTBOTTOM; } else if(y < 50) { if(m_pTitleLabel) { const QRect rcTitle = m_pTitleLayout->geometry(); if(x > rcTitle.x() && x < rcTitle.right() && y > rcTitle.y() && y < rcTitle.bottom()) { *result = HTCAPTION; } else { *result = HTCLIENT; } } else { *result = HTCLIENT; } } else { *result = HTCLIENT; } } else { if(y < 50) { if(m_pTitleLabel) { const QRect rcTitle = m_pTitleLayout->geometry(); if(x > rcTitle.x() && x < rcTitle.right() && y > rcTitle.y() && y < rcTitle.bottom()) { *result = HTCAPTION; } else { *result = HTCLIENT; } } else { *result = HTCLIENT; } } else { *result = HTCLIENT; } } } else { return false; } } return true; case WM_NCLBUTTONDBLCLK: { BOOL bCaption = FALSE; if((m_lWndFlag & (enum_GGWndResizeHint | enum_GGWndMaximizeButtonHint))) { QPoint absPos(LOWORD(msg->lParam), HIWORD(msg->lParam)); QPoint pos = mapFromGlobal(absPos); int x = pos.x(); int y = pos.y(); int w = width(); int h = height(); if(y < 50 && x >= DEF_NOCLIENT_SIZE && x <= w - DEF_NOCLIENT_SIZE) { if(m_pTitleLabel) { const QRect rcTitle = m_pTitleLayout->geometry(); if(x > rcTitle.x() && x < rcTitle.right() && y > rcTitle.y() && y < rcTitle.bottom()) { bCaption = TRUE; } } } } if(bCaption) { if(isMaximized()) { showNormal(); } else if(isMinimized()) { showNormal(); } else { showMaximized(); } } } return true; case WM_NCLBUTTONDOWN: if(isMaximized()) { if(!COSInfo::IsAboveWinXP()) return true; } break; //case WM_ACTIVATE: // { // MARGINS margins = {-1}; // HINSTANCE hInst = LoadLibraryW(L"dwmapi.dll"); // if (hInst) // { // typedef HRESULT (WINAPI * TmpFun)(HWND,MARGINS*); // TmpFun DwmExtendFrameIntoClientArea = (TmpFun)::GetProcAddress(hInst, "DwmExtendFrameIntoClientArea"); // if (DwmExtendFrameIntoClientArea) // { // DwmExtendFrameIntoClientArea(winId(),&margins); // } // FreeLibrary(hInst); // } // ::SetWindowLongA(winId(),GWL_EXSTYLE, WS_EX_LEFT); // } // break; //case WM_NCACTIVATE: //case 0x00AE: //case 0x00AF: // *result = 0; // return false; } return false; }
bool CNrpBrowserWindow::OnEvent(const SEvent& event) { if( !IsVisible ) return false; switch(event.EventType) { case EET_MOUSE_INPUT_EVENT: { core::position2di absPos(event.MouseInput.X, event.MouseInput.Y); core::position2di mousePos = absPos - _image->getAbsolutePosition().UpperLeftCorner; switch(event.MouseInput.Event) { case EMIE_LMOUSE_PRESSED_DOWN: HTMLEngine::Instance().MouseDown(mousePos.X, mousePos.Y); break; case EMIE_LMOUSE_LEFT_UP: HTMLEngine::Instance().MouseUp(mousePos.X, mousePos.Y); break; case EMIE_MOUSE_WHEEL: HTMLEngine::Instance().ScrollByLines( event.MouseInput.Wheel > 0 ? -1 : 1 ); break; case EMIE_MOUSE_MOVED: HTMLEngine::Instance().MouseMoved( mousePos.X, mousePos.Y ); break; } if( _image->getRelativePosition().isPointInside( mousePos) ) return true; } break; case EET_GUI_EVENT: { if( event.GUIEvent.EventType == EGET_BUTTON_CLICKED && event.GUIEvent.Caller == buttons_[ BTNE_CLOSE ] ) { setVisible( false ); return true; } if( event.GUIEvent.EventType == EGET_ELEMENT_LEFT && event.GUIEvent.Caller == _image ) { HTMLEngine::Instance().SetFocus( false ); return true; } } break; case EET_KEY_INPUT_EVENT: { if (event.KeyInput.PressedDown) HTMLEngine::Instance().KeyPress(event.KeyInput.Key); } break; default: { int k=0; } break; } return CNrpWindow::OnEvent( event ); }