0

这是我从互联网上获取的以下控制类;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;

public class TranspCtrl : Control
{
   private Color brushColor = Color.Transparent;
   private Color fillColor = Color.Transparent;
   private int opacity = 100;
   private float lineThick = 1.0f;

public TranspCtrl()
{
    SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    SetStyle(ControlStyles.ResizeRedraw, true);

    //Set style for double buffering
    SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);

    //Set the default backcolor
    this.BackColor = Color.Transparent;
}

public Color FillColor
{
    get
    {
        return this.fillColor;
    }
    set
    {
        this.fillColor = value;
        this.Invalidate();
    }
}

public float LineThick
{
    get
    {
        return this.lineThick;
    }
    set
    {
        this.lineThick = value;
        this.Invalidate();
    }
}

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    Graphics g = e.Graphics;
    g.SmoothingMode = SmoothingMode.HighQuality;

    RectangleF r = new RectangleF(0.0f, 0.0f, (float)this.Width, (float)this.Height);
    float cx = r.Width-1;
    float cy = r.Height-1;
    float offset = 0.4f;

    Pen pen = new Pen(new SolidBrush(this.ForeColor), lineThick);
    pen.Alignment = PenAlignment.Center;
    SolidBrush brush = new SolidBrush(fillColor);
    SolidBrush bckgnd = new SolidBrush(this.BackColor);

    // Creates a path to draw graphics
    GraphicsPath path = new GraphicsPath();

    // Paint the control
    if (this.BackColor == Color.Transparent)
    {          
        // Add the AddEllipse method to the path.
        path.AddEllipse(0.0f, 0.0f, cx, cy);

        // Creates the region area for the control painting
        this.Region = new Region(path);

        //Draw the shape over the region               
        g.FillEllipse(brush, 0.0f, 0.0f, cx, cy);

        //Draw the outline
        g.DrawEllipse(pen, lineThick/2.0f, lineThick/2.0f, cx-lineThick-offset, cy-lineThick-offset);
    }
    else 
    {                   
        //Add a rectangle to the path. This will be the control background.
        path.AddRectangle(r); 

        //Creates a region area for the background painting
        this.Region = new Region(path); 

        //Paint the control background
        g.FillRegion(bckgnd, this.Region);

        //Draw the shape over the control background
        g.FillEllipse(brush, 0.0f, 0.0f, cx, cy);

        // Draw the shape outline
        g.DrawEllipse(pen, lineThick / 2.0f, lineThick / 2.0f, cx - lineThick, cy - lineThick);
    }

    pen.Dispose();
    brush.Dispose();
    bckgnd.Dispose();
    this.Region.Dispose();
    path.Dispose();
}
}

我一共有2个问题。

  1. 如何添加不透明度选项。

  2. 我如何在仍然使用此“粗线”选项的同时将其绘制为矩形,而不是将其绘制为圆形。

谢谢。

4

0 回答 0