Exemple #1
0
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);
}
Exemple #2
0
        Vector2f     Widget::GetAbsolutePosition() const
        {
            Vector2f absPos(0.f, 0.f);
            const Widget* currentWidget = this;

            while (currentWidget)
            {
                absPos += currentWidget->GetPosition();
                currentWidget = currentWidget->GetParent();
            }

            return absPos;
        }
Exemple #3
0
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;
}
Exemple #6
0
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 );
}