GDI+ Brushes
FAQ Home
1.
How do I use hatched and gradient brush types?
2. How to set the rendering origin for hatch brushes?
3. How to create my own hatch styles for brushes?
1 How do I use hatched and gradient brush types?
The Brushes Sample shows you how to use four different brushes in
several shapes. Below is a code snippet showing how to use hatched and
gradient brushes.
Rectangle rect = new Rectangle(35,
190, 100, 100);
LinearGradientBrush brush2 = new LinearGradientBrush(rect,
Color.DarkOrange, Color.Aquamarine,
LinearGradientMode.ForwardDiagonal);
g.FillEllipse(brush2, 35, 190, 100, 100);
HatchBrush brush1 = new HatchBrush(HatchStyle.DiagonalCross,
Color.DarkOrange, Color.Aquamarine);
g.FillEllipse(brush1, 35, 190, 100, 100);
2 How to set the rendering origin for hatch brushes?
The Graphics.RenderingOrigin property lets you specify a Point
structure that represents the dither origin for 8-bits-per-pixel and
16-bits-per-pixel dithering and is also used to set the origin for hatch
brushes.
The following example shows how to use RenderingOrigin:
namespace Scrollable1
{
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
///
/// Summary description for ScrollableControl1.
///
public class ScrollableControl1 : System.Windows.Forms.ScrollableControl
{
private void InitializeComponent ()
{
}
public ScrollableControl1()
{
InitializeComponent ();
this.AutoScrollMinSize = new Size(500, 500);
}
protected override void OnPaint(PaintEventArgs pe)
{
pe.Graphics.RenderingOrigin = AutoScrollPosition;
HatchBrush br = new HatchBrush(HatchStyle.ForwardDiagonal, Color.Blue,
Color.White);
pe.Graphics.FillRectangle(br, ClientRectangle /*or pe.ClipRectangle*/);
br.Dispose();
}
}
}
3 How to create my own hatch styles for brushes?
GDI+ features a TextureBrush that lets you draw repeating
patterns. You can specify any bitmap to be drawn repeatedly. In this example
we create bitmaps using code and attach them to a TextureBrush.
static object[]
patternSpecs = new object[]
{
new short[] { 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00
}, // horizontal
new short[] { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc
}, // vertical
new short[] { 0x77, 0xbb, 0xdd, 0xee, 0x77, 0xbb, 0xdd, 0xee
}, // \\\ Down
new short[] { 0xee, 0xdd, 0xbb, 0x77, 0xee, 0xdd, 0xbb, 0x77
}, // /// Up
new short[] { 0xee, 0x00, 0xee, 0xee, 0xee, 0x00, 0xee, 0xee
}, // +++
}
public static Bitmap CreateBitmapFromPattern(int pattern)
{
Bitmap patternBitmap;
IntPtr hBitmap = NativeMethods.CreateBitmap(8, 8, 1, 1,
(short[]) patternSpecs[pattern]);
if (hBitmap != IntPtr.Zero)
patternBitmap = Image.FromHbitmap(hBitmap);
NativeMethods.DeleteObject(hBitmap);
return patternBitmap;
}
public static void FillRectangle(Graphics g, Rectangle r, int
pattern, Color foreColor, Color backColor)
{
Bitmap bm = CreateBitmapFromPattern(pattern);
FillRectangle(g, r, bm, foreColor, backColor);
}
public static void FillRectangle(Graphics g, Rectangle r, Bitmap
bm, Color foreColor, Color backColor)
{
if (bm != null)
{
Size size = bm.PhysicalDimension.ToSize();
TextureBrush br = new TextureBrush(bm, new Rectangle(new
Point(0, 0), size), ia);
br.WrapMode = WrapMode.Tile;
g.FillRectangle(br, r);
br.Dispose();
}
}
public class NativeMethods
{
[DllImport("gdi32", CharSet=CharSet.Auto, ExactSpelling=true)]
extern public static IntPtr CreateBitmap(int nWidth, int nHeight,
int nPlanes, int nBitsPerPixel,
[MarshalAs(UnmanagedType.LPArray)] short[] lpvBits);
[DllImport("gdi32")]
extern public static bool DeleteObject(IntPtr hObject) ;
}
|