void CBCGPPlannerViewMulti::OnDrawAppointmentsDuration (CDC* pDC) { if ((GetPlanner ()->GetDrawFlags () & BCGP_PLANNER_DRAW_VIEW_NO_DURATION) == BCGP_PLANNER_DRAW_VIEW_NO_DURATION) { return; } XBCGPAppointmentArray& arQueryApps = GetQueryedAppointments (); XBCGPAppointmentArray& arDragApps = GetDragedAppointments (); if (arQueryApps.GetSize () == 0 && arDragApps.GetSize () == 0) { return; } BOOL bDragDrop = IsDragDrop (); DROPEFFECT dragEffect = GetDragEffect (); BOOL bDragMatch = IsCaptureMatched (); COleDateTime dtS = GetDateStart (); COleDateTime dtE = GetDateEnd (); const int nMinuts = CBCGPPlannerView::GetTimeDeltaInMinuts (GetTimeDelta ()); const int nCount = GetViewHours() * 60 / nMinuts; const int yOffset = GetViewHourOffset () * m_nRowHeight; for (int nApp = 0; nApp < 2; nApp++) { XBCGPAppointmentArray& arApps = nApp == 1 ? arDragApps : arQueryApps; if (nApp == 1) { bDragDrop = bDragDrop && arDragApps.GetSize (); } if (arApps.GetSize () == 0) { continue; } for (int i = 0; i < arApps.GetSize (); i++) { CBCGPAppointment* pApp = arApps [i]; if (pApp == NULL || !(pApp->IsAllDay () || pApp->IsMultiDay ()) || pApp->GetDurationColor () == CLR_DEFAULT) { continue; } BOOL bDraw = FALSE; if (bDragDrop && dragEffect != DROPEFFECT_NONE && pApp->IsSelected () && nApp == 0) { if ((dragEffect & DROPEFFECT_COPY) == DROPEFFECT_COPY || bDragMatch) { bDraw = TRUE; } } else { bDraw = TRUE; } if(!bDraw) { continue; } int nResourceIndex = FindResourceIndexByID (pApp->GetResourceID ()); ASSERT(nResourceIndex != -1); XResource& resource = m_Resources[nResourceIndex]; COleDateTime dtStart = pApp->GetStart (); COleDateTime dtFinish = pApp->GetFinish (); dtStart.SetDate (dtStart.GetYear (), dtStart.GetMonth (), dtStart.GetDay ()); dtFinish.SetDate (dtFinish.GetYear (), dtFinish.GetMonth (), dtFinish.GetDay ()); BOOL bStart = FALSE; BOOL bEnd = FALSE; if (dtStart < dtS) { dtStart = dtS; bStart = TRUE; } if (dtE < dtFinish) { dtFinish = dtE; bEnd = TRUE; } COleDateTimeSpan span (dtFinish - dtStart); int nStart = (dtStart - dtS).GetDays (); int nEnd = min(nStart + span.GetDays () + 1, GetViewDuration ()); CBrush br (pApp->GetDurationColor () == CLR_DEFAULT ? globalData.clrWindow : pApp->GetDurationColor ()); for(int i = nStart; i < nEnd; i++) { CRect rt (resource.m_Rects[i]); rt.right = rt.left + CBCGPPlannerViewMulti::BCGP_PLANNER_DURATION_BAR_WIDTH + 1; rt.left -= (i == 0) ? 1 : 0; rt.top -= 1; rt.bottom = rt.top + nCount * m_nRowHeight; rt.DeflateRect (1, 0); if (!pApp->IsAllDay ()) { rt.OffsetRect (0, -yOffset); if (i == (nEnd - 1) && !bEnd) { dtFinish = pApp->GetFinish (); const double dDelta = (dtFinish.GetHour () * 60 + dtFinish.GetMinute ()) / (double)nMinuts; rt.bottom = rt.top + CBCGPPlannerView::round(dDelta * m_nRowHeight); } if (i == nStart && !bStart) { dtStart = pApp->GetStart (); const double dDelta = (dtStart.GetHour () * 60 + dtStart.GetMinute ()) / (double)nMinuts; rt.top += CBCGPPlannerView::round(dDelta * m_nRowHeight); } rt.IntersectRect (rt, resource.m_Rects[i]); } pDC->FillRect (rt, &br); } } } }