unit CustomDrawDemoMain; interface {$I ..\cxVer.inc} uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DemoBasicMain, cxStyles, cxGraphics, cxEdit, cxScheduler, cxSchedulerCustomControls, cxSchedulerCustomResourceView, cxSchedulerDayView, cxSchedulerDateNavigator, cxLookAndFeels, Menus, StdCtrls, cxControls, cxSchedulerStorage, ExtCtrls, ComCtrls, cxSchedulerTimeGridView, cxSchedulerUtils, cxSchedulerWeekView, cxSchedulerYearView, cxGeometry; type TCustomDrawDemoMainForm = class(TDemoBasicMainForm) Storage: TcxSchedulerStorage; CustomDraw1: TMenuItem; miEvents: TMenuItem; miTimeRuler: TMenuItem; miHeaders: TMenuItem; miContent: TMenuItem; DateNavigator1: TMenuItem; miMonthHeaders: TMenuItem; miDayCaptions: TMenuItem; miDays: TMenuItem; ViewDay1: TMenuItem; miContainer: TMenuItem; miResources: TMenuItem; miGroupSeparator: TMenuItem; cxStyleRepository1: TcxStyleRepository; csBoldItalic: TcxStyle; csItalic: TcxStyle; csRed: TcxStyle; miDNContent: TMenuItem; procedure FormCreate(Sender: TObject); procedure SchedulerDateNavigatorCustomDrawHeader(Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerDateNavigatorMonthHeaderViewInfo; var ADone: Boolean); procedure SchedulerDateNavigatorCustomDrawDayCaption(Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerDateNavigatorDayCaptionViewInfo; var ADone: Boolean); procedure SchedulerDateNavigatorCustomDrawDayNumber(Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerDateNavigatorDayNumberViewInfo; var ADone: Boolean); procedure SchedulerDateNavigatorCustomDrawContent(Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerDateNavigatorMonthContentViewInfo; var ADone: Boolean); procedure SchedulerCustomDrawDayHeader(Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerDayHeaderCellViewInfo; var ADone: Boolean); procedure SchedulerViewDayCustomDrawRuler(Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerTimeRulerCellViewInfo; var ADone: Boolean); procedure SchedulerViewDayCustomDrawContainer(Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerContainerCellViewInfo; var ADone: Boolean); procedure SchedulerCustomDrawEvent(Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerEventCellViewInfo; var ADone: Boolean); procedure SchedulerCustomDrawContent(Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerContentCellViewInfo; var ADone: Boolean); procedure SchedulerCustomDrawResourceHeader(Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerHeaderCellViewInfo; var ADone: Boolean); procedure SchedulerCustomDrawGroupSeparator(Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerGroupSeparatorCellViewInfo; var ADone: Boolean); procedure FormDestroy(Sender: TObject); procedure UpdateCustomDraw(Sender: TObject); private FDaysOffIndexes: array[1..2] of Byte; end; var CustomDrawDemoMainForm: TCustomDrawDemoMainForm; implementation uses cxDateUtils, DateUtils,dxOffice11, cxFormats; {$R *.dfm} var W1, H1, C1, C2: Integer; ABitmap: TBitmap; procedure FillGradientRect(ACanvas: TcxCanvas; const ARect: TRect; AColor1, AColor2: TColor; AHorizontal: Boolean); begin with ARect do begin W1 := Right - Left; H1 := Bottom - Top; if (W1 < 1) or (H1 < 1) then Exit; if (ABitmap.Height <> H1) or (ABitmap.Width <> W1) or (AColor1 <> C1) or (AColor2 <> C2) then begin C1 := AColor1; C2 := AColor2; ABitmap.Free; ABitmap := TBitmap.Create; ABitmap.PixelFormat := pf32Bit; ABitmap.Height := H1; ABitmap.Width := W1; FillTubeGradientRect(ABitmap.Canvas.Handle, Rect(0, 0, W1, H1), AColor1, AColor2, AHorizontal); end; BitBlt(ACanvas.Handle, Left, Top, W1, H1, ABitmap.Canvas.Handle, 0, 0, srcCopy); end; end; procedure TCustomDrawDemoMainForm.FormCreate(Sender: TObject); var I, J: Integer; begin inherited FormCreate(Sender); ABitmap := TBitmap.Create; ABitmap.PixelFormat := pf32bit; Scheduler.OptionsView.RotateResourceCaptions := False; Scheduler.ViewDay.EventShadows := False; I := cxFormatController.StartOfWeek + Ord(dSunday); J := Ord(dSunday) - I; if J < 0 then Inc(J, 7); FDaysOffIndexes[1] := J; J := Ord(dSaturday) - I; if J < 0 then Inc(J, 7); FDaysOffIndexes[2] := J; GenerateRandomEvents(100, True); end; procedure TCustomDrawDemoMainForm.SchedulerDateNavigatorCustomDrawHeader( Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerDateNavigatorMonthHeaderViewInfo; var ADone: Boolean); begin if not miMonthHeaders.Checked then Exit; FillGradientRect(ACanvas, AViewInfo.Bounds, $FFE0E0, $FF8080, False); ACanvas.FrameRect(AViewInfo.Bounds, clBlue); AViewInfo.Transparent := True; end; procedure TCustomDrawDemoMainForm.SchedulerDateNavigatorCustomDrawDayCaption( Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerDateNavigatorDayCaptionViewInfo; var ADone: Boolean); begin if not miDayCaptions.Checked then Exit; if AViewInfo.Index in [FDaysOffIndexes[1], FDaysOffIndexes[2]] then ACanvas.Font := csRed.Font; end; procedure TCustomDrawDemoMainForm.SchedulerDateNavigatorCustomDrawDayNumber( Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerDateNavigatorDayNumberViewInfo; var ADone: Boolean); begin if not miDays.Checked then Exit; if AViewInfo.Selected then ACanvas.Brush.Color := clAppWorkSpace else if DayOfWeek(AViewInfo.Date) in [1, 7] then ACanvas.Font := csRed.Font; end; procedure TCustomDrawDemoMainForm.SchedulerDateNavigatorCustomDrawContent( Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerDateNavigatorMonthContentViewInfo; var ADone: Boolean); var AColor: TColor; R: TRect; begin if not miDNContent.Checked then Exit; R := AViewInfo.Bounds; case AViewInfo.Month of 3..5: AColor := $D0FFD0; 6..8: AColor := $D0D0FF; 9..11: AColor := $D0FFFF; else AColor := $FFE7E7; end; with ACanvas do begin Brush.Color := AColor; FillRect(R); Font.Height := R.Bottom - R.Top; Font.Color := GetMiddleRGB(AColor, 0, 85); DrawText(IntToStr(AViewInfo.Month), R, cxAlignCenter); end; ACanvas.Font := AViewInfo.ViewParams.Font; AViewInfo.Transparent := True; ADone := True; end; procedure TCustomDrawDemoMainForm.SchedulerCustomDrawDayHeader( Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerDayHeaderCellViewInfo; var ADone: Boolean); begin if not miHeaders.Checked then Exit; AViewInfo.Transparent := True; FillGradientRect(ACanvas, AViewInfo.Bounds, $A0A0A0, $707070, False); ACanvas.FrameRect(AViewInfo.Bounds, clGray); ACanvas.Brush.Style := bsClear; ACanvas.Font := csItalic.Font; ACanvas.DrawText(AViewInfo.DisplayText, AViewInfo.Bounds, cxAlignCenter); ACanvas.Brush.Style := bsSolid; ADone := True; end; procedure TCustomDrawDemoMainForm.SchedulerViewDayCustomDrawRuler( Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerTimeRulerCellViewInfo; var ADone: Boolean); begin if not miTimeRuler.Checked then Exit; AViewInfo.Transparent := True; FillGradientRect(ACanvas, AViewInfo.Bounds[True], $909090, $E0E0E0, True); end; procedure TCustomDrawDemoMainForm.SchedulerViewDayCustomDrawContainer( Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerContainerCellViewInfo; var ADone: Boolean); begin if not miContainer.Checked or AViewInfo.Selected then Exit; AViewInfo.Transparent := True; FillGradientRect(ACanvas, AViewInfo.Bounds, $C0E0C0, $70A070, False); end; procedure TCustomDrawDemoMainForm.SchedulerCustomDrawEvent( Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerEventCellViewInfo; var ADone: Boolean); begin if not miEvents.Checked then Exit; AViewInfo.Transparent := True; FillGradientRect(ACanvas, AViewInfo.Bounds, clWhite, AViewInfo.Color, False); end; procedure TCustomDrawDemoMainForm.SchedulerCustomDrawContent( Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerContentCellViewInfo; var ADone: Boolean); begin if not miContent.Checked then Exit; AViewInfo.Transparent := True; FillGradientRect(ACanvas, AViewInfo.Bounds, AViewInfo.Color, GetMiddleRGB(AViewInfo.Color, 0, 75), True); end; procedure TCustomDrawDemoMainForm.SchedulerCustomDrawResourceHeader( Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerHeaderCellViewInfo; var ADone: Boolean); begin if not miResources.Checked then Exit; AViewInfo.Transparent := True; FillGradientRect(ACanvas, AViewInfo.Bounds, $50F0F0, $009090, False); ACanvas.Brush.Style := bsClear; ACanvas.Font := csBoldItalic.Font; ACanvas.DrawText(AViewInfo.DisplayText, AViewInfo.Bounds, cxAlignCenter); ACanvas.Brush.Style := bsSolid; ADone := True; end; procedure TCustomDrawDemoMainForm.SchedulerCustomDrawGroupSeparator( Sender: TObject; ACanvas: TcxCanvas; AViewInfo: TcxSchedulerGroupSeparatorCellViewInfo; var ADone: Boolean); begin if not miGroupSeparator.Checked then Exit; FillGradientRect(ACanvas, cxRectInflate(AViewInfo.Bounds, 0, 0, 1, 0), $50F0F0, $009090, True); ADone := True; end; procedure TCustomDrawDemoMainForm.FormDestroy(Sender: TObject); begin inherited; ABitmap.Free; end; procedure TCustomDrawDemoMainForm.UpdateCustomDraw(Sender: TObject); begin with TMenuItem(Sender) do Checked := not Checked; Scheduler.LayoutChanged; end; end.