/// <summary> /// Paints the Ribbon on the specified device /// </summary> /// <param name="g">Device where to paint on</param> /// <param name="clip">Clip rectangle</param> private void PaintOn(Graphics g, Rectangle clip) { if (WinApi.IsWindows && Environment.OSVersion.Platform == PlatformID.Win32NT) { g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; } //Caption Background Renderer.OnRenderRibbonBackground(new RibbonRenderEventArgs(this, g, clip)); //Caption Bar Renderer.OnRenderRibbonCaptionBar(new RibbonRenderEventArgs(this, g, clip)); //Caption Buttons if (CaptionButtonsVisible) { MinimizeButton.OnPaint(this, new RibbonElementPaintEventArgs(clip, g, RibbonElementSizeMode.Medium)); MaximizeRestoreButton.OnPaint(this, new RibbonElementPaintEventArgs(clip, g, RibbonElementSizeMode.Medium)); CloseButton.OnPaint(this, new RibbonElementPaintEventArgs(clip, g, RibbonElementSizeMode.Medium)); } //Orb Renderer.OnRenderRibbonOrb(new RibbonRenderEventArgs(this, g, clip)); //QuickAcess toolbar QuickAcessToolbar.OnPaint(this, new RibbonElementPaintEventArgs(clip, g, RibbonElementSizeMode.Compact)); //Render Tabs foreach (RibbonTab tab in Tabs) { tab.OnPaint(this, new RibbonElementPaintEventArgs(tab.TabBounds, g, RibbonElementSizeMode.None, this)); } }
/// <summary> /// Updates the regions of the tabs and the tab content bounds of the active tab /// </summary> internal void UpdateRegions(Graphics g) { bool graphicsCreated = false; if (IsDisposed || _updatingSuspended) { return; } ///Graphics for measurement if (g == null) { g = CreateGraphics(); graphicsCreated = true; } ///X coordinate reminder int curLeft = TabsMargin.Left + OrbBounds.Width; ///Saves the width of the larger tab int maxWidth = 0; ///Saves the bottom of the tabs int tabsBottom = 0; #region Assign default tab bounds (best case) foreach (RibbonTab tab in Tabs) { Size tabSize = tab.MeasureSize(this, new RibbonElementMeasureSizeEventArgs(g, RibbonElementSizeMode.None)); Rectangle bounds = new Rectangle(curLeft, TabsMargin.Top, TabsPadding.Left + tabSize.Width + TabsPadding.Right, TabsPadding.Top + tabSize.Height + TabsPadding.Bottom); tab.SetTabBounds(bounds); curLeft = bounds.Right + TabSpacing; maxWidth = Math.Max(bounds.Width, maxWidth); tabsBottom = Math.Max(bounds.Bottom, tabsBottom); tab.SetTabContentBounds(Rectangle.FromLTRB( TabContentMargin.Left, tabsBottom + TabContentMargin.Top, ClientSize.Width - 1 - TabContentMargin.Right, ClientSize.Height - 1 - TabContentMargin.Bottom)); if (tab.Active) { tab.UpdatePanelsRegions(); } } #endregion #region Reduce bounds of tabs if needed while (curLeft > ClientRectangle.Right && maxWidth > 0) { curLeft = TabsMargin.Left + OrbBounds.Width; maxWidth--; foreach (RibbonTab tab in Tabs) { if (tab.TabBounds.Width >= maxWidth) { tab.SetTabBounds(new Rectangle(curLeft, TabsMargin.Top, maxWidth, tab.TabBounds.Height)); } else { tab.SetTabBounds(new Rectangle( new Point(curLeft, TabsMargin.Top), tab.TabBounds.Size)); } curLeft = tab.TabBounds.Right + TabSpacing; } } #endregion #region Update QuickAccess bounds QuickAcessToolbar.MeasureSize(this, new RibbonElementMeasureSizeEventArgs(g, RibbonElementSizeMode.Compact)); QuickAcessToolbar.SetBounds(new Rectangle(new Point(OrbBounds.Right + QuickAcessToolbar.Margin.Left, OrbBounds.Top - 2), QuickAcessToolbar.LastMeasuredSize)); #endregion #region Update Caption Buttons bounds if (CaptionButtonsVisible) { Size cbs = new Size(20, 20); int cbg = 2; CloseButton.SetBounds(new Rectangle(new Point(ClientRectangle.Right - cbs.Width - cbg, cbg), cbs)); MaximizeRestoreButton.SetBounds(new Rectangle(new Point(CloseButton.Bounds.Left - cbs.Width, cbg), cbs)); MinimizeButton.SetBounds(new Rectangle(new Point(MaximizeRestoreButton.Bounds.Left - cbs.Width, cbg), cbs)); } #endregion if (graphicsCreated) { g.Dispose(); } _lastSizeMeasured = Size; RenewSensor(); }