HRESULT CVidSubtitler::Display()
{
	if(m_ShowSubtitle)
	{
		CBFont* font = Game->m_VideoFont?Game->m_VideoFont:Game->m_SystemFont;
		int Height = font->GetTextHeight((BYTE*)m_Subtitles[m_CurrentSubtitle]->m_Text, Game->m_Renderer->m_Width);
		font->DrawText((BYTE*)m_Subtitles[m_CurrentSubtitle]->m_Text, 0, Game->m_Renderer->m_Height-Height-5, Game->m_Renderer->m_Width, TAL_CENTER);
	}
	return S_OK;
}
示例#2
0
HRESULT CAdItem::Display(int X, int Y)
{
	int Width = 0;
	if(m_CurrentSprite){
		RECT rc;
		m_CurrentSprite->GetBoundingRect(&rc, 0, 0);
		Width = rc.right - rc.left;
	}

	m_PosX = X + Width/2;
	m_PosY = Y;

	HRESULT ret;
	if(m_CurrentSprite) ret = m_CurrentSprite->Draw(X, Y, this, 100, 100, m_AlphaColor);
	else ret = S_OK;

	if(m_DisplayAmount){
		int AmountX = X;
		int AmountY = Y + m_AmountOffsetY;

		if(m_AmountAlign==TAL_RIGHT){
			Width -= m_AmountOffsetX;
			AmountX -= m_AmountOffsetX;
		}
		AmountX += m_AmountOffsetX;

		CBFont* Font = m_Font?m_Font:Game->m_SystemFont;
		if(Font){
			if(m_AmountString) Font->DrawText((BYTE*)m_AmountString, AmountX, AmountY, Width, m_AmountAlign);
			else{
				char Str[256];
				sprintf(Str, "%d", m_Amount);
				Font->DrawText((BYTE*)Str, AmountX, AmountY, Width, m_AmountAlign);
			}
		}
	}

	return ret;
}
示例#3
0
HRESULT CUIButton::Display(int OffsetX, int OffsetY) {
	if (!m_Visible) return S_OK;

	CUITiledImage *back = NULL;
	CBSprite *image = NULL;
	CBFont *font = 0;

	//RECT rect;
	//CBPlatform::SetRect(&rect, OffsetX + m_PosX, OffsetY + m_PosY, OffsetX+m_PosX+m_Width, OffsetY+m_PosY+m_Height);
	//m_Hover = (!m_Disable && CBPlatform::PtInRect(&rect, Game->m_MousePos)!=FALSE);
	m_Hover = (!m_Disable && Game->m_ActiveObject == this && (Game->m_Interactive || Game->m_State == GAME_SEMI_FROZEN));

	if ((m_Press && m_Hover && !Game->m_MouseLeftDown) ||
	        m_OneTimePress && CBPlatform::GetTime() - m_OneTimePressTime >= 100) Press();


	if (m_Disable) {
		if (m_BackDisable) back = m_BackDisable;
		if (m_ImageDisable) image = m_ImageDisable;
		if (m_Text && m_FontDisable) font = m_FontDisable;
	} else if (m_Press || m_OneTimePress || m_StayPressed) {
		if (m_BackPress) back = m_BackPress;
		if (m_ImagePress) image = m_ImagePress;
		if (m_Text && m_FontPress) font = m_FontPress;
	} else if (m_Hover) {
		if (m_BackHover) back = m_BackHover;
		if (m_ImageHover) image = m_ImageHover;
		if (m_Text && m_FontHover) font = m_FontHover;
	} else if (m_CanFocus && IsFocused()) {
		if (m_BackFocus) back = m_BackFocus;
		if (m_ImageFocus) image = m_ImageFocus;
		if (m_Text && m_FontFocus) font = m_FontFocus;
	}

	if (!back && m_Back) back = m_Back;
	if (!image && m_Image) image = m_Image;
	if (m_Text && !font) {
		if (m_Font) font = m_Font;
		else font = Game->m_SystemFont;
	}

	int ImageX = OffsetX + m_PosX;
	int ImageY = OffsetY + m_PosY;

	if (image && m_CenterImage) {
		RECT rc;
		image->GetBoundingRect(&rc, 0, 0);
		ImageX += (m_Width - (rc.right - rc.left)) / 2;
		ImageY += (m_Height - (rc.bottom - rc.top)) / 2;
	}

	if (back) back->Display(OffsetX + m_PosX, OffsetY + m_PosY, m_Width, m_Height);
	//if(image) image->Draw(ImageX +((m_Press||m_OneTimePress)&&back?1:0), ImageY +((m_Press||m_OneTimePress)&&back?1:0), NULL);
	if (image) image->Draw(ImageX + ((m_Press || m_OneTimePress) && back ? 1 : 0), ImageY + ((m_Press || m_OneTimePress) && back ? 1 : 0), m_PixelPerfect ? this : NULL);

	if (font && m_Text) {
		int text_offset = (m_Height - font->GetTextHeight((byte  *)m_Text, m_Width)) / 2;
		font->DrawText((byte  *)m_Text, OffsetX + m_PosX + ((m_Press || m_OneTimePress) ? 1 : 0), OffsetY + m_PosY + text_offset + ((m_Press || m_OneTimePress) ? 1 : 0), m_Width, m_Align);
	}

	if (!m_PixelPerfect || !m_Image) Game->m_Renderer->m_RectList.Add(new CBActiveRect(Game, this, NULL, OffsetX + m_PosX, OffsetY + m_PosY, m_Width, m_Height, 100, 100, false));

	// reset unused sprites
	if (m_Image && m_Image != image) m_Image->Reset();
	if (m_ImageDisable && m_ImageDisable != image) m_ImageDisable->Reset();
	if (m_ImageFocus && m_ImageFocus != image) m_ImageFocus->Reset();
	if (m_ImagePress && m_ImagePress != image) m_ImagePress->Reset();
	if (m_ImageHover && m_ImageHover != image) m_ImageHover->Reset();

	m_Press = m_Hover && Game->m_MouseLeftDown && Game->m_CapturedObject == this;

	return S_OK;
}
HRESULT CUIWindow::Display(int OffsetX, int OffsetY)
{
    // go exclusive
    if(m_Mode==WINDOW_EXCLUSIVE || m_Mode==WINDOW_SYSTEM_EXCLUSIVE)
    {
        if(!m_ShieldWindow) m_ShieldWindow = new CUIWindow(Game);
        if(m_ShieldWindow)
        {
            m_ShieldWindow->m_PosX = m_ShieldWindow->m_PosY = 0;
            m_ShieldWindow->m_Width = Game->m_Renderer->m_Width;
            m_ShieldWindow->m_Height = Game->m_Renderer->m_Height;
            m_ShieldWindow->Display();
        }
    }
    else if(m_IsMenu)
    {
        if(!m_ShieldButton)
        {
            m_ShieldButton = new CUIButton(Game);
            m_ShieldButton->SetName("close");
            m_ShieldButton->SetListener(this, m_ShieldButton, 0);
            m_ShieldButton->m_Parent = this;
        }
        if(m_ShieldButton)
        {
            m_ShieldButton->m_PosX = m_ShieldButton->m_PosY = 0;
            m_ShieldButton->m_Width = Game->m_Renderer->m_Width;
            m_ShieldButton->m_Height = Game->m_Renderer->m_Height;

            m_ShieldButton->Display();
        }
    }

    if(!m_Visible) return S_OK;

    if(m_FadeBackground) Game->m_Renderer->FadeToColor(m_FadeColor);

    if(m_Dragging)
    {
        m_PosX += (Game->m_MousePos.x - m_DragFrom.x);
        m_PosY += (Game->m_MousePos.y - m_DragFrom.y);

        m_DragFrom.x = Game->m_MousePos.x;
        m_DragFrom.y = Game->m_MousePos.y;
    }

    if(!m_FocusedWidget || (!m_FocusedWidget->m_CanFocus || m_FocusedWidget->m_Disable || !m_FocusedWidget->m_Visible))
    {
        MoveFocus();
    }

    bool PopViewport = false;
    if(m_ClipContents)
    {
        if(!m_Viewport) m_Viewport = new CBViewport(Game);
        if(m_Viewport)
        {
            m_Viewport->SetRect(m_PosX+OffsetX, m_PosY+OffsetY, m_PosX+m_Width+OffsetX, m_PosY+m_Height+OffsetY);
            Game->PushViewport(m_Viewport);
            PopViewport = true;
        }
    }


    CUITiledImage* back = m_Back;
    CBSprite* image = m_Image;
    CBFont* font = m_Font;


    if(!IsFocused())
    {
        if(m_BackInactive) back = m_BackInactive;
        if(m_ImageInactive) image = m_ImageInactive;
        if(m_FontInactive) font = m_FontInactive;
    }

    if(m_AlphaColor!=0) Game->m_Renderer->m_ForceAlphaColor = m_AlphaColor;
    if(back)
    {
        back->Display(m_PosX + OffsetX, m_PosY + OffsetY, m_Width, m_Height);
    }
    if(image)
    {
        image->Draw(m_PosX + OffsetX, m_PosY + OffsetY, m_Transparent?NULL:this);
    }
    if(!CBPlatform::IsRectEmpty(&m_TitleRect) && font && m_Text)
    {
        font->DrawText((BYTE*)m_Text, m_PosX+OffsetX+m_TitleRect.left, m_PosY+OffsetY+m_TitleRect.top, m_TitleRect.right-m_TitleRect.left, m_TitleAlign, m_TitleRect.bottom-m_TitleRect.top);
    }

    if(!m_Transparent && !image) Game->m_Renderer->m_RectList.Add(new CBActiveRect(Game, this, NULL, m_PosX+OffsetX, m_PosY+OffsetY, m_Width, m_Height, 100, 100, false));

    for(int i=0; i<m_Widgets.GetSize(); i++)
    {
        m_Widgets[i]->Display(m_PosX+OffsetX, m_PosY+OffsetY);
    }

    if(m_AlphaColor!=0) Game->m_Renderer->m_ForceAlphaColor = 0;

    if(PopViewport)
    {
        Game->PopViewport();
    }
    return S_OK;
}
示例#5
0
HRESULT CUIEdit::Display(int OffsetX, int OffsetY) {
	if (!m_Visible) return S_OK;


	// hack!
	TTextEncoding OrigEncoding = Game->m_TextEncoding;
	Game->m_TextEncoding = TEXT_ANSI;

	if (m_Back) m_Back->Display(OffsetX + m_PosX, OffsetY + m_PosY, m_Width, m_Height);
	if (m_Image) m_Image->Draw(OffsetX + m_PosX, OffsetY + m_PosY, NULL);

	// prepare fonts
	CBFont *font;
	CBFont *sfont;

	if (m_Font) font = m_Font;
	else font = Game->m_SystemFont;

	if (m_FontSelected) sfont = m_FontSelected;
	else sfont = font;

	bool focused = IsFocused();

	m_SelStart = MAX(m_SelStart, 0);
	m_SelEnd   = MAX(m_SelEnd, 0);

	m_SelStart = MIN(m_SelStart, strlen(m_Text));
	m_SelEnd   = MIN(m_SelEnd,   strlen(m_Text));

	//int CursorWidth = font->GetCharWidth(m_CursorChar[0]);
	int CursorWidth = font->GetTextWidth((byte  *)m_CursorChar);

	int s1, s2;
	bool CurFirst;
	// modify scroll offset
	if (m_SelStart >= m_SelEnd) {
		while (font->GetTextWidth((byte  *)m_Text + m_ScrollOffset, std::max(0, m_SelEnd - m_ScrollOffset)) > m_Width - CursorWidth - 2 * m_FrameWidth) {
			m_ScrollOffset++;
			if (m_ScrollOffset >= strlen(m_Text)) break;
		}

		m_ScrollOffset = std::min(m_ScrollOffset, m_SelEnd);

		s1 = m_SelEnd;
		s2 = m_SelStart;
		CurFirst = true;
	} else {
		while (font->GetTextWidth((byte  *)m_Text + m_ScrollOffset, std::max(0, m_SelStart - m_ScrollOffset)) +
		        sfont->GetTextWidth((byte  *)(m_Text + std::max(m_ScrollOffset, m_SelStart)), m_SelEnd - std::max(m_ScrollOffset, m_SelStart))

		        > m_Width - CursorWidth - 2 * m_FrameWidth) {
			m_ScrollOffset++;
			if (m_ScrollOffset >= strlen(m_Text)) break;
		}

		m_ScrollOffset = std::min(m_ScrollOffset, m_SelEnd);

		s1 = m_SelStart;
		s2 = m_SelEnd;
		CurFirst = false;
	}


	int AlignOffset = 0;

	for (int Count = 0; Count < 2; Count++) {
		// draw text
		int xxx, yyy, width, height;

		xxx = m_PosX + m_FrameWidth + OffsetX;
		yyy = m_PosY + m_FrameWidth + OffsetY;

		width = m_PosX + m_Width + OffsetX - m_FrameWidth;
		height = std::max(font->GetLetterHeight(), sfont->GetLetterHeight());

		if (Game->m_TextRTL) xxx += AlignOffset;

		TTextAlign Align = TAL_LEFT;


		// unselected 1
		if (s1 > m_ScrollOffset) {
			if (Count) font->DrawText((byte  *)m_Text + m_ScrollOffset, xxx, yyy, width - xxx, Align, height, s1 - m_ScrollOffset);
			xxx += font->GetTextWidth((byte  *)m_Text + m_ScrollOffset, s1 - m_ScrollOffset);
			AlignOffset += font->GetTextWidth((byte  *)m_Text + m_ScrollOffset, s1 - m_ScrollOffset);
		}

		// cursor
		if (focused && CurFirst) {
			if (Count) {
				if (CBPlatform::GetTime() - m_LastBlinkTime >= m_CursorBlinkRate) {
					m_LastBlinkTime = CBPlatform::GetTime();
					m_CursorVisible = !m_CursorVisible;
				}
				if (m_CursorVisible)
					font->DrawText((byte  *)m_CursorChar, xxx, yyy, width - xxx, Align, height, 1);
			}
			xxx += CursorWidth;
			AlignOffset += CursorWidth;
		}

		// selected
		int s3 = std::max(s1, m_ScrollOffset);

		if (s2 - s3 > 0) {
			if (Count) sfont->DrawText((byte  *)m_Text + s3, xxx, yyy, width - xxx, Align, height, s2 - s3);
			xxx += sfont->GetTextWidth((byte  *)m_Text + s3, s2 - s3);
			AlignOffset += sfont->GetTextWidth((byte  *)m_Text + s3, s2 - s3);
		}

		// cursor
		if (focused && !CurFirst) {
			if (Count) {
				if (CBPlatform::GetTime() - m_LastBlinkTime >= m_CursorBlinkRate) {
					m_LastBlinkTime = CBPlatform::GetTime();
					m_CursorVisible = !m_CursorVisible;
				}
				if (m_CursorVisible)
					font->DrawText((byte  *)m_CursorChar, xxx, yyy, width - xxx, Align, height, 1);
			}
			xxx += CursorWidth;
			AlignOffset += CursorWidth;
		}

		// unselected 2
		if (Count) font->DrawText((byte  *)m_Text + s2, xxx, yyy, width - xxx, Align, height);
		AlignOffset += font->GetTextWidth((byte  *)m_Text + s2);

		AlignOffset = (m_Width - 2 * m_FrameWidth) - AlignOffset;
		if (AlignOffset < 0) AlignOffset = 0;
	}


	Game->m_Renderer->m_RectList.Add(new CBActiveRect(Game, this, NULL, OffsetX + m_PosX, OffsetY + m_PosY, m_Width, m_Height, 100, 100, false));


	Game->m_TextEncoding = OrigEncoding;

	return S_OK;
}