/*
* Copyright (c) 2004-2007 D8HOME.CN
* All rights reserved.
*
* http://www.d8home.cn/
*
* This library is only free for any non commercial usage. In the case of
* modifying and/or redistributing the code, it's obligate to retain
* the original copyright notice.
*
*/
using System;
using System.Windows.Forms;
using System.Drawing;
namespace D8Drawing
{
/// <summary>
/// RoundRect 的摘要说明。
/// </summary>
public class RoundRect
{
/// <summary>
/// 最大圆角半径
/// </summary>
protected const int MaxRoundRadius = 3;
/// <summary>
/// 最小矩形边长,用于自动处理圆角大小
/// </summary>
protected const int MinBorderLength = 20;
/// <summary>
/// 绘制一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="nLeft">矩形左上角X坐标</param>
/// <param name="nTop">矩形左上角Y坐标</param>
/// <param name="nRight">矩形右下角X坐标</param>
/// <param name="nBottom">矩形右下角Y坐标</param>
/// <param name="round">圆角的半径长度</param>
public static void DrawRoundRect(System.Drawing.Graphics currentGraphicObject,Color lineColor,int nLeft,int nTop,int nRight,int nBottom,int round)
{
if(round > MaxRoundRadius)
{
round = MaxRoundRadius;
}
else if( round < 0)
{
round = 0;
}
if(Math.Abs(nRight - nLeft) < MinBorderLength && Math.Abs(nBottom - nTop) < MinBorderLength)
{
round = 1;
}
Point Polygon1 = new Point (nLeft+round,nTop);
Point Polygon2 = new Point (nRight-round+1,nTop);
Point Polygon3 = new Point (nLeft,nTop+round);
Point Polygon4 = new Point (nRight+1,nTop+round);
Point Polygon5 = new Point (nLeft,nBottom-round);
Point Polygon6 = new Point (nRight+1,nBottom-round);
Point Polygon7 = new Point (nLeft+round,nBottom+1);
Point Polygon8 = new Point (nRight-round,nBottom+1);
//四条主线(上下左右)
currentGraphicObject.DrawLine(new System.Drawing.Pen(lineColor),Polygon1.X,Polygon1.Y,Polygon2.X,Polygon2.Y);
currentGraphicObject.DrawLine(new System.Drawing.Pen(lineColor),Polygon7.X,Polygon7.Y,Polygon8.X,Polygon8.Y);
currentGraphicObject.DrawLine(new System.Drawing.Pen(lineColor),Polygon3.X,Polygon3.Y,Polygon5.X,Polygon5.Y);
currentGraphicObject.DrawLine(new System.Drawing.Pen(lineColor),Polygon4.X,Polygon4.Y,Polygon6.X,Polygon6.Y);
//四个边角
currentGraphicObject.DrawLine(new System.Drawing.Pen(lineColor),Polygon1.X,Polygon1.Y,Polygon3.X,Polygon3.Y);
currentGraphicObject.DrawLine(new System.Drawing.Pen(lineColor),Polygon2.X,Polygon2.Y,Polygon4.X,Polygon4.Y);
currentGraphicObject.DrawLine(new System.Drawing.Pen(lineColor),Polygon5.X,Polygon5.Y,Polygon7.X,Polygon7.Y);
currentGraphicObject.DrawLine(new System.Drawing.Pen(lineColor),Polygon6.X,Polygon6.Y,Polygon8.X,Polygon8.Y);
}
/// <summary>
/// 绘制一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="rect">要绘制的矩形对象</param>
/// <param name="round">圆角的半径长度</param>
public static void DrawRoundRect(System.Drawing.Graphics currentGraphicObject,Color lineColor,Rectangle rect,int round)
{
DrawRoundRect(currentGraphicObject,lineColor,rect.Left,rect.Top,rect.Right,rect.Bottom,round);
}
/// <summary>
/// 绘制一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="rect">要绘制的矩形对象</param>
public static void DrawRoundRect(System.Drawing.Graphics currentGraphicObject,Color lineColor,Rectangle rect)
{
DrawRoundRect(currentGraphicObject,lineColor,rect.Left,rect.Top,rect.Right,rect.Bottom,2);
}
/// <summary>
/// 填充一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="nLeft">矩形左上角X坐标</param>
/// <param name="nTop">矩形左上角Y坐标</param>
/// <param name="nRight">矩形右下角X坐标</param>
/// <param name="nBottom">矩形右下角Y坐标</param>
/// <param name="round">圆角的半径长度</param>
public static void FillRoundRect(System.Drawing.Graphics currentGraphicObject,Color fillColor,int nLeft,int nTop,int nRight,int nBottom,int round)
{
if(round > MaxRoundRadius)
{
round = MaxRoundRadius;
}
else if( round < 0)
{
round = 0;
}
if(Math.Abs(nRight - nLeft) < MinBorderLength && Math.Abs(nBottom - nTop) < MinBorderLength)
{
round = 1;
}
Point Polygon1 = new Point (nLeft+round,nTop);
Point Polygon2 = new Point (nRight-round+1,nTop);
Point Polygon3 = new Point (nLeft,nTop+round);
Point Polygon4 = new Point (nRight+1,nTop+round);
Point Polygon5 = new Point (nLeft,nBottom-round);
Point Polygon6 = new Point (nRight+1,nBottom-round);
Point Polygon7 = new Point (nLeft+round,nBottom+1);
Point Polygon8 = new Point (nRight-round,nBottom+1);
currentGraphicObject.FillPolygon(new System.Drawing.SolidBrush(fillColor),new Point[]{ Polygon1,
Polygon3,
Polygon5,
Polygon7,
Polygon8,
Polygon6,
Polygon4,
Polygon2});
}
/// <summary>
/// 填充一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="rect">要填充的矩形</param>
/// <param name="indentSize">填充区域针对矩形的缩进距离</param>
/// <param name="round">圆角的半径长度</param>
public static void FillRoundRect(System.Drawing.Graphics currentGraphicObject,Color lineColor,Rectangle rect,int indentSize,int round)
{
FillRoundRect(currentGraphicObject,lineColor,rect.Left+indentSize,rect.Top+indentSize,rect.Right-indentSize+1,rect.Bottom-indentSize+1,round);
}
/// <summary>
/// 填充一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="rect">要填充的矩形</param>
public static void FillRoundRect(System.Drawing.Graphics currentGraphicObject,Color lineColor,Rectangle rect)
{
FillRoundRect(currentGraphicObject,lineColor,rect,0,2);
}
}
}