Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / WinForms / Managed / System / WinForms / ButtonInternal / CheckBoxBaseAdapter.cs / 1305376 / CheckBoxBaseAdapter.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Windows.Forms.ButtonInternal { using System; using System.Diagnostics; using System.Drawing; using System.Windows.Forms.Internal; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Drawing.Text; using System.Windows.Forms; using System.Windows.Forms.VisualStyles; using System.Runtime.InteropServices; internal abstract class CheckBoxBaseAdapter : CheckableControlBaseAdapter { protected const int flatCheckSize = 11; [ThreadStatic] private static Bitmap checkImageChecked = null; [ThreadStatic] private static Color checkImageCheckedBackColor = Color.Empty; [ThreadStatic] private static Bitmap checkImageIndeterminate = null; [ThreadStatic] private static Color checkImageIndeterminateBackColor = Color.Empty; internal CheckBoxBaseAdapter(ButtonBase control) : base(control) {} protected new CheckBox Control { get { return ((CheckBox)base.Control); } } #region Drawing Helpers protected void DrawCheckFlat(PaintEventArgs e, LayoutData layout, Color checkColor, Color checkBackground, Color checkBorder, ColorData colors) { Rectangle bounds = layout.checkBounds; // Removed subtracting one for Width and Height. In Everett we needed to do this, // since we were using GDI+ to draw the border. Now that we are using GDI, // we should not do before drawing the border. if (!layout.options.everettButtonCompat) { bounds.Width--; bounds.Height--; } using (WindowsGraphics wg = WindowsGraphics.FromGraphics( e.Graphics )) { using(WindowsPen pen = new WindowsPen(wg.DeviceContext, checkBorder)){ wg.DrawRectangle(pen, bounds); } // Now subtract, since the rest of the code is like Everett. if (layout.options.everettButtonCompat) { bounds.Width--; bounds.Height--; } bounds.Inflate(-1, -1); } if (Control.CheckState == CheckState.Indeterminate) { bounds.Width++; bounds.Height++; DrawDitheredFill(e.Graphics, colors.buttonFace, checkBackground, bounds); } else { using( WindowsGraphics wg = WindowsGraphics.FromGraphics( e.Graphics )) { using (WindowsBrush brush = new WindowsSolidBrush(wg.DeviceContext, checkBackground)) { // Even though we are using GDI here as opposed to GDI+ in Everett, we still need to add 1. bounds.Width++; bounds.Height++; wg.FillRectangle(brush, bounds); } } } DrawCheckOnly(e, layout, colors, checkColor, checkBackground, true); } // used by DataGridViewCheckBoxCell internal static void DrawCheckBackground(bool controlEnabled, CheckState controlCheckState, Graphics g, Rectangle bounds, Color checkColor, Color checkBackground, bool disabledColors, ColorData colors) { using ( WindowsGraphics wg = WindowsGraphics.FromGraphics( g )) { WindowsBrush brush; if (!controlEnabled && disabledColors) { brush = new WindowsSolidBrush(wg.DeviceContext, SystemColors.Control); } else if (controlCheckState == CheckState.Indeterminate && checkBackground == SystemColors.Window && disabledColors) { Color comboColor = SystemInformation.HighContrast ? SystemColors.ControlDark : SystemColors.Control; byte R = (byte)((comboColor.R + SystemColors.Window.R) / 2); byte G = (byte)((comboColor.G + SystemColors.Window.G) / 2); byte B = (byte)((comboColor.B + SystemColors.Window.B) / 2); brush = new WindowsSolidBrush(wg.DeviceContext, Color.FromArgb(R, G, B)); } else { brush = new WindowsSolidBrush(wg.DeviceContext, checkBackground); } try { wg.FillRectangle(brush, bounds); } finally { if (brush != null) { brush.Dispose(); } } } } protected void DrawCheckBackground(PaintEventArgs e, Rectangle bounds, Color checkColor, Color checkBackground, bool disabledColors, ColorData colors) { // area behind check // if (Control.CheckState == CheckState.Indeterminate) { DrawDitheredFill(e.Graphics, colors.buttonFace, checkBackground, bounds); } else { DrawCheckBackground(Control.Enabled, Control.CheckState, e.Graphics, bounds, checkColor, checkBackground, disabledColors, colors); } } protected void DrawCheckOnly(PaintEventArgs e, LayoutData layout, ColorData colors, Color checkColor, Color checkBackground, bool disabledColors) { DrawCheckOnly(flatCheckSize, Control.Checked, Control.Enabled, Control.CheckState, e.Graphics, layout, colors, checkColor, checkBackground, disabledColors); } // used by DataGridViewCheckBoxCell internal static void DrawCheckOnly(int checkSize, bool controlChecked, bool controlEnabled, CheckState controlCheckState, Graphics g, LayoutData layout, ColorData colors, Color checkColor, Color checkBackground, bool disabledColors) { // check // if (controlChecked) { if (!controlEnabled && disabledColors) { checkColor = colors.buttonShadow; } else if (controlCheckState == CheckState.Indeterminate && disabledColors) { checkColor = SystemInformation.HighContrast ? colors.highlight : colors.buttonShadow; } Rectangle fullSize = layout.checkBounds; if (fullSize.Width == checkSize) { fullSize.Width++; fullSize.Height++; } fullSize.Width++; fullSize.Height++; Bitmap checkImage = null; if (controlCheckState == CheckState.Checked) { checkImage = GetCheckBoxImage(checkColor, fullSize, ref checkImageCheckedBackColor, ref checkImageChecked); } else { Debug.Assert(controlCheckState == CheckState.Indeterminate, "we want to paint the check box only if the item is checked or indeterminate"); checkImage = GetCheckBoxImage(checkColor, fullSize, ref checkImageIndeterminateBackColor, ref checkImageIndeterminate); } if (layout.options.everettButtonCompat) { fullSize.Y -= 1; } else { fullSize.Y -= 2; } ControlPaint.DrawImageColorized(g, checkImage, fullSize, checkColor); } } internal static Rectangle DrawPopupBorder(Graphics g, Rectangle r, ColorData colors) { using (WindowsGraphics wg = WindowsGraphics.FromGraphics( g )) { using( WindowsPen high = new WindowsPen(wg.DeviceContext, colors.highlight), shadow = new WindowsPen(wg.DeviceContext, colors.buttonShadow), face = new WindowsPen(wg.DeviceContext, colors.buttonFace)) { wg.DrawLine(high, r.Right-1 , r.Top, r.Right-1, r.Bottom); wg.DrawLine(high, r.Left, r.Bottom-1, r.Right, r.Bottom-1); wg.DrawLine(shadow, r.Left, r.Top, r.Left , r.Bottom); wg.DrawLine(shadow, r.Left, r.Top, r.Right- 1, r.Top); wg.DrawLine(face, r.Right - 2, r.Top + 1, r.Right - 2, r.Bottom - 1); wg.DrawLine(face, r.Left + 1, r.Bottom - 2, r.Right - 1, r.Bottom - 2); } } r.Inflate(-1, -1); return r; } protected ButtonState GetState() { ButtonState style = (ButtonState)0; if (Control.CheckState == CheckState.Unchecked) { style |= ButtonState.Normal; } else { style |= ButtonState.Checked; } if (!Control.Enabled) { style |= ButtonState.Inactive; } if (Control.MouseIsDown) { style |= ButtonState.Pushed; } return style; } protected void DrawCheckBox(PaintEventArgs e, LayoutData layout) { Graphics g = e.Graphics; ButtonState style = GetState(); if (Control.CheckState == CheckState.Indeterminate) { if (Application.RenderWithVisualStyles) { CheckBoxRenderer.DrawCheckBox(g, new Point(layout.checkBounds.Left, layout.checkBounds.Top), CheckBoxRenderer.ConvertFromButtonState(style, true, Control.MouseIsOver)); } else { ControlPaint.DrawMixedCheckBox(g, layout.checkBounds, style); } } else { if (Application.RenderWithVisualStyles) { CheckBoxRenderer.DrawCheckBox(g, new Point(layout.checkBounds.Left, layout.checkBounds.Top), CheckBoxRenderer.ConvertFromButtonState(style, false, Control.MouseIsOver)); } else { ControlPaint.DrawCheckBox(g, layout.checkBounds, style); } } } #endregion private static Bitmap GetCheckBoxImage(Color checkColor, Rectangle fullSize, ref Color cacheCheckColor, ref Bitmap cacheCheckImage) { if (cacheCheckImage != null && cacheCheckColor.Equals(checkColor) && cacheCheckImage.Width == fullSize.Width && cacheCheckImage.Height == fullSize.Height) { return cacheCheckImage; } if (cacheCheckImage != null) { cacheCheckImage.Dispose(); cacheCheckImage = null; } // We draw the checkmark slightly off center to eliminate 3-D border artifacts, // and compensate below NativeMethods.RECT rcCheck = NativeMethods.RECT.FromXYWH(0, 0, fullSize.Width, fullSize.Height); Bitmap bitmap = new Bitmap(fullSize.Width, fullSize.Height); Graphics offscreen = Graphics.FromImage(bitmap); offscreen.Clear(Color.Transparent); IntPtr dc = offscreen.GetHdc(); try { SafeNativeMethods.DrawFrameControl(new HandleRef(offscreen, dc), ref rcCheck, NativeMethods.DFC_MENU, NativeMethods.DFCS_MENUCHECK); } finally { offscreen.ReleaseHdcInternal(dc); offscreen.Dispose(); } bitmap.MakeTransparent(); cacheCheckImage = bitmap; cacheCheckColor = checkColor; return cacheCheckImage; } internal override LayoutOptions CommonLayout() { LayoutOptions layout = base.CommonLayout(); layout.checkAlign = Control.CheckAlign; layout.textOffset = false; layout.shadowedText = !Control.Enabled; layout.layoutRTL = RightToLeft.Yes == Control.RightToLeft; return layout; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Windows.Forms.ButtonInternal { using System; using System.Diagnostics; using System.Drawing; using System.Windows.Forms.Internal; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Drawing.Text; using System.Windows.Forms; using System.Windows.Forms.VisualStyles; using System.Runtime.InteropServices; internal abstract class CheckBoxBaseAdapter : CheckableControlBaseAdapter { protected const int flatCheckSize = 11; [ThreadStatic] private static Bitmap checkImageChecked = null; [ThreadStatic] private static Color checkImageCheckedBackColor = Color.Empty; [ThreadStatic] private static Bitmap checkImageIndeterminate = null; [ThreadStatic] private static Color checkImageIndeterminateBackColor = Color.Empty; internal CheckBoxBaseAdapter(ButtonBase control) : base(control) {} protected new CheckBox Control { get { return ((CheckBox)base.Control); } } #region Drawing Helpers protected void DrawCheckFlat(PaintEventArgs e, LayoutData layout, Color checkColor, Color checkBackground, Color checkBorder, ColorData colors) { Rectangle bounds = layout.checkBounds; // Removed subtracting one for Width and Height. In Everett we needed to do this, // since we were using GDI+ to draw the border. Now that we are using GDI, // we should not do before drawing the border. if (!layout.options.everettButtonCompat) { bounds.Width--; bounds.Height--; } using (WindowsGraphics wg = WindowsGraphics.FromGraphics( e.Graphics )) { using(WindowsPen pen = new WindowsPen(wg.DeviceContext, checkBorder)){ wg.DrawRectangle(pen, bounds); } // Now subtract, since the rest of the code is like Everett. if (layout.options.everettButtonCompat) { bounds.Width--; bounds.Height--; } bounds.Inflate(-1, -1); } if (Control.CheckState == CheckState.Indeterminate) { bounds.Width++; bounds.Height++; DrawDitheredFill(e.Graphics, colors.buttonFace, checkBackground, bounds); } else { using( WindowsGraphics wg = WindowsGraphics.FromGraphics( e.Graphics )) { using (WindowsBrush brush = new WindowsSolidBrush(wg.DeviceContext, checkBackground)) { // Even though we are using GDI here as opposed to GDI+ in Everett, we still need to add 1. bounds.Width++; bounds.Height++; wg.FillRectangle(brush, bounds); } } } DrawCheckOnly(e, layout, colors, checkColor, checkBackground, true); } // used by DataGridViewCheckBoxCell internal static void DrawCheckBackground(bool controlEnabled, CheckState controlCheckState, Graphics g, Rectangle bounds, Color checkColor, Color checkBackground, bool disabledColors, ColorData colors) { using ( WindowsGraphics wg = WindowsGraphics.FromGraphics( g )) { WindowsBrush brush; if (!controlEnabled && disabledColors) { brush = new WindowsSolidBrush(wg.DeviceContext, SystemColors.Control); } else if (controlCheckState == CheckState.Indeterminate && checkBackground == SystemColors.Window && disabledColors) { Color comboColor = SystemInformation.HighContrast ? SystemColors.ControlDark : SystemColors.Control; byte R = (byte)((comboColor.R + SystemColors.Window.R) / 2); byte G = (byte)((comboColor.G + SystemColors.Window.G) / 2); byte B = (byte)((comboColor.B + SystemColors.Window.B) / 2); brush = new WindowsSolidBrush(wg.DeviceContext, Color.FromArgb(R, G, B)); } else { brush = new WindowsSolidBrush(wg.DeviceContext, checkBackground); } try { wg.FillRectangle(brush, bounds); } finally { if (brush != null) { brush.Dispose(); } } } } protected void DrawCheckBackground(PaintEventArgs e, Rectangle bounds, Color checkColor, Color checkBackground, bool disabledColors, ColorData colors) { // area behind check // if (Control.CheckState == CheckState.Indeterminate) { DrawDitheredFill(e.Graphics, colors.buttonFace, checkBackground, bounds); } else { DrawCheckBackground(Control.Enabled, Control.CheckState, e.Graphics, bounds, checkColor, checkBackground, disabledColors, colors); } } protected void DrawCheckOnly(PaintEventArgs e, LayoutData layout, ColorData colors, Color checkColor, Color checkBackground, bool disabledColors) { DrawCheckOnly(flatCheckSize, Control.Checked, Control.Enabled, Control.CheckState, e.Graphics, layout, colors, checkColor, checkBackground, disabledColors); } // used by DataGridViewCheckBoxCell internal static void DrawCheckOnly(int checkSize, bool controlChecked, bool controlEnabled, CheckState controlCheckState, Graphics g, LayoutData layout, ColorData colors, Color checkColor, Color checkBackground, bool disabledColors) { // check // if (controlChecked) { if (!controlEnabled && disabledColors) { checkColor = colors.buttonShadow; } else if (controlCheckState == CheckState.Indeterminate && disabledColors) { checkColor = SystemInformation.HighContrast ? colors.highlight : colors.buttonShadow; } Rectangle fullSize = layout.checkBounds; if (fullSize.Width == checkSize) { fullSize.Width++; fullSize.Height++; } fullSize.Width++; fullSize.Height++; Bitmap checkImage = null; if (controlCheckState == CheckState.Checked) { checkImage = GetCheckBoxImage(checkColor, fullSize, ref checkImageCheckedBackColor, ref checkImageChecked); } else { Debug.Assert(controlCheckState == CheckState.Indeterminate, "we want to paint the check box only if the item is checked or indeterminate"); checkImage = GetCheckBoxImage(checkColor, fullSize, ref checkImageIndeterminateBackColor, ref checkImageIndeterminate); } if (layout.options.everettButtonCompat) { fullSize.Y -= 1; } else { fullSize.Y -= 2; } ControlPaint.DrawImageColorized(g, checkImage, fullSize, checkColor); } } internal static Rectangle DrawPopupBorder(Graphics g, Rectangle r, ColorData colors) { using (WindowsGraphics wg = WindowsGraphics.FromGraphics( g )) { using( WindowsPen high = new WindowsPen(wg.DeviceContext, colors.highlight), shadow = new WindowsPen(wg.DeviceContext, colors.buttonShadow), face = new WindowsPen(wg.DeviceContext, colors.buttonFace)) { wg.DrawLine(high, r.Right-1 , r.Top, r.Right-1, r.Bottom); wg.DrawLine(high, r.Left, r.Bottom-1, r.Right, r.Bottom-1); wg.DrawLine(shadow, r.Left, r.Top, r.Left , r.Bottom); wg.DrawLine(shadow, r.Left, r.Top, r.Right- 1, r.Top); wg.DrawLine(face, r.Right - 2, r.Top + 1, r.Right - 2, r.Bottom - 1); wg.DrawLine(face, r.Left + 1, r.Bottom - 2, r.Right - 1, r.Bottom - 2); } } r.Inflate(-1, -1); return r; } protected ButtonState GetState() { ButtonState style = (ButtonState)0; if (Control.CheckState == CheckState.Unchecked) { style |= ButtonState.Normal; } else { style |= ButtonState.Checked; } if (!Control.Enabled) { style |= ButtonState.Inactive; } if (Control.MouseIsDown) { style |= ButtonState.Pushed; } return style; } protected void DrawCheckBox(PaintEventArgs e, LayoutData layout) { Graphics g = e.Graphics; ButtonState style = GetState(); if (Control.CheckState == CheckState.Indeterminate) { if (Application.RenderWithVisualStyles) { CheckBoxRenderer.DrawCheckBox(g, new Point(layout.checkBounds.Left, layout.checkBounds.Top), CheckBoxRenderer.ConvertFromButtonState(style, true, Control.MouseIsOver)); } else { ControlPaint.DrawMixedCheckBox(g, layout.checkBounds, style); } } else { if (Application.RenderWithVisualStyles) { CheckBoxRenderer.DrawCheckBox(g, new Point(layout.checkBounds.Left, layout.checkBounds.Top), CheckBoxRenderer.ConvertFromButtonState(style, false, Control.MouseIsOver)); } else { ControlPaint.DrawCheckBox(g, layout.checkBounds, style); } } } #endregion private static Bitmap GetCheckBoxImage(Color checkColor, Rectangle fullSize, ref Color cacheCheckColor, ref Bitmap cacheCheckImage) { if (cacheCheckImage != null && cacheCheckColor.Equals(checkColor) && cacheCheckImage.Width == fullSize.Width && cacheCheckImage.Height == fullSize.Height) { return cacheCheckImage; } if (cacheCheckImage != null) { cacheCheckImage.Dispose(); cacheCheckImage = null; } // We draw the checkmark slightly off center to eliminate 3-D border artifacts, // and compensate below NativeMethods.RECT rcCheck = NativeMethods.RECT.FromXYWH(0, 0, fullSize.Width, fullSize.Height); Bitmap bitmap = new Bitmap(fullSize.Width, fullSize.Height); Graphics offscreen = Graphics.FromImage(bitmap); offscreen.Clear(Color.Transparent); IntPtr dc = offscreen.GetHdc(); try { SafeNativeMethods.DrawFrameControl(new HandleRef(offscreen, dc), ref rcCheck, NativeMethods.DFC_MENU, NativeMethods.DFCS_MENUCHECK); } finally { offscreen.ReleaseHdcInternal(dc); offscreen.Dispose(); } bitmap.MakeTransparent(); cacheCheckImage = bitmap; cacheCheckColor = checkColor; return cacheCheckImage; } internal override LayoutOptions CommonLayout() { LayoutOptions layout = base.CommonLayout(); layout.checkAlign = Control.CheckAlign; layout.textOffset = false; layout.shadowedText = !Control.Enabled; layout.layoutRTL = RightToLeft.Yes == Control.RightToLeft; return layout; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DesignerLoader.cs
- ActivitiesCollection.cs
- TabletDeviceInfo.cs
- X509Certificate2Collection.cs
- TextViewElement.cs
- WindowsFormsSynchronizationContext.cs
- x509utils.cs
- metadatamappinghashervisitor.hashsourcebuilder.cs
- PersonalizationDictionary.cs
- SessionIDManager.cs
- ConditionedDesigner.cs
- EncryptedHeaderXml.cs
- RightsManagementSuppressedStream.cs
- ContentElement.cs
- ParameterToken.cs
- TextParentUndoUnit.cs
- FixedNode.cs
- mediaeventshelper.cs
- BaseParagraph.cs
- XmlSchemaAttributeGroupRef.cs
- WindowsListBox.cs
- SmtpReplyReader.cs
- ColumnResizeUndoUnit.cs
- TextEndOfParagraph.cs
- EdmType.cs
- RequestCacheManager.cs
- ValueQuery.cs
- OptimisticConcurrencyException.cs
- InkCanvas.cs
- _NestedSingleAsyncResult.cs
- TextWriter.cs
- _LoggingObject.cs
- CheckableControlBaseAdapter.cs
- WsatProxy.cs
- DataGridViewImageColumn.cs
- XmlText.cs
- CodeAttachEventStatement.cs
- DocumentEventArgs.cs
- SQLDecimalStorage.cs
- MatrixKeyFrameCollection.cs
- RegionData.cs
- IList.cs
- PixelFormat.cs
- CompoundFileIOPermission.cs
- ClassDataContract.cs
- LoginCancelEventArgs.cs
- PathSegment.cs
- ISAPIApplicationHost.cs
- DataObjectSettingDataEventArgs.cs
- ExtendedPropertyDescriptor.cs
- Operand.cs
- IdentityNotMappedException.cs
- DBCommand.cs
- DocumentSchemaValidator.cs
- MTConfigUtil.cs
- TextControl.cs
- SafeProcessHandle.cs
- StorageEntitySetMapping.cs
- XmlElementCollection.cs
- LicenseException.cs
- DetailsViewModeEventArgs.cs
- PixelFormat.cs
- oledbmetadatacolumnnames.cs
- XmlComplianceUtil.cs
- HtmlHistory.cs
- CodeTypeParameterCollection.cs
- FormClosingEvent.cs
- QuaternionAnimation.cs
- CommonDialog.cs
- InvalidCastException.cs
- XmlEntity.cs
- ActiveXContainer.cs
- SerializationInfo.cs
- MimeMapping.cs
- ProvideValueServiceProvider.cs
- StdValidatorsAndConverters.cs
- arc.cs
- SessionSymmetricTransportSecurityProtocolFactory.cs
- DefaultTextStore.cs
- QueuePathDialog.cs
- TemplateBamlTreeBuilder.cs
- ProvidersHelper.cs
- WebPartVerbCollection.cs
- Enum.cs
- DNS.cs
- GlobalItem.cs
- DllNotFoundException.cs
- MasterPage.cs
- DocumentCollection.cs
- PeerMessageDispatcher.cs
- WsdlParser.cs
- xdrvalidator.cs
- DataObjectPastingEventArgs.cs
- GeneratedCodeAttribute.cs
- PointCollection.cs
- EpmContentSerializerBase.cs
- CheckBox.cs
- RangeBaseAutomationPeer.cs
- FixedSOMLineRanges.cs
- Delegate.cs