void CExtensionNavigatorMenuItem::OnPaint(CG32bitImage &Screen, const RECT &rcInvalid) { // may remove panel outlining in future DrawPanelOutline(Screen); int xO = m_AssociatedPanel.GetOriginX(); int yO = m_AssociatedPanel.GetOriginY(); int SpaceWidth = m_AssociatedPanel.GetSpaceWidth(); int SpaceHeight = m_AssociatedPanel.GetSpaceHeight(); Screen.DrawText(m_AssociatedPanel.GetOriginX() + 10, m_AssociatedPanel.GetOriginY() + 10, m_HeadingFont, m_HeadingColor, m_Extension.GetName()); }
void CGameSession::PaintInfoText (CG32bitImage &Dest, const CString &sTitle, const TArray<CString> &Body, bool bAboveTargeting) // PaintInfoText // // Paints info text on the screen { int i; const CVisualPalette &VI = m_HI.GetVisuals(); const CG16bitFont &TitleFont = VI.GetFont(fontHeader); const CG16bitFont &BodyFont = VI.GetFont(fontMedium); int x = m_rcScreen.left + 2 * TitleFont.GetAverageWidth(); int cy = TitleFont.GetHeight() + Body.GetCount() * BodyFont.GetHeight(); int cySpacing = BodyFont.GetHeight() / 2; RECT rcCenter; m_HUD.GetClearHorzRect(&rcCenter); int y = (bAboveTargeting ? rcCenter.bottom : m_rcScreen.bottom) - (cy + cySpacing); Dest.DrawText(x, y, TitleFont, VI.GetColor(colorTextHighlight), sTitle); y += TitleFont.GetHeight(); // Paint the body for (i = 0; i < Body.GetCount(); i++) { Dest.DrawText(x, y, BodyFont, VI.GetColor(colorTextDialogLabel), Body[i]); y += BodyFont.GetHeight(); } }
void CExtensionNavigator::DrawTitleBar(CG32bitImage &Screen) { Screen.DrawText(m_AssociatedPanel.GetOriginX() + 10, m_AssociatedPanel.GetOriginY() + 10, m_HeadingFont, m_HeadingColor, CONSTLIT("Extension Navigator")); }
void CGItemListArea::Paint (CG32bitImage &Dest, const RECT &rcRect) // Paint // // Paint the area { // Can't paint if we are not properly initialized if (m_pFonts == NULL) return; bool bPaintCursor = false; RECT rcCursor; // Paint Background CG32bitPixel rgbFadeBackColor = CG32bitPixel(CG32bitPixel::Darken(m_rgbBackColor, 220), 220); CGDraw::RoundedRect(Dest, rcRect.left, rcRect.top, RectWidth(rcRect), RectHeight(rcRect), BORDER_RADIUS + 1, rgbFadeBackColor); // If there are no items here, then say so if (m_pListData == NULL || !m_pListData->IsCursorValid()) { int x = rcRect.left + (RectWidth(rcRect) - m_pFonts->LargeBold.MeasureText(STR_NO_ITEMS)) / 2; int y = rcRect.top + (RectHeight(rcRect) - m_pFonts->LargeBold.GetHeight()) / 2; Dest.DrawText(x, y, m_pFonts->LargeBold, RGB_DISABLED_TEXT, STR_NO_ITEMS); m_iOldCursor = -1; } // Otherwise, paint the list of items else { int iCursor = m_pListData->GetCursor(); int iCount = m_pListData->GetCount(); ASSERT(iCursor >= 0 && iCursor < m_Rows.GetCount()); // If the cursor has changed, update the offset so that we // have a smooth scroll. if (m_iOldCursor != -1 && m_iOldCursor != iCursor && m_iOldCursor < m_Rows.GetCount()) { int cyDiff = (m_Rows[iCursor].cyHeight - m_Rows[m_iOldCursor].cyHeight) / 2; if (m_iOldCursor < iCursor) m_yOffset = m_Rows[m_iOldCursor].cyHeight + cyDiff; else m_yOffset = -(m_Rows[iCursor].cyHeight - cyDiff); } m_iOldCursor = iCursor; // Figure out the ideal position of the cursor (relative to the // rect). int yIdeal = m_yOffset + ((RectHeight(rcRect) - m_Rows[iCursor].cyHeight) / 2); // Figure out the actual position of the cursor row (relative to the // rect). int yCursor; // If the cursor is in the top part of the list if (m_Rows[iCursor].yPos < yIdeal) yCursor = m_Rows[iCursor].yPos; // If the total number of lines is less than the whole rect else if (m_cyTotalHeight < RectHeight(rcRect)) yCursor = m_Rows[iCursor].yPos; // If the cursor is in the bottom part of the list else if ((m_cyTotalHeight - m_Rows[iCursor].yPos) < (RectHeight(rcRect) - yIdeal)) yCursor = (RectHeight(rcRect) - (m_cyTotalHeight - m_Rows[iCursor].yPos)); // The cursor is in the middle of the list else yCursor = yIdeal; // Figure out the item position at which we start painting int iStart = FindRow(m_Rows[iCursor].yPos - yCursor); ASSERT(iStart != -1); if (iStart == -1) iStart = 0; int yStart = yCursor - (m_Rows[iCursor].yPos - m_Rows[iStart].yPos); // Compute y offset of first row (so that we can handle clicks later) m_yFirst = yStart - m_Rows[iStart].yPos; // Paint int y = rcRect.top + yStart; int iPos = iStart; bool bPaintSeparator = false; RECT rcItem; while (y < rcRect.bottom && iPos < m_Rows.GetCount()) { // Paint previous separator if (bPaintSeparator) { Dest.Fill(rcItem.left + BORDER_RADIUS, rcItem.bottom - 1, RectWidth(rcItem) - (BORDER_RADIUS * 2), 1, CG32bitPixel(50,50,50)); } else bPaintSeparator = true; // Paint only if we have a valid entry. Sometimes we can // start at an invalid entry because we're scrolling. if (iPos >= 0) { m_pListData->SetCursor(iPos); rcItem.top = y; rcItem.left = rcRect.left; rcItem.bottom = y + m_Rows[iPos].cyHeight; rcItem.right = rcRect.right; // See if we need to paint the cursor bool bIsCursor = (iPos == iCursor); // Paint selection background (if selected) if (bIsCursor) { bPaintCursor = true; bPaintSeparator = false; rcCursor = rcItem; CGDraw::RoundedRect(Dest, rcCursor.left, rcCursor.top, RectWidth(rcCursor), RectHeight(rcCursor), BORDER_RADIUS, m_rgbBackColor); } // Paint item switch (m_iType) { case listCustom: PaintCustom(Dest, rcItem, bIsCursor); break; case listItem: PaintItem(Dest, m_pListData->GetItemAtCursor(), rcItem, bIsCursor); break; } } // Next y += m_Rows[iPos].cyHeight; iPos++; } // Done m_pListData->SetCursor(iCursor); } // Paint a frame CGDraw::RoundedRectOutline(Dest, rcRect.left, rcRect.top, RectWidth(rcRect), RectHeight(rcRect), BORDER_RADIUS, 1, CG32bitPixel(80,80,80)); if (bPaintCursor) { CGDraw::RoundedRectOutline(Dest, rcCursor.left + 1, rcCursor.top + 1, RectWidth(rcCursor) - 2, RectHeight(rcCursor) - 2, BORDER_RADIUS, SELECTION_WIDTH, m_VI.GetColor(colorAreaDialogHighlight)); } }
void CGTextArea::PaintText (CG32bitImage &Dest, const RECT &rcRect) // PaintText // // Paint plain text { // Paint the text if (m_pFont) { // If we haven't justified the text for this size, do it now if (m_cxJustifyWidth != RectWidth(rcRect)) { m_cxJustifyWidth = RectWidth(rcRect); m_Lines.DeleteAll(); m_pFont->BreakText(m_sText, m_cxJustifyWidth, &m_Lines, CG16bitFont::SmartQuotes); } // Compute the rect within which we draw the text RECT rcText = rcRect; if (m_bEditable) { int iVSpacing = (RectHeight(rcRect) - m_pFont->GetHeight()) / 2; rcText.left += iVSpacing; rcText.right -= iVSpacing; rcText.top += iVSpacing; rcText.bottom -= iVSpacing; } // Clip to text rect RECT rcOldClip = Dest.GetClipRect(); Dest.SetClipRect(rcText); // Figure out how many lines fit in the rect int iMaxLineCount = RectHeight(rcText) / m_pFont->GetHeight(); // If there are too many lines, and we're editable, start at the end int iStart = 0; if (m_bEditable && iMaxLineCount < m_Lines.GetCount()) iStart = m_Lines.GetCount() - iMaxLineCount; // Paint each line int x = rcText.left; int y = rcText.top; for (int i = iStart; i < m_Lines.GetCount(); i++) { CString sLine = m_Lines[i]; // Trim the last space in the line, if necessary char *pPos = sLine.GetASCIIZPointer(); if (sLine.GetLength() > 0 && pPos[sLine.GetLength() - 1] == ' ') sLine = strTrimWhitespace(sLine); // Alignment int xLine; if (m_dwStyles & alignCenter) { int cxWidth = m_pFont->MeasureText(sLine); xLine = x + (RectWidth(rcText) - cxWidth) / 2; } else if (m_dwStyles & alignRight) { int cxWidth = m_pFont->MeasureText(sLine); xLine = x + (RectWidth(rcRect) - cxWidth); } else xLine = x; // Paint if (HasEffects()) m_pFont->DrawTextEffect(Dest, xLine, y, m_rgbColor, sLine, GetEffectCount(), GetEffects()); else Dest.DrawText(xLine, y, *m_pFont, m_rgbColor, sLine); // Next y += m_pFont->GetHeight() + m_cyLineSpacing; if (y >= rcText.bottom) break; } // Paint the cursor if (m_bEditable && m_iCursorLine >= iStart) { int cxPos = (m_iCursorLine < m_Lines.GetCount() ? m_pFont->MeasureText(CString(m_Lines[m_iCursorLine].GetASCIIZPointer(), m_iCursorPos, true)) : 0); int y = rcText.top + (m_iCursorLine - iStart) * (m_pFont->GetHeight() + m_cyLineSpacing); int x = rcText.left; if (m_dwStyles & alignCenter) { int cxWidth = (m_iCursorLine < m_Lines.GetCount() ? m_pFont->MeasureText(m_Lines[m_iCursorLine]) : 0); x += ((RectWidth(rcText) - cxWidth) / 2) + cxPos; } else if (m_dwStyles & alignRight) { int cxWidth = (m_iCursorLine < m_Lines.GetCount() ? m_pFont->MeasureText(m_Lines[m_iCursorLine]) : 0); x += (RectWidth(rcText) - cxWidth) + cxPos; } else x += cxPos; if (((m_iTick / 30) % 2) > 0) { Dest.Fill(x, y, 2, m_pFont->GetHeight(), RGB_CURSOR); } } // Restore clip Dest.SetClipRect(rcOldClip); } }
void CGButtonArea::Paint (CG32bitImage &Dest, const RECT &rcRect) // Paint // // Handle paint { int i; // Paint the background CG32bitPixel rgbBackColor = ((m_bMouseOver && !m_bDisabled) ? m_rgbBackColorHover : (m_bDisabled ? CG32bitPixel(m_rgbBackColor, 0xC0) : m_rgbBackColor)); if (!rgbBackColor.IsNull()) { if (m_iBorderRadius > 0) { CGDraw::RoundedRect(Dest, rcRect.left, rcRect.top, RectWidth(rcRect), RectHeight(rcRect), m_iBorderRadius, rgbBackColor); CGDraw::RoundedRectOutline(Dest, rcRect.left, rcRect.top, RectWidth(rcRect), RectHeight(rcRect), m_iBorderRadius, 1, m_rgbBorderColor); } else Dest.Fill(rcRect.left, rcRect.top, RectWidth(rcRect), RectHeight(rcRect), rgbBackColor); } // Paint the label int xPaint = rcRect.left + m_rcPadding.left; int yPaint = rcRect.top + m_rcPadding.top; if (m_pLabelFont) { // If we're disabled, paint gray if (m_bDisabled) Dest.DrawText(xPaint, yPaint, *m_pLabelFont, RGB_DISABLED_TEXT, m_sLabel); // If we have a prefix accelerator, draw that else if (!m_sAccelerator.IsBlank()) { // Measure the size of the accelerator int cyAccel; int cxAccel = m_pLabelFont->MeasureText(m_sAccelerator, &cyAccel); // We draw a rounded-rect box int cxBox = cxAccel + (2 * ACCEL_INNER_PADDING); int cyBox = cyAccel + 1; CGDraw::RoundedRect(Dest, xPaint, yPaint, cxBox, cyBox, ACCEL_BORDER_RADIUS, m_rgbAccelColor); // Draw the text Dest.DrawText(xPaint + ACCEL_INNER_PADDING, yPaint, *m_pLabelFont, CG32bitPixel(0, 0, 0), m_sAccelerator); // Now draw the rest of the label Dest.DrawText(xPaint + cxBox + (2 * ACCEL_INNER_PADDING), yPaint, *m_pLabelFont, m_rgbLabelColor, m_sLabel); } // If we have an accelerator, paint in pieces else if (m_iAccelerator != -1) { char *pPos = m_sLabel.GetASCIIZPointer(); int x = xPaint; if (m_iAccelerator > 0) Dest.DrawText(x, yPaint, *m_pLabelFont, m_rgbLabelColor, CString(pPos, m_iAccelerator, true), 0, &x); Dest.DrawText(x, yPaint, *m_pLabelFont, m_rgbAccelColor, CString(pPos + m_iAccelerator, 1, true), 0, &x); Dest.DrawText(x, yPaint, *m_pLabelFont, m_rgbLabelColor, CString(pPos + m_iAccelerator + 1, m_sLabel.GetLength() - m_iAccelerator - 1, true)); } else Dest.DrawText(xPaint, yPaint, *m_pLabelFont, m_rgbLabelColor, m_sLabel); yPaint += m_pLabelFont->GetHeight(); } // Paint the description if (m_pDescFont) { for (i = 0; i < m_Lines.GetCount(); i++) { Dest.DrawText(xPaint, yPaint, *m_pDescFont, m_rgbDescColor, m_Lines[i]); yPaint += m_pDescFont->GetHeight(); } } }