public static void DrawImage(Graphics graphics, Image image, Point point, bool disabled) { if (!disabled) { Rectangle destination = new Rectangle(point, image.Size); graphics.DrawImage(image, destination, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel); } else { // Painting a disabled gray scale image is done using ILS_SATURATE on WinXP. // This code emulates that behaviour if comctl32 version 6 is not availble. NativeMethods.DLLVERSIONINFO dvi = new NativeMethods.DLLVERSIONINFO(); dvi.cbSize = Marshal.SizeOf(typeof(NativeMethods.DLLVERSIONINFO)); NativeMethods.DllGetVersion(ref dvi); if (dvi.dwMajorVersion < 6) { ImageAttributes attributes = new ImageAttributes(); Rectangle destination = new Rectangle(point, image.Size); float[][] matrix = new float[5][]; matrix[0] = new float[] { 0.2222f, 0.2222f, 0.2222f, 0.0000f, 0.0000f }; matrix[1] = new float[] { 0.2222f, 0.2222f, 0.2222f, 0.0000f, 0.0000f }; matrix[2] = new float[] { 0.2222f, 0.2222f, 0.2222f, 0.0000f, 0.0000f }; matrix[3] = new float[] { 0.3333f, 0.3333f, 0.3333f, 0.7500f, 0.0000f }; matrix[4] = new float[] { 0.0000f, 0.0000f, 0.0000f, 0.0000f, 1.0000f }; attributes.SetColorMatrix(new ColorMatrix(matrix)); graphics.DrawImage(image, destination, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes); } else { ImageList imageList = new ImageList(); imageList.ImageSize = image.Size; imageList.ColorDepth = ColorDepth.Depth32Bit; imageList.Images.Add(image); IntPtr hdc = graphics.GetHdc(); NativeMethods.IMAGELISTDRAWPARAMS ildp = new NativeMethods.IMAGELISTDRAWPARAMS(); ildp.cbSize = Marshal.SizeOf(typeof(NativeMethods.IMAGELISTDRAWPARAMS)); ildp.himl = imageList.Handle; ildp.i = 0; // image index ildp.hdcDst = hdc; ildp.x = point.X; ildp.y = point.Y; ildp.cx = 0; ildp.cy = 0; ildp.xBitmap = 0; ildp.yBitmap = 0; ildp.fStyle = NativeMethods.ILD_TRANSPARENT; ildp.fState = NativeMethods.ILS_SATURATE; ildp.Frame = -100; NativeMethods.ImageList_DrawIndirect(ref ildp); graphics.ReleaseHdc(hdc); } } }
private void NotifyCustomDrawToolBar(ref Message m) { m.Result = (IntPtr)NativeMethods.CDRF_DODEFAULT; NativeMethods.DLLVERSIONINFO dvi = new NativeMethods.DLLVERSIONINFO(); dvi.cbSize = Marshal.SizeOf(typeof(NativeMethods.DLLVERSIONINFO)); NativeMethods.DllGetVersion(ref dvi); if (dvi.dwMajorVersion < 6) { NativeMethods.LPNMTBCUSTOMDRAW tbcd = (NativeMethods.LPNMTBCUSTOMDRAW)m.GetLParam(typeof(NativeMethods.LPNMTBCUSTOMDRAW)); NativeMethods.RECT rc = tbcd.nmcd.rc; Rectangle rectangle = new Rectangle(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); //// Alex:graphics and image must be released - lots of calls using (Graphics graphics = Graphics.FromHdc(tbcd.nmcd.hdc)) { CommandBarItem item = items[tbcd.nmcd.dwItemSpec]; bool hot = ((tbcd.nmcd.uItemState & NativeMethods.CDIS_HOT) != 0); bool selected = ((tbcd.nmcd.uItemState & NativeMethods.CDIS_SELECTED) != 0); bool disabled = ((tbcd.nmcd.uItemState & NativeMethods.CDIS_DISABLED) != 0); CommandBarCheckBox checkBox = item as CommandBarCheckBox; if ((checkBox != null) && (checkBox.IsChecked)) { ControlPaint.DrawBorder3D(graphics, rectangle, Border3DStyle.SunkenOuter); } else if (selected) { ControlPaint.DrawBorder3D(graphics, rectangle, Border3DStyle.SunkenOuter); } else if (hot) { ControlPaint.DrawBorder3D(graphics, rectangle, Border3DStyle.RaisedInner); } //// Alex: don't create references unnecessarily - lots of calls if (item.Image != null) { Size size = item.Image.Size; Point point = new Point(rc.left + ((rc.right - rc.left - size.Width) / 2), rc.top + ((rc.bottom - rc.top - size.Height) / 2)); NativeMethods.DrawImage(graphics, item.Image, point, disabled); } } m.Result = (IntPtr)NativeMethods.CDRF_SKIPDEFAULT; } }