Click here to Skip to main content
15,896,726 members
Articles / Programming Languages / C#

Creating Bitmap Regions for Forms and Buttons

Rate me:
Please Sign up or sign in to vote.
4.97/5 (66 votes)
8 Feb 20042 min read 325.2K   12K   183  
This article describes on how to create bitmap regions for WinForms and buttons.
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace BitmapRegionTest
{
	/// <summary>
	/// Summary description for BitmapRegion.
	/// </summary>
	public class BitmapRegion
	{
		public BitmapRegion()
		{}

		/// <summary>
		/// Create and apply the region on the supplied control
		/// </summary>
		/// <param name="control">The Control object to apply the region to</param>
		/// <param name="bitmap">The Bitmap object to create the region from</param>
		public static void CreateControlRegion(Control control, Bitmap bitmap)
		{
			// Return if control and bitmap are null
			if(control == null || bitmap == null)
				return;
			
			// Set our control's size to be the same as the bitmap
			control.Width = bitmap.Width;
			control.Height = bitmap.Height;

			// Check if we are dealing with Form here
			if(control is System.Windows.Forms.Form)
			{
				// Cast to a Form object
				Form form = (Form)control;

				// Set our form's size to be a little larger that the bitmap just 
				// in case the form's border style is not set to none in the first place
				form.Width += 15;
				form.Height += 35;

				// No border
				form.FormBorderStyle = FormBorderStyle.None;

				// Set bitmap as the background image
				form.BackgroundImage = bitmap;

				// Calculate the graphics path based on the bitmap supplied
				GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);

				// Apply new region
				form.Region = new Region(graphicsPath);
			}

			// Check if we are dealing with Button here
			else if(control is System.Windows.Forms.Button)
			{
				// Cast to a button object
				Button button = (Button)control;

				// Do not show button text
				button.Text = "";
				
				// Change cursor to hand when over button
				button.Cursor = Cursors.Hand;

				// Set background image of button
				button.BackgroundImage = bitmap;
				
				// Calculate the graphics path based on the bitmap supplied
				GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);

				// Apply new region
				button.Region = new Region(graphicsPath);
			}
		}

		/// <summary>
		/// Calculate the graphics path that representing the figure in the bitmap 
		/// excluding the transparent color which is the top left pixel.
		/// </summary>
		/// <param name="bitmap">The Bitmap object to calculate our graphics path from</param>
		/// <returns>Calculated graphics path</returns>
		private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
		{
			// Create GraphicsPath for our bitmap calculation
			GraphicsPath graphicsPath = new GraphicsPath();

			// Use the top left pixel as our transparent color
			Color colorTransparent = bitmap.GetPixel(0, 0);

			// This is to store the column value where an opaque pixel is first found.
			// This value will determine where we start scanning for trailing opaque pixels.
			int colOpaquePixel = 0;

			// Go through all rows (Y axis)
			for(int row = 0; row < bitmap.Height; row ++)
			{
				// Reset value
				colOpaquePixel = 0;

				// Go through all columns (X axis)
				for(int col = 0; col < bitmap.Width; col ++)
				{
					// If this is an opaque pixel, mark it and search for anymore trailing behind
					if(bitmap.GetPixel(col, row) != colorTransparent)
					{
						// Opaque pixel found, mark current position
						colOpaquePixel = col;

						// Create another variable to set the current pixel position
						int colNext = col;

						// Starting from current found opaque pixel, search for anymore opaque pixels 
						// trailing behind, until a transparent pixel is found or minimum width is reached
						for(colNext = colOpaquePixel; colNext < bitmap.Width; colNext ++)
							if(bitmap.GetPixel(colNext, row) == colorTransparent)
								break;

						// Form a rectangle for line of opaque pixels found and add it to our graphics path
						graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));

						// No need to scan the line of opaque pixels just found
						col = colNext;
					}
				}
			}

			// Return calculated graphics path
			return graphicsPath;
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Singapore Singapore
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions