FX_BOOL CFWL_EditTP::DrawBackground(CFWL_ThemeBackground* pParams) { switch (pParams->m_iPart) { case FWL_PART_EDT_Border: { DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); break; } case FWL_PART_EDT_Edge: { DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), &pParams->m_rtPart, &pParams->m_matrix); break; } case FWL_PART_EDT_Background: { if (pParams->m_pPath) { CFX_Graphics* pGraphics = pParams->m_pGraphics; pGraphics->SaveGraphState(); CFX_Color crSelected(FWL_GetThemeColor(m_dwThemeID) == 0 ? FWLTHEME_COLOR_BKSelected : FWLTHEME_COLOR_Green_BKSelected); pGraphics->SetFillColor(&crSelected); pGraphics->FillPath(pParams->m_pPath, FXFILL_WINDING, &pParams->m_matrix); pGraphics->RestoreGraphState(); } else { FX_BOOL bStatic = pParams->m_dwData == FWL_PARTDATA_EDT_StaticBackground; CFX_Path path; path.Create(); path.AddRectangle(pParams->m_rtPart.left, pParams->m_rtPart.top, pParams->m_rtPart.width, pParams->m_rtPart.height); CFX_Color cr(FWLTHEME_COLOR_Background); if (!bStatic) { if ((pParams->m_dwStates & FWL_PARTSTATE_EDT_Disable) == FWL_PARTSTATE_EDT_Disable) { cr.Set(FWLTHEME_COLOR_EDGERB1); } else if ((pParams->m_dwStates & FWL_PARTSTATE_EDT_ReadOnly) == FWL_PARTSTATE_EDT_ReadOnly) { cr.Set(ArgbEncode(255, 236, 233, 216)); } else { cr.Set(0xFFFFFFFF); } } pParams->m_pGraphics->SaveGraphState(); pParams->m_pGraphics->SetFillColor(&cr); pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, &pParams->m_matrix); pParams->m_pGraphics->RestoreGraphState(); } break; } case FWL_PART_EDT_CombTextLine: { FX_ARGB cr = 0xFF000000; FX_FLOAT fWidth = 1.0f; CFX_Color crLine(cr); pParams->m_pGraphics->SetStrokeColor(&crLine); pParams->m_pGraphics->SetLineWidth(fWidth); pParams->m_pGraphics->StrokePath(pParams->m_pPath, &pParams->m_matrix); break; } default: { break; } } return TRUE; }
void MyGraph::DrawSeriesLine(CDC& dc) const { VALIDATE; ASSERT_VALID(&dc); _ASSERTE(!m_bStackedGraph); // Iterate the groups. CPoint ptLastLoc(0,0); int dataLastLoc(0); for (int nGroup = 0; nGroup < GetMaxSeriesSize(); nGroup++) { // How much space does each series get (includes inter series space)? int nSeriesSpace(0); if (m_saLegendLabels.GetSize()) { nSeriesSpace = (m_nXAxisWidth - m_rcLegend.Width() - (GAP_PIXELS * 2)) / (int)m_olMyGraphSeries.GetCount(); } else { nSeriesSpace = m_nXAxisWidth / (int)m_olMyGraphSeries.GetCount(); } // Determine width of bars. int nMaxSeriesSize(GetMaxSeriesSize()); nMaxSeriesSize = max(nMaxSeriesSize, 1); int nBarWidth(nSeriesSpace / nMaxSeriesSize); if (1 < m_olMyGraphSeries.GetCount()) { nBarWidth = (int) ((double) nBarWidth * INTERSERIES_PERCENT_USED); } // This is the width of the largest series (no inter series space). //int nMaxSeriesPlotSize(GetMaxSeriesSize() * nBarWidth); // Iterate the series. POSITION pos(m_olMyGraphSeries.GetHeadPosition()); // Build objects. COLORREF crLine(m_dwaColors.GetAt(nGroup)); CBrush br(crLine); CBrush* pBrushOld = dc.SelectObject(&br); ASSERT_VALID(pBrushOld); CPen penLine(PS_SOLID, 1, crLine); CPen* pPenOld = dc.SelectObject(&penLine); ASSERT_VALID(pPenOld); for (int nSeries = 0; nSeries < m_olMyGraphSeries.GetCount(); ++nSeries) { MyGraphSeries* pSeries = m_olMyGraphSeries.GetNext(pos); ASSERT_VALID(pSeries); // Get x and y location of center of ellipse. CPoint ptLoc(0,0); ptLoc.x = m_ptOrigin.x + (((nSeries + 1) * nSeriesSpace) - (nSeriesSpace / 2)); int nMaxDataValue(GetMaxDataValue()); nMaxDataValue = max(nMaxDataValue, 1); double dLineHeight(pSeries->GetData(nGroup) * m_nYAxisHeight / double(nMaxDataValue)); ptLoc.y = (int) ((double) m_ptOrigin.y - dLineHeight); // Draw line back to last data member. if (nSeries > 0 && (pSeries->GetData(nGroup)!=0 || dataLastLoc != 0)) { dc.MoveTo(ptLastLoc.x, ptLastLoc.y - 1); VERIFY(dc.LineTo(ptLoc.x - 1, ptLoc.y - 1)); } // Now draw ellipse. CRect rcEllipse(ptLoc.x - 3, ptLoc.y - 3, ptLoc.x + 3, ptLoc.y + 3); if(pSeries->GetData(nGroup)!=0){ VERIFY(dc.Ellipse(rcEllipse)); } if (m_olMyGraphSeries.GetCount() < 40) { pSeries->SetTipRegion(nGroup, rcEllipse); } // Save last pt and data ptLastLoc = ptLoc; dataLastLoc = pSeries->GetData(nGroup); } VERIFY(dc.SelectObject(pPenOld)); penLine.DeleteObject(); VERIFY(dc.SelectObject(pBrushOld)); br.DeleteObject(); } int nMaxDataValue = max(GetMaxDataValue(), 1); double barTop = m_ptOrigin.y - (double)m_nYAxisHeight * (GetAverageDataValue() / (double)nMaxDataValue); dc.MoveTo(m_ptOrigin.x, barTop); VERIFY(dc.LineTo(m_ptOrigin.x + (m_nXAxisWidth - m_rcLegend.Width() - (GAP_PIXELS * 2)), barTop)); }