0
点赞
收藏
分享

微信扫一扫

创建不规则的对话框控件

E_topia 2022-07-27 阅读 45


/// <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 GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
{
// Create GraphicsPath for our bitmap calculation
//创建 GraphicsPath
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.
//第一个找到点的X
int colOpaquePixel = 0;
// Go through all rows (Y axis)
// 偏历所有行(Y方向)
for (int row = 0; row < bitmap.Height; row++)
{
// Reset value
//重设
colOpaquePixel = 0;
// Go through all columns (X axis)
//偏历所有列(X方向)
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
//将不透明点加到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;
}//读取资源文件中的图片,并根据对话框的大小改变图片尺寸,经处理后,此图片的非透明区域即为该对话框控件的区域
private void setBack()
{
System.Resources.ResourceManager rsc = new System.Resources.ResourceManager(typeof(EduResource));

Bitmap img = new Bitmap(this.Width, this.Height);
Image im = (Image)rsc.GetObject("对话框背景");

Graphics gra = Graphics.FromImage(img);
gra.DrawImage(im, 0, 0, this.Width, this.Height);
gra.Dispose();

im.Dispose();

CreateControlRegion(this, img);
}

//创建支持位图区域的控件
private void CreateControlRegion(System.Windows.Forms.Control control, Bitmap bitmap)
{
UserControl con = (UserControl)control;
con.BorderStyle = BorderStyle.None;
con.BackgroundImage = bitmap;
con.BackgroundImageLayout = ImageLayout.Stretch;
GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
con.Region = new Region(graphicsPath);
}

 

注:所使用的背景图片需有单一的背景色,如是透明图片,则无法正确计算图片的有效区域


使用setBack方法来调用方法,如在Resize或onPaint事件中使用该方法,则会造成错误。

举报

相关推荐

0 条评论