using System; using System.Text; using System.Drawing; using System.Windows.Forms; using System.Runtime.InteropServices; using DevComponents.DotNetBar.Rendering; using System.Drawing.Drawing2D; using System.ComponentModel; namespace DevComponents.DotNetBar { /// /// Represents the form in Office style with custom borders and caption. /// public class OfficeForm : RibbonForm { #region Private Variables private int m_BorderWidth = 2; private int m_CornerSize = 5; private GenericItemContainer m_Caption = null; private ColorScheme m_ColorScheme = null; private LabelItem m_TitleLabel = null; private SystemCaptionItem m_SystemIcon = null; private SystemCaptionItem m_SystemButtons = null; private Timer m_MouseTimer = null; private Font m_CaptionFont = null; private string m_TitleText = ""; #endregion #region Constructor public OfficeForm() : base() { // This forces the initialization out of paint loop which speeds up how fast components show up BaseRenderer renderer = Rendering.GlobalManager.Renderer; m_BorderWidth = SystemInformation.Border3DSize.Width + NativeFunctions.BorderMultiplierFactor; this.DockPadding.All = 0; m_Caption = new GenericItemContainer(); m_Caption.GlobalItem = false; m_Caption.ContainerControl = this; m_Caption.WrapItems = false; m_Caption.EventHeight = false; m_Caption.UseMoreItemsButton = false; m_Caption.Stretch = true; m_Caption.Displayed = true; m_Caption.SystemContainer = true; m_Caption.PaddingTop = 0; m_Caption.PaddingBottom = 0; m_Caption.PaddingLeft = 2; m_Caption.ItemSpacing = 1; m_Caption.SetOwner(this); m_Caption.Style = eDotNetBarStyle.StyleManagerControlled; m_Caption.ToolbarItemsAlign = eContainerVerticalAlignment.Top; m_SystemIcon = new SystemCaptionItem(); m_SystemIcon.GlobalItem = false; m_SystemIcon.Enabled = false; m_Caption.SubItems.Add(m_SystemIcon); m_SystemIcon.IsSystemIcon = true; m_SystemIcon.Icon = this.Icon; m_TitleLabel = CreateTitleLabel(); m_Caption.SubItems.Add(m_TitleLabel); CreateAdditionalCaptionItems(m_Caption); m_SystemButtons = new SystemCaptionItem(); m_SystemButtons.GlobalItem = false; //m_SystemButtons.ItemAlignment = eItemAlignment.Far; m_SystemButtons.Click += new EventHandler(SystemButtons_Click); m_SystemButtons.MouseEnter += new EventHandler(SystemButtons_MouseEnter); m_Caption.SubItems.Add(m_SystemButtons); } protected override void Dispose(bool disposing) { if (disposing) { CleanupMdiClientHandler(); StopCaptionNCMouseTimer(); m_SystemButtons.Click -= new EventHandler(SystemButtons_Click); m_SystemButtons.MouseEnter -= new EventHandler(SystemButtons_MouseEnter); m_TitleLabel.MarkupLinkClick -= TitleLabelMarkupLinkClick; m_Caption.Dispose(); } base.Dispose(disposing); } protected virtual void CreateAdditionalCaptionItems(GenericItemContainer captionContainer) { } protected virtual LabelItem CreateTitleLabel() { LabelItem label = new LabelItem(); label.GlobalItem = false; label.Font = SystemFonts.CaptionFont; label.Stretch = true; label.TextLineAlignment = StringAlignment.Center; label.Text = this.Text; label.PaddingLeft = 3; label.PaddingRight = 3; label.MarkupLinkClick += TitleLabelMarkupLinkClick; return label; } private void TitleLabelMarkupLinkClick(object sender, MarkupLinkClickEventArgs e) { OnTitleTextMarkupLinkClick(e); } /// /// Called by StyleManager to notify control that style on manager has changed and that control should refresh its appearance if /// its style is controlled by StyleManager. /// /// New active style. [EditorBrowsable(EditorBrowsableState.Never)] public override void StyleManagerStyleChanged(eDotNetBarStyle newStyle) { base.StyleManagerStyleChanged(newStyle); this.RecalcSize(); InvalidateNonClient(true); } #endregion #region Internal Implementation protected override bool SetClientSizeCoreCustom(int x, int y) { TrackSetBoundsCore = true; AdjustBounds(ref x, ref y); return true; // Make sure base call is made } /// /// Gets or sets the rich text displayed in form caption instead of the Form.Text property. This property supports text-markup. /// You can use markup to instruct the markup renderer to use Office 2007 system caption extra text color which /// changes depending on the currently selected color table. Note that when using this property you should manage also the Form.Text property since /// that is the text that will be displayed in Windows task-bar and elsewhere where system Form.Text property is used. /// You can also use the hyperlinks as part of the text markup and handle the TitleTextMarkupLinkClick event to be notified when they are clicked. /// Setting this property to an empty string (default value) indicates that Form.Text property will be used for form caption. /// [Browsable(true), DefaultValue(""), Editor("DevComponents.DotNetBar.Design.TextMarkupUIEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor)), EditorBrowsable(EditorBrowsableState.Always), Category("Appearance"), Description("Indicates text displayed in form caption instead of the Form.Text property.")] public string TitleText { get { return m_TitleText; } set { if (value == null) value = ""; m_TitleText = value; if (value == "") m_TitleLabel.Text = this.Text; else m_TitleLabel.Text = value; if (this.IsHandleCreated) this.RecalcSize(); this.InvalidateNonClient(false); } } /// /// Occurs when text-markup link in TitleText is clicked. /// public event MarkupLinkClickEventHandler TitleTextMarkupLinkClick; /// /// Raises TitleTextMarkupLinkClick event. /// /// Provides event arguments. protected virtual void OnTitleTextMarkupLinkClick(MarkupLinkClickEventArgs e) { MarkupLinkClickEventHandler handler = TitleTextMarkupLinkClick; if (handler != null) handler(this, e); } /// /// Gets whether custom form styling is enabled. /// /// true if custom styling is enabled otherwise false. protected override bool IsCustomFormStyleEnabled() { return base.IsCustomFormStyleEnabled() && (!(WinApi.IsGlassEnabled && EnableGlass && !DesignMode) || this.IsMdiChild); } private bool _WasMdiChild = false, _UpdateFromGlassStateOnHandleCreated = false; protected override void OnParentChanged(EventArgs e) { if (this.EnableGlass && WinApi.IsGlassEnabled) { if (this.IsHandleCreated) UpdateFormGlassState(); else if (_WasMdiChild) _UpdateFromGlassStateOnHandleCreated = true; } _WasMdiChild = IsMdiChild; } /// /// Gets or sets the font for the form caption text when CaptionVisible=true. Default value is NULL which means that system font is used. /// [Browsable(true), DefaultValue(null), Category("Caption"), Description("Indicates font for the form caption text when CaptionVisible=true.")] public Font CaptionFont { get { return m_CaptionFont; } set { m_CaptionFont = value; OnCaptionFontChanged(); } } private void OnCaptionFontChanged() { if (m_TitleLabel != null) { if (m_CaptionFont != null) m_TitleLabel.Font = m_CaptionFont; else { #if FRAMEWORK20 m_TitleLabel.Font = SystemFonts.CaptionFont; #else m_TitleLabel.Font = SystemInformation.MenuFont; #endif } this.Invalidate(m_Caption.DisplayRectangle); } InvalidateNonClient(false); } protected override void OnFontChanged(EventArgs e) { base.OnFontChanged(e); InvalidateNonClient(false); } protected override bool WindowsMessageSetIcon(ref Message m) { UpdateSystemButton(); return base.WindowsMessageSetIcon(ref m); } #endregion #region Non-client area handling /// /// Invalidates non client area of the form. /// /// Indicates whether complete form is invalidated. public void InvalidateNonClient(bool invalidateForm) { if (!BarFunctions.IsHandleValid(this)) return; const int RDW_INVALIDATE = 0x0001; const int RDW_FRAME = 0x0400; NativeFunctions.RECT r = new NativeFunctions.RECT(0, 0, this.Width, m_Caption.HeightInternal); if(invalidateForm) r = new NativeFunctions.RECT(0, 0, this.Width, this.Height); NativeFunctions.RedrawWindow(this.Handle, ref r, IntPtr.Zero, RDW_INVALIDATE | RDW_FRAME); } protected override Rectangle ReduceDisplayRectangle(Rectangle r) { return r; } protected override void AdjustBounds(ref int width, ref int height, BoundsSpecified specified) { return; //if(System.Environment.OSVersion.Version.Major == 6 && !IsCustomFormStyleEnabled()) // return; //WinApi.RECT rect = new WinApi.RECT(0, 0, width, height); //CreateParams params1 = this.CreateParams; //WinApi.AdjustWindowRectEx(ref rect, params1.Style, false, params1.ExStyle); //if ((specified & BoundsSpecified.Height) == BoundsSpecified.Height) //{ // if (System.Environment.OSVersion.Version.Major == 6 && this.FormBorderStyle != FormBorderStyle.Sizable && !this.DesignMode) // height -= (rect.Height - height - m_BorderWidth * 2 - (SystemInformation.CaptionHeight + 9)); // else if (!this.ControlBox && this.FormBorderStyle == FormBorderStyle.FixedDialog && !this.DesignMode) // height -= (rect.Height - height - m_BorderWidth * 2 - 1); // else if (!this.ControlBox && this.FormBorderStyle == FormBorderStyle.Fixed3D && !this.DesignMode) // height -= (rect.Height - height - m_BorderWidth * 2) + 2; // else if (!this.ControlBox && this.FormBorderStyle == FormBorderStyle.FixedSingle && !this.DesignMode) // height -= (rect.Height - height - m_BorderWidth * 2) + 2; // else // height -= (rect.Height - height - m_BorderWidth * 2 - (SystemInformation.CaptionHeight + 1) /*- (System.Environment.OSVersion.Version.Major == 6 ? SystemInformation.Border3DSize.Height : 0)*/); //} //if ((specified & BoundsSpecified.Width) == BoundsSpecified.Width) //{ // if (System.Environment.OSVersion.Version.Major == 6 && FormBorderStyle != FormBorderStyle.Sizable && !this.DesignMode) // width -= (rect.Width - width - m_BorderWidth * 2 - 9); // else if (!this.ControlBox && this.FormBorderStyle == FormBorderStyle.FixedDialog && !this.DesignMode) // width -= (rect.Width - width - m_BorderWidth * 2 - 2) ; // else if (!this.ControlBox && this.FormBorderStyle == FormBorderStyle.Fixed3D && !this.DesignMode) // width -= (rect.Width - width - m_BorderWidth * 2)+2; // else if (!this.ControlBox && this.FormBorderStyle == FormBorderStyle.FixedSingle && !this.DesignMode) // width -= (rect.Width - width - m_BorderWidth * 2) + 2; // else // width -= (rect.Width - width - m_BorderWidth * 2 /*- (System.Environment.OSVersion.Version.Major == 6 ? SystemInformation.Border3DSize.Width * 2 : 0)*/); //} } /// /// Gets whether Vista glass effect extension over the ribbon control caption is enabled. /// protected override bool EnableGlassExtend { get { return false; } } protected override bool WindowsMessageDwmCompositionChanged(ref Message m) { bool ret = base.WindowsMessageDwmCompositionChanged(ref m); UpdateFormControlStyle(); return ret; } protected override bool WindowsMessageNCCalcSize(ref Message m) { if (m_SystemButtons != null) m_SystemButtons.ToolWindowButtons = (this.FormBorderStyle == System.Windows.Forms.FormBorderStyle.FixedToolWindow || this.FormBorderStyle == System.Windows.Forms.FormBorderStyle.SizableToolWindow); return true; // There should be no need to do custom sizing since in designer any changes to non-client area size result in form size change // Default implementation of ribbon form does not have non-client area at all... //if (m.WParam == IntPtr.Zero) //{ // WinApi.RECT r = (WinApi.RECT)Marshal.PtrToStructure(m.LParam, typeof(WinApi.RECT)); // WinApi.RECT newClientRect = WinApi.RECT.FromRectangle(GetClientRectangle(r.ToRectangle())); // Marshal.StructureToPtr(newClientRect, m.LParam, false); // m.Result = IntPtr.Zero; //} //else //{ // WinApi.NCCALCSIZE_PARAMS csp; // csp = (WinApi.NCCALCSIZE_PARAMS)Marshal.PtrToStructure(m.LParam, typeof(WinApi.NCCALCSIZE_PARAMS)); // WinApi.WINDOWPOS pos = (WinApi.WINDOWPOS)Marshal.PtrToStructure(csp.lppos, typeof(WinApi.WINDOWPOS)); // WinApi.RECT newClientRect = WinApi.RECT.FromRectangle(GetClientRectangle(new Rectangle(pos.x, pos.y, pos.cx, pos.cy))); // csp.rgrc0 = newClientRect; // csp.rgrc1 = newClientRect; // Marshal.StructureToPtr(csp, m.LParam, false); // m.Result = new IntPtr((int)WinApi.WindowsMessages.WVR_VALIDRECTS); //} //return false; } /// /// Called when WM_NCACTIVATE message is received. /// /// Reference to message data. /// Return true to call base form implementation otherwise return false. protected override bool WindowsMessageNCActivate(ref Message m) { if (m.WParam != IntPtr.Zero) this.NonClientActive = true; else { this.NonClientActive = false; _LastNCMouseMove = DateTime.MinValue; } CreateCashedCaptionBitmap(); BaseWndProc(ref m); DrawCashedCaptionBitmap(); //m.Result = new IntPtr(1); //bool ret = base.WindowsMessageNCActivate(ref m); if (NonClientPaintEnabled) { PaintNonClientAreaBuffered(); Redraw(); } //if (this.IsMdiContainer) //{ // this.Invalidate(new Rectangle(0, 0, this.Width, 32), true); //} //else //{ // this.Invalidate(new Rectangle(0, 0, this.Width, 2), true); //} //this.Update(); return false; } #region Cashed Drawing of caption private BufferedBitmap m_CashedCaptionBitmap = null; private Point m_CashedCaptionBitmapLocation = Point.Empty; private void CreateCashedCaptionBitmap() { if (m_CashedCaptionBitmap != null) { m_CashedCaptionBitmap.Dispose(); m_CashedCaptionBitmap = null; } if (m_Caption.DisplayRectangle.Width <= 0 || m_Caption.DisplayRectangle.Height <= 0 || !this.IsHandleCreated || this.IsDisposed) return; IntPtr dc = WinApi.GetWindowDC(this.Handle); try { m_CashedCaptionBitmap = new BufferedBitmap(dc, new Rectangle(m_CashedCaptionBitmapLocation.X, m_CashedCaptionBitmapLocation.Y, m_Caption.DisplayRectangle.Width, m_Caption.DisplayRectangle.Height)); } finally { WinApi.ReleaseDC(this.Handle, dc); } PaintFormCaptionTo(m_CashedCaptionBitmap.Graphics); } private void DrawCashedCaptionBitmap() { if (m_CashedCaptionBitmap == null) return; IntPtr dc = WinApi.GetWindowDC(this.Handle); using (Graphics g = Graphics.FromHdc(dc)) { m_CashedCaptionBitmap.Render(g); } WinApi.ReleaseDC(this.Handle, dc); m_CashedCaptionBitmap.Dispose(); m_CashedCaptionBitmap = null; } #endregion protected override Rectangle GetClientRectangle(Rectangle rect) { NonClientInfo nci = GetNonClientInfo(); if (this.WindowState == FormWindowState.Minimized && this.IsMdiChild) { return new Rectangle(rect.X + nci.LeftBorder, rect.Y + nci.CaptionTotalHeight, rect.Width - (nci.LeftBorder + nci.RightBorder), 0); } return new Rectangle(rect.X + nci.LeftBorder, rect.Y + nci.CaptionTotalHeight, rect.Width - (nci.LeftBorder + nci.RightBorder), rect.Height - (nci.CaptionTotalHeight + nci.BottomBorder)); //WinApi.RECT r = new WinApi.RECT(0, 0, rect.Width, rect.Height); //CreateParams params1 = this.CreateParams; //WinApi.AdjustWindowRectEx(ref r, params1.Style, false, params1.ExStyle); //return new Rectangle(Math.Abs(r.Left), Math.Abs(r.Top), rect.Width - (r.Width - rect.Width), rect.Height - (r.Height - rect.Height)); //if (this.WindowState == FormWindowState.Maximized && this.IsMdiChild && System.Environment.OSVersion.Version.Major == 6) //{ // rect.Inflate(-(m_BorderWidth + SystemInformation.Border3DSize.Width + 3), -(m_BorderWidth + SystemInformation.Border3DSize.Height + 2)); // rect.Y += SystemInformation.CaptionHeight + 1; // rect.Height -= SystemInformation.CaptionHeight + 1; //} //else //{ // rect.Inflate(-m_BorderWidth, -m_BorderWidth); // rect.Y += SystemInformation.CaptionHeight + 1; // rect.Height -= SystemInformation.CaptionHeight + 1; //} //return rect; } protected virtual bool UseCornerSize { get { return true; } } /// /// Gets the form path for the give input bounds. /// /// Represents the form bounds. /// protected override GraphicsPath GetFormPath(Rectangle bounds) { GraphicsPath path = new GraphicsPath(); Rectangle r = bounds; if (!UseCornerSize || this.TopLeftCornerSize == 0 && TopRightCornerSize == 0) { path.AddRectangle(r); return path; } ArcData arc = ElementStyleDisplay.GetCornerArc(r, m_CornerSize, eCornerArc.TopLeft); path.AddArc(arc.X, arc.Y, arc.Width, arc.Height, arc.StartAngle, arc.SweepAngle); arc = ElementStyleDisplay.GetCornerArc(r, m_CornerSize, eCornerArc.TopRight); path.AddArc(arc.X, arc.Y, arc.Width, arc.Height, arc.StartAngle, arc.SweepAngle); path.AddLine(r.Right, r.Bottom - 3, r.Right, r.Bottom); path.AddLine(r.Right, r.Bottom, r.Right-3, r.Bottom); path.AddLine(r.X + 3, r.Bottom, r.X, r.Bottom); path.AddLine(r.X, r.Bottom, r.X, r.Bottom - 3); path.CloseAllFigures(); return path; } private Point GetMousePosition() { if (this.IsDisposed) return Point.Empty; Point p = this.PointToClient(Control.MousePosition); if (WindowState != FormWindowState.Minimized) { p.X += m_Caption.PaddingLeft; //m_BorderWidth; p.Y += m_Caption.HeightInternal; } return p; } private Timer _CaptionNCMouseTimer = null; private bool CaptionNCMouseInside { get { return _CaptionNCMouseInside; } set { if (_CaptionNCMouseInside != value) { _CaptionNCMouseInside = value; if (!_CaptionNCMouseInside) { StopCaptionNCMouseTimer(); m_Caption.InternalMouseLeave(); } else StartCaptionNCMouseTimer(); } } } private void StartCaptionNCMouseTimer() { if (_CaptionNCMouseTimer != null) return; _CaptionNCMouseTimer = new Timer(); _CaptionNCMouseTimer.Interval = 300; _CaptionNCMouseTimer.Tick += new EventHandler(NCMouseTimerTick); _CaptionNCMouseTimer.Start(); } private void NCMouseTimerTick(object sender, EventArgs e) { Point p = GetMousePosition(); if (!m_Caption.Bounds.Contains(p)) { CaptionNCMouseInside = false; } } private void StopCaptionNCMouseTimer() { Timer timer = _CaptionNCMouseTimer; _CaptionNCMouseTimer = null; if (timer == null) return; timer.Stop(); timer.Tick -= NCMouseTimerTick; timer.Dispose(); } private DateTime _LastNCMouseMove = DateTime.MinValue; private bool _CaptionNCMouseInside = false; protected override bool WindowsMessageNCMouseMove(ref Message m) { Point p = GetMousePosition(); m_Caption.InternalMouseMove(new MouseEventArgs(Control.MouseButtons, 0, p.X, p.Y, 0)); CaptionNCMouseInside = true; if (m_SystemIcon.Tooltip != "" && m_Caption.HotSubItem == m_SystemIcon) { SetupHoverTimer(); } if (Control.MouseButtons == MouseButtons.Left) { BaseItem item = m_Caption.ItemAtLocation(p.X, p.Y); if (item == m_TitleLabel && m_Caption.ItemAtLocation(_NcMouseDownPoint.X, _NcMouseDownPoint.Y)==item) { if (this.WindowState == FormWindowState.Normal || this.WindowState == FormWindowState.Minimized && this.IsMdiChild) { const int HTCAPTION = 2; byte[] bx = BitConverter.GetBytes(p.X); byte[] by = BitConverter.GetBytes(p.Y); byte[] blp = new byte[] { bx[0], bx[1], by[0], by[1] }; int lParam = BitConverter.ToInt32(blp, 0); this.Capture = false; PopupManager.CloseAllPopups(); NativeFunctions.SendMessage(this.Handle, NativeFunctions.WM_SYSCOMMAND, NativeFunctions.SC_MOVE + HTCAPTION, lParam); return false; } else if (this.WindowState == FormWindowState.Maximized && BarFunctions.IsWindows7 && _IsActive) { if (_LastNCMouseMove != DateTime.MinValue) { if (DateTime.Now.Subtract(_LastNCMouseMove).TotalSeconds > 0) { this.WindowState = FormWindowState.Normal; _LastNCMouseMove = DateTime.MinValue; } } else _LastNCMouseMove = DateTime.Now; } } } return true; } private bool _IsActive = false; protected override void OnActivated(EventArgs e) { _IsActive = true; base.OnActivated(e); } protected override bool WindowsMessageNCMouseLeave(ref Message m) { StopHoverTimer(); m_Caption.InternalMouseLeave(); CaptionNCMouseInside = false; return true; } private Timer m_HoverTimer = null; private void SetupHoverTimer() { if (m_HoverTimer != null) { m_HoverTimer.Stop(); m_HoverTimer.Start(); return; } m_HoverTimer = new Timer(); #if FRAMEWORK20 m_HoverTimer.Interval = Math.Max(500, SystemInformation.MouseHoverTime); #else m_HoverTimer.Interval = 600; #endif m_HoverTimer.Tick += new EventHandler(HoverTimer_Tick); m_HoverTimer.Start(); } private void HoverTimer_Tick(object sender, EventArgs e) { m_HoverTimer.Stop(); if (m_SystemIcon != null && m_SystemIcon.Tooltip != "" && m_Caption != null && m_Caption.HotSubItem == m_SystemIcon) { m_Caption.InternalMouseHover(); } StopHoverTimer(); } private void StopHoverTimer() { Timer t = m_HoverTimer; if (m_HoverTimer != null) { m_HoverTimer = null; t.Stop(); t.Tick -= new EventHandler(HoverTimer_Tick); } } protected override bool WindowsMessageNCHitTest(ref Message m) { // Get position being tested... int x = WinApi.LOWORD(m.LParam); int y = WinApi.HIWORD(m.LParam); Point p = PointToClient(new Point(x, y)); if (this.WindowState != FormWindowState.Minimized) { p.X += m_BorderWidth; p.Y += m_BorderWidth + SystemInformation.CaptionHeight; } int borderSize = m_BorderWidth; int cornerPadding = 2; if (IsSizable) { #if FRAMEWORK20 if (this.RightToLeftLayout && this.RightToLeft == RightToLeft.Yes) #else if (this.RightToLeft == RightToLeft.Yes) #endif { // Top-left corner Rectangle r = new Rectangle(this.Width - (m_CornerSize + cornerPadding), 0, (m_CornerSize + cornerPadding), (m_CornerSize + cornerPadding)); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.TopLeftSizeableCorner); return false; } // Top Right r = new Rectangle(0, 0, (m_CornerSize + cornerPadding), (m_CornerSize + cornerPadding)); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.TopRightSizeableCorner); return false; } // Bottom Left r = new Rectangle(this.Width - (m_CornerSize + cornerPadding), this.Height - (m_CornerSize + cornerPadding), (m_CornerSize + cornerPadding), (m_CornerSize + cornerPadding)); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.BottomLeftSizeableCorner); return false; } // Bottom Right r = new Rectangle(0, this.Height - (m_CornerSize + cornerPadding), (m_CornerSize + cornerPadding), (m_CornerSize + cornerPadding)); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.BottomRightSizeableCorner); return false; } // Left border r = new Rectangle(this.Width - borderSize, 0, borderSize, this.Height); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.LeftSizeableBorder); return false; } // Right border r = new Rectangle(0, 0, borderSize, this.Height); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.RightSizeableBorder); return false; } } else { // Top-left corner Rectangle r = new Rectangle(0, 0, m_CornerSize + cornerPadding, m_CornerSize + cornerPadding); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.TopLeftSizeableCorner); return false; } // Top Right r = new Rectangle(this.Width - (m_CornerSize + cornerPadding), 0, m_CornerSize + cornerPadding, m_CornerSize + cornerPadding); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.TopRightSizeableCorner); return false; } // Bottom Left r = new Rectangle(0, this.Height - m_CornerSize, m_CornerSize + cornerPadding, m_CornerSize + cornerPadding); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.BottomLeftSizeableCorner); return false; } // Bottom Right r = new Rectangle(this.Width - m_CornerSize, this.Height - m_CornerSize, m_CornerSize + cornerPadding, m_CornerSize + cornerPadding); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.BottomRightSizeableCorner); return false; } // Top border r = new Rectangle(0, 0, this.Width, borderSize); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.TopSizeableBorder); return false; } // Bottom border r = new Rectangle(0, this.Height - borderSize, this.Width, borderSize); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.BottomSizeableBorder); return false; } // Left border r = new Rectangle(0, 0, borderSize, this.Height); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.LeftSizeableBorder); return false; } // Right border r = new Rectangle(this.Width - borderSize, 0, borderSize, this.Height); if (r.Contains(p)) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.RightSizeableBorder); return false; } } } BaseItem item=m_Caption.ItemAtLocation(p.X, p.Y); if (item == m_TitleLabel) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.TitleBar); return false; } else if (item == m_SystemIcon) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.Menu); return false; } else if (item == m_SystemButtons) { SystemButton btn = m_SystemButtons.GetButton(p.X, p.Y); if (btn == SystemButton.Minimize) m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.MinimizeButton); else if (btn == SystemButton.Maximize) m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.MaximizeButton); else if (btn == SystemButton.Close) m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.CloseButton); else if (btn == SystemButton.Restore) m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.ReduceButton); else if (btn == SystemButton.Help) m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.HelpButton); return false; } else if (item is ButtonItem) { m.Result = new IntPtr((int)WinApi.WindowHitTestRegions.Object); return false; } return true; } private Point _NcMouseDownPoint = Point.Empty; protected override bool WindowsMessageNCLButtonDown(ref Message m) { int wParamInt = WinApi.ToInt(m.WParam); if (wParamInt == (int)WinApi.WindowHitTestRegions.TopSizeableBorder || wParamInt == (int)WinApi.WindowHitTestRegions.TopRightSizeableCorner) return true; Point p = GetMousePosition(); _NcMouseDownPoint = p; m_Caption.InternalMouseDown(new MouseEventArgs(MouseButtons.Left, 0, p.X, p.Y, 0)); BaseItem item = m_Caption.ItemAtLocation(p.X, p.Y); if (item != null && (item == m_SystemButtons || item == m_TitleLabel || p.X >= m_SystemButtons.DisplayRectangle.X && p.X <= m_SystemButtons.DisplayRectangle.Right)) { if (!this.NonClientActive) this.Activate(); return false; } return true; } protected override bool WindowsMessageNCLButtonUp(ref Message m) { Point p = GetMousePosition(); BaseItem item = m_Caption.ItemAtLocation(p.X, p.Y); m_Caption.InternalMouseUp(new MouseEventArgs(MouseButtons.Left, 0, p.X, p.Y, 0)); if (p == _NcMouseDownPoint && !string.IsNullOrEmpty(this.TitleText)) m_Caption.InternalClick(MouseButtons.Left, p); if (item == m_SystemButtons) return false; return true; } private void SystemButtons_Click(object sender, EventArgs e) { SystemCaptionItem sci = sender as SystemCaptionItem; Form frm = this; if (sci.MouseDownButton == SystemButton.Minimize) { NativeFunctions.PostMessage(frm.Handle, NativeFunctions.WM_SYSCOMMAND, NativeFunctions.SC_MINIMIZE, 0); m_Caption.InternalMouseLeave(); } else if (sci.MouseDownButton == SystemButton.Maximize) { NativeFunctions.PostMessage(frm.Handle, NativeFunctions.WM_SYSCOMMAND, NativeFunctions.SC_MAXIMIZE, 0); m_Caption.InternalMouseLeave(); } else if (sci.MouseDownButton == SystemButton.Restore) { NativeFunctions.PostMessage(frm.Handle, NativeFunctions.WM_SYSCOMMAND, NativeFunctions.SC_RESTORE, 0); m_Caption.InternalMouseLeave(); } else if (sci.MouseDownButton == SystemButton.Close) { NativeFunctions.PostMessage(frm.Handle, NativeFunctions.WM_SYSCOMMAND, NativeFunctions.SC_CLOSE, 0); m_Caption.InternalMouseLeave(); } else if (sci.MouseDownButton == SystemButton.Help) { NativeFunctions.PostMessage(frm.Handle, NativeFunctions.WM_SYSCOMMAND, NativeFunctions.SC_CONTEXTHELP, 0); m_Caption.InternalMouseLeave(); } } private void SystemButtons_MouseEnter(object sender, EventArgs e) { if (m_MouseTimer == null) SetupMouseTimer(); } private void SetupMouseTimer() { m_MouseTimer = new Timer(); m_MouseTimer.Interval = 200; m_MouseTimer.Tick += new EventHandler(MouseTimer_Tick); m_MouseTimer.Start(); } private void MouseTimer_Tick(object sender, EventArgs e) { Point p = GetMousePosition(); if (m_SystemButtons != null && !m_SystemButtons.DisplayRectangle.Contains(p)) { m_MouseTimer.Enabled = false; StopMouseTimer(); m_SystemButtons.InternalMouseLeave(); } } private void StopMouseTimer() { if (m_MouseTimer != null) { m_MouseTimer.Enabled = false; m_MouseTimer.Tick -= new EventHandler(MouseTimer_Tick); m_MouseTimer.Dispose(); m_MouseTimer = null; } } protected override void OnVisibleChanged(EventArgs e) { if (!this.Visible) { StopMouseTimer(); StopCaptionNCMouseTimer(); } base.OnVisibleChanged(e); } protected override void OnClosed(EventArgs e) { this.StopMouseTimer(); base.OnClosed(e); } protected override void OnResize(EventArgs e) { RecalcSize(); base.OnResize(e); } internal void RecalcSize() { if (!this.IsHandleCreated) return; if (m_Caption != null) { NonClientInfo nci = GetNonClientInfo(); m_Caption.LeftInternal = 1; m_Caption.TopInternal = 0; m_Caption.PaddingLeft = Dpi.DescaleWidth(nci.LeftBorder) - 1; m_Caption.PaddingRight = Dpi.DescaleWidth(nci.RightBorder); m_Caption.PaddingTop = Dpi.DescaleHeight(nci.BottomBorder)/2 + 1; m_Caption.WidthInternal = this.Width - 1; m_Caption.HeightInternal = nci.CaptionTotalHeight - nci.BottomBorder / 2; m_Caption.IsRightToLeft = (this.RightToLeft == RightToLeft.Yes); m_Caption.OverflowEnabled = false; if (m_TitleLabel != null) { m_TitleLabel.Height = Dpi.DescaleHeight(m_Caption.HeightInternal - nci.BottomBorder-2); if (m_TitleText != "") m_TitleLabel.Width = 0; else m_TitleLabel.Width = 16; m_TitleLabel.TextLineAlignment = StringAlignment.Center; } m_Caption.RecalcSize(); m_Caption.HeightInternal = nci.CaptionTotalHeight; if (m_SystemIcon != null) m_SystemIcon.TopInternal += (m_Caption.HeightInternal - m_SystemIcon.HeightInternal - nci.BottomBorder * 2) / 2 + 1; m_TitleLabel.TopInternal+=Dpi.Height1; if (this.WindowState == FormWindowState.Maximized) { if (m_SystemIcon != null) m_SystemIcon.TopInternal += Dpi.Height2; m_TitleLabel.TopInternal += Dpi.Height2; } if (FormBorderStyle != FormBorderStyle.FixedSingle) { m_SystemButtons.TopInternal -= Dpi.Height1; } } if (this.WindowState == FormWindowState.Maximized || this.WindowState == FormWindowState.Minimized) m_SystemButtons.RestoreEnabled = true; else m_SystemButtons.RestoreEnabled = false; } protected override void OnMouseLeave(EventArgs e) { m_Caption.InternalMouseLeave(); base.OnMouseLeave(e); } protected override void OnDeactivate(EventArgs e) { _IsActive = false; base.OnDeactivate(e); StopMouseTimer(); m_Caption.InternalMouseLeave(); } protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); UpdateFormText(); } /// /// Updates the form title bar text. Usually calling this method is not necessary but under certain conditions when form is used as MDI parent form /// calling it to update combined text is necessary. /// public void UpdateFormText() { bool changed = false; if (m_TitleLabel != null && m_TitleText == "") { changed = m_TitleLabel.Text != this.Text; m_TitleLabel.Text = this.Text; } if (changed) { if (this.IsMdiChild && this.MdiParent is RibbonForm) { ((RibbonForm)this.MdiParent).InvalidateRibbonCaption(); } InvalidateNonClient(false); } } protected override void OnControlRemoved(ControlEventArgs e) { if (e.Control is MdiClient) { e.Control.ControlRemoved -= MdiClientControlRemoved; e.Control.ControlAdded -= MdiClientControlAdded; e.Control.HandleCreated -= MdiClientHandleCreated; CleanupMdiClientHandler(); } base.OnControlRemoved(e); } protected override void OnControlAdded(ControlEventArgs e) { if (e.Control is MdiClient) { e.Control.ControlRemoved += MdiClientControlRemoved; e.Control.ControlAdded += MdiClientControlAdded; e.Control.HandleCreated += MdiClientHandleCreated; SetupMdiClientHandler((MdiClient)e.Control); } base.OnControlAdded(e); } private void CleanupMdiClientHandler() { if (_MdiHandler != null) { _MdiHandler.MdiSetMenu -= this.OnMdiSetMenu; _MdiHandler.ReleaseHandle(); _MdiHandler = null; } } private void SetupMdiClientHandler(MdiClient mdiClient) { if (mdiClient.IsHandleCreated) SubclassMdiClient(mdiClient); } private bool _HideMdiSystemMenu = true; [DefaultValue(true), Browsable(false)] public bool HideMdiSystemMenu { get { return _HideMdiSystemMenu; } set { _HideMdiSystemMenu = value; } } private void OnMdiSetMenu(object sender, System.EventArgs e) { MDIClientMsgHandler m = sender as MDIClientMsgHandler; if (_HideMdiSystemMenu) m.EatMessage = true; } private MDIClientMsgHandler _MdiHandler = null; private void SubclassMdiClient(MdiClient client) { CleanupMdiClientHandler(); _MdiHandler = new MDIClientMsgHandler(); _MdiHandler.MdiSetMenu += new EventHandler(this.OnMdiSetMenu); _MdiHandler.AssignHandle(client.Handle); } private void MdiClientHandleCreated(object sender, EventArgs e) { SubclassMdiClient((MdiClient)sender); } private void MdiClientControlRemoved(object sender, ControlEventArgs e) { e.Control.Resize -= new EventHandler(MdiChildResize); } private void MdiClientControlAdded(object sender, ControlEventArgs e) { e.Control.Resize += new EventHandler(MdiChildResize); } protected override void OnMdiChildActivate(EventArgs e) { UpdateFormText(); base.OnMdiChildActivate(e); } private void MdiChildResize(object sender, EventArgs e) { InvokeDelayed(new MethodInvoker(delegate { UpdateFormText(); })); } protected override void OnStyleChanged(EventArgs e) { UpdateSystemButton(); InvalidateNonClient(false); base.OnStyleChanged(e); } protected override void OnSystemColorsChanged(EventArgs e) { OnCaptionFontChanged(); base.OnSystemColorsChanged(e); } protected override void OnHandleCreated(EventArgs e) { UpdateSystemButton(); if (_UpdateFromGlassStateOnHandleCreated) { _UpdateFromGlassStateOnHandleCreated = false; UpdateFormGlassState(); } base.OnHandleCreated(e); } protected override void OnRenderFormIconChanged(bool oldValue, bool newValue) { UpdateSystemButton(); base.OnRenderFormIconChanged(oldValue, newValue); } protected override void OnRenderFormTextChanged(bool oldValue, bool newValue) { UpdateSystemButton(); base.OnRenderFormTextChanged(oldValue, newValue); } private void UpdateSystemButton() { if (m_SystemButtons != null) { m_SystemButtons.MinimizeVisible = this.MinimizeBox; m_SystemButtons.RestoreMaximizeVisible = this.MaximizeBox; m_SystemButtons.Visible = this.ControlBox; m_SystemIcon.Visible = this.ControlBox; m_SystemButtons.HelpVisible = this.HelpButton; } #if FRAMEWORK20 if (m_SystemIcon != null) { m_SystemIcon.Visible = this.ShowIcon && this.RenderFormIcon; } #endif if (this.FormBorderStyle == FormBorderStyle.FixedDialog) m_SystemIcon.Visible = false; if (m_TitleLabel != null) m_TitleLabel.IsRendered = this.RenderFormText; if (this.IsHandleCreated) RecalcSize(); } /// /// Gets or sets the icon for the form. /// [Browsable(true)] public new Icon Icon { get { return base.Icon; } set { base.Icon = value; m_SystemIcon.Icon = value; UpdateSystemButton(); } } /// /// Gets or sets a value indicating whether the form enables auto scrolling. /// [Browsable(false), DefaultValue(false)] public override bool AutoScroll { get { return base.AutoScroll; } set { base.AutoScroll = value; } } protected internal bool CloseEnabled { get { return m_SystemButtons.CloseEnabled; } set { if (m_SystemButtons.CloseEnabled != value) { m_SystemButtons.CloseEnabled = value; OnCloseEnabledChanged(); } } } /// /// Called when CloseEnabled property value has changed. /// protected virtual void OnCloseEnabledChanged() { if (!BarFunctions.IsHandleValid(this)) return; IntPtr handle = this.Handle; IntPtr menuHandle = NativeFunctions.GetSystemMenu(handle, false); uint flags = 0; const uint MF_BYCOMMAND = 0x0; const uint MF_GRAYED = 0x1; if (CloseEnabled) { flags = MF_BYCOMMAND | ~MF_GRAYED; } else { flags = MF_BYCOMMAND | MF_GRAYED; } WinApi.EnableMenuItem(menuHandle, NativeFunctions.SC_CLOSE, flags); } /// /// Gets or sets the Office 2007 Renderer global Color Table. Setting this property will affect all controls in application that are using Office 2007 global renderer. /// [Browsable(false), Category("Appearance"), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Description("Indicates the Office 2007 Renderer global Color Table.")] public Rendering.eOffice2007ColorScheme Office2007ColorTable { get { Rendering.Office2007Renderer r = this.GetRenderer() as Rendering.Office2007Renderer; if (r != null) return r.ColorTable.InitialColorScheme; return Rendering.eOffice2007ColorScheme.Blue; } set { #if (FRAMEWORK20) RibbonPredefinedColorSchemes.ChangeOffice2007ColorTable(value); #else RibbonPredefinedColorSchemes.ChangeOffice2007ColorTable(this, value); #endif } } #endregion #region Non-client area painting /// /// Gets whether client border is painted in OnPaint method. /// protected override bool PaintClientBorder { get { return false; } } /// /// Gets whether ribbon control caption is painted /// protected override bool PaintRibbonCaption { get { return false; } } /// /// Paints the non-client area of the form. /// protected override bool WindowsMessageNCPaint(ref Message m) { m.Result = IntPtr.Zero; if (this.IsHandleCreated && !this.IsDisposed && this.Handle != IntPtr.Zero && this.EnableCustomStyle && NonClientPaintEnabled) { PaintNonClientAreaBuffered(); } return false; } protected virtual void PaintNonClientAreaBuffered() { IntPtr dc = WinApi.GetWindowDC(this.Handle); try { using (Graphics g = Graphics.FromHdc(dc)) { PaintNonClientAreaBuffered(g); } } finally { WinApi.ReleaseDC(this.Handle, dc); } } protected virtual void PaintNonClientAreaBuffered(Graphics targetGraphics) { BufferedBitmap bmp = new BufferedBitmap(targetGraphics, new Rectangle(0,0,this.Width, this.Height)); try { bmp.Graphics.SetClip(this.GetClientRectangle(new Rectangle(0, 0, this.Width, this.Height)), CombineMode.Exclude); PaintNonClientArea(bmp.Graphics); bmp.Render(targetGraphics, this.GetClientRectangle(new Rectangle(0, 0, this.Width, this.Height))); } finally { bmp.Dispose(); } } protected virtual Rectangle GetInnerFormBounds() { //NonClientInfo nci = GetNonClientInfo(); //return new Rectangle(nci.LeftBorder, nci.BottomBorder, this.Width - (nci.LeftBorder + nci.RightBorder + 1), this.Height - nci.BottomBorder * 2); Rectangle r = new Rectangle(1, 1, this.Width - 3, this.Height - 1); #if FRAMEWORK20 if (this.RightToLeftLayout) r = new Rectangle(1, 1, this.Width - 2, this.Height - 1); #endif return r; } protected virtual void PaintNonClientArea(Graphics g) { NonClientInfo nci = GetNonClientInfo(); PaintFormBorder(g, nci.LeftBorder, false); //PaintFormCaptionTo(g); Rectangle r = GetInnerFormBounds(); if (m_CornerSize > 1 && UseCornerSize) m_CornerSize--; using (GraphicsPath path = GetFormPath(r)) { if (m_CornerSize > 0 && UseCornerSize) m_CornerSize++; Region reg = new Region(); reg.MakeEmpty(); reg.Union(path); // Widen path for the border... path.Widen(SystemPens.Control); Region r2 = new Region(path); reg.Union(path); g.SetClip(reg, CombineMode.Replace); PaintFormCaptionTo(g); } g.ResetClip(); } private bool m_AntiAlias = true; /// /// Gets or sets whether anti-alias smoothing is used while painting form caption. Default value is true. /// [DefaultValue(true), Browsable(true), Category("Appearance"), Description("Gets or sets whether anti-aliasing is used while painting form caption.")] public bool CaptionAntiAlias { get { return m_AntiAlias; } set { if (m_AntiAlias != value) { m_AntiAlias = value; } } } private void PaintFormCaptionTo(Graphics g) { ItemPaintArgs p = GetItemPaintArgs(g); SmoothingMode sm = g.SmoothingMode; System.Drawing.Text.TextRenderingHint th = g.TextRenderingHint; if (m_AntiAlias) { g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // Setting this disables the Clear-Type rendering on other controls on form. Do not do it. //g.TextRenderingHint = DisplayHelp.AntiAliasTextRenderingHint; } if (p.Renderer != null) { if (p.Renderer is Office2007Renderer) { if (NonClientActive) m_TitleLabel.ForeColor = ((Office2007Renderer)p.Renderer).ColorTable.Form.Active.CaptionText; else m_TitleLabel.ForeColor = ((Office2007Renderer)p.Renderer).ColorTable.Form.Inactive.CaptionText; } p.Renderer.DrawFormCaptionBackground(new FormCaptionRendererEventArgs(g, m_Caption.DisplayRectangle, this)); } int nciLeftBorder = 0; if (this.BackgroundImage != null && this.BackgroundImageUnderCaption || StyleManager.IsMetro(StyleManager.Style)) { NonClientInfo nci = GetNonClientInfo(); nciLeftBorder = nci.LeftBorder; } PaintNonClientBackgroundImage(g, this.ClientRectangle); if (this.BackgroundImage != null && this.BackgroundImageUnderCaption || StyleManager.IsMetro(StyleManager.Style)) { PaintFormBorder(g, nciLeftBorder, true); } m_Caption.Paint(p); //if (m_AntiAlias) { g.SmoothingMode = sm; //g.TextRenderingHint = th; } } private ItemPaintArgs GetItemPaintArgs(Graphics g) { ItemPaintArgs pa = new ItemPaintArgs(null, this, g, GetColorScheme()); pa.Renderer = this.GetRenderer(); return pa; } protected virtual ColorScheme GetColorScheme() { if (m_ColorScheme == null) { if (GlobalManager.Renderer is Office2007Renderer) return ((Office2007Renderer)GlobalManager.Renderer).ColorTable.LegacyColors; return new ColorScheme(eDotNetBarStyle.Office2007); } else return m_ColorScheme; } private Rendering.BaseRenderer m_DefaultRenderer = null; private Rendering.BaseRenderer m_Renderer = null; private eRenderMode m_RenderMode = eRenderMode.Global; /// /// Returns the renderer control will be rendered with. /// /// The current renderer. public virtual Rendering.BaseRenderer GetRenderer() { if (m_RenderMode == eRenderMode.Global && Rendering.GlobalManager.Renderer != null) return Rendering.GlobalManager.Renderer; else if (m_RenderMode == eRenderMode.Custom && m_Renderer != null) return m_Renderer; if (m_DefaultRenderer == null) m_DefaultRenderer = new Rendering.Office2007Renderer(); return m_Renderer; } /// /// Gets or sets the redering mode used by control. Default value is eRenderMode.Global which means that static GlobalManager.Renderer is used. If set to Custom then Renderer property must /// also be set to the custom renderer that will be used. /// [Browsable(false), DefaultValue(eRenderMode.Global)] public eRenderMode RenderMode { get { return m_RenderMode; } set { if (m_RenderMode != value) { m_RenderMode = value; this.Invalidate(true); } } } /// /// Gets or sets the custom renderer used by the items on this control. RenderMode property must also be set to eRenderMode.Custom in order renderer /// specified here to be used. /// [Browsable(false), DefaultValue(null)] public DevComponents.DotNetBar.Rendering.BaseRenderer Renderer { get { return m_Renderer; } set { m_Renderer = value; } } /// /// Gets or sets the tooltip for the form system icon. /// [Browsable(true), DefaultValue(""), Description("Indicates tooltip for the form system icon."), Localizable(true)] public string IconTooltip { get { return m_SystemIcon.Tooltip; } set { m_SystemIcon.Tooltip = value; } } ///// ///// Gets the array of LinearGradientColorTable objects that describe the border colors. The colors with index 0 is used as the outer most ///// border. ///// ///// Array of LinearGradientColorTable //protected override LinearGradientColorTable[] GetBorderColors() //{ // LinearGradientColorTable[] colors = base.GetBorderColors(); // RECT rect = new RECT(0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height); // CreateParams params1 = this.CreateParams; // AdjustWindowRectEx(ref rect, params1.Style, false, params1.ExStyle); // int borderWidth = Math.Abs(rect.Left); // if (colors.Length < borderWidth) // { // LinearGradientColorTable[] cn = new LinearGradientColorTable[borderWidth]; // LinearGradientColorTable innerColor = colors[colors.Length-1]; // colors.CopyTo(cn, 0); // for (int i = colors.Length; i < borderWidth; i++) // cn[i] = new LinearGradientColorTable(innerColor.Start, innerColor.End, innerColor.GradientAngle); // colors = cn; // } // return colors; //} #endregion #region Windows API #endregion } public class Office2007Form : OfficeForm { } internal class NonClientInfo { public int CaptionTotalHeight = 0; public int BottomBorder = 0; public int LeftBorder = 0; public int RightBorder = 0; } }