/// <summary> /// Gets the button paint indices. /// </summary> /// <param name="button">The button paint info.</param> /// <param name="active">A value indicating whether the button is active.</param> /// <param name="buttonIndex">Index of the button icon image strip.</param> /// <param name="rendererIndex">Index of the button background image strip.</param> private static void GetButtonData(CaptionButtonPaintData button, bool active, out int buttonIndex, out int rendererIndex) { if (!button.Enabled) { rendererIndex = -1; buttonIndex = 4; } else if (button.Pressed) { buttonIndex = active ? 2 : 3; rendererIndex = 1; } else if (button.Hovered) { buttonIndex = active ? 1 : 3; rendererIndex = 0; } else { buttonIndex = active ? 0 : 3; rendererIndex = -1; } }
/// <summary> /// Redraws the non client area. /// </summary> /// <param name="invalidateBuffer">if set to <c>true</c> the buffer is invalidated.</param> /// <returns>true if the original painting should be suppressed otherwise false.</returns> private bool NcPaint(bool invalidateBuffer) { if (!IsProcessNcArea) { return(false); } bool result = false; IntPtr hdc = (IntPtr)0; Graphics g = null; Region region = null; IntPtr hrgn = (IntPtr)0; try { // no drawing needed if (_parentForm.MdiParent != null && _parentForm.WindowState == FormWindowState.Maximized) { _currentCacheSize = Size.Empty; return(false); } // prepare image bounds Size borderSize = FormExtenders.GetBorderSize(_parentForm); int captionHeight = FormExtenders.GetCaptionHeight(_parentForm); RECT rectScreen = new RECT(); Win32Api.GetWindowRect(_parentForm.Handle, ref rectScreen); Rectangle rectBounds = rectScreen.ToRectangle(); rectBounds.Offset(-rectBounds.X, -rectBounds.Y); // prepare clipping Rectangle rectClip = rectBounds; region = new Region(rectClip); rectClip.Inflate(-borderSize.Width, -borderSize.Height); rectClip.Y += captionHeight; rectClip.Height -= captionHeight; // create graphics handle hdc = Win32Api.GetDCEx(_parentForm.Handle, (IntPtr)0, (DCXFlags.DCX_CACHE | DCXFlags.DCX_CLIPSIBLINGS | DCXFlags.DCX_WINDOW)); g = Graphics.FromHdc(hdc); // Apply clipping region.Exclude(rectClip); hrgn = region.GetHrgn(g); Win32Api.SelectClipRgn(hdc, hrgn); // create new buffered graphics if needed if (_bufferGraphics == null || _currentCacheSize != rectBounds.Size) { if (_bufferGraphics != null) { _bufferGraphics.Dispose(); } _bufferGraphics = _bufferContext.Allocate(g, new Rectangle(0, 0, rectBounds.Width, rectBounds.Height)); _currentCacheSize = rectBounds.Size; invalidateBuffer = true; } if (invalidateBuffer) { // Create painting meta data for form SkinningFormPaintData paintData = new SkinningFormPaintData(_bufferGraphics.Graphics, rectBounds) { Borders = borderSize, CaptionHeight = captionHeight, Active = _formIsActive, HasMenu = FormExtenders.HasMenu(_parentForm), IconSize = SystemInformation.SmallIconSize, IsSmallCaption = captionHeight == SystemInformation.ToolWindowCaptionHeight, Text = _parentForm.Text }; // create painting meta data for caption buttons if (_captionButtons.Count > 0) { paintData.CaptionButtons = new CaptionButtonPaintData[_captionButtons.Count]; for (int i = 0; i < _captionButtons.Count; i++) { CaptionButton button = _captionButtons[i]; CaptionButtonPaintData buttonData = new CaptionButtonPaintData(_bufferGraphics.Graphics, button.Bounds) { Pressed = button.Pressed, Hovered = button.Hovered, Enabled = button.Enabled, HitTest = button.HitTest }; paintData.CaptionButtons[i] = buttonData; } } // paint result = _manager.CurrentSkin.OnNcPaint(_parentForm, paintData); } // render buffered graphics if (_bufferGraphics != null) { _bufferGraphics.Render(g); } } catch (Exception) {// error drawing result = false; } // cleanup data if (hdc != (IntPtr)0) { Win32Api.SelectClipRgn(hdc, (IntPtr)0); Win32Api.ReleaseDC(_parentForm.Handle, hdc); } if (region != null && hrgn != (IntPtr)0) { region.ReleaseHrgn(hrgn); } if (region != null) { region.Dispose(); } if (g != null) { g.Dispose(); } return(result); }