2

panelはその上にハートを描いていpanelます..しかし、私はハートを描きたくないので、ハート以外のすべてを描きたいので、ハートは透明です。Region選択したものを反転できますPathか?

System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
            path.AddArc(0, 0, (this.Width / 2), (this.Height / 2), 135, 195);
            path.AddArc((this.Width / 2), 0, (this.Width / 2), (this.Height / 2), 210, 195);
            path.AddLine((this.Width / 2), this.Height, (this.Width / 2), this.Height);
            this.Region = new Region(path);
            this.BackColor = Color.Black;

見た目(白=透明):1

私がそれをどのように見せたいか(白=透明): ここに画像の説明を入力してください

4

4 に答える 4

4

2つのグラフィックパスを一緒に追加するだけでよいと思います。

このコードを試すことができます:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    GraphicsPath path = new GraphicsPath();
    path.AddArc(0, 0, (this.Width / 2), (this.Height / 2), 135, 195);
    path.AddArc((this.Width / 2), 0, (this.Width / 2), (this.Height / 2), 210, 195);
    path.AddLine((this.Width / 2), this.Height, (this.Width / 2), this.Height);

    GraphicsPath path2 = new GraphicsPath();
    path2.AddRectangle(new Rectangle(new Point(0, 0), panel1.Size));

    path2.AddPath(path, false);

    e.Graphics.FillPath(Brushes.Black, path2);
}

結果は次のとおりです。

背景画像の上に黒いハートを描く

于 2012-10-23T22:12:49.110 に答える
2

パネルのPaintイベントのGraphicオブジェクトから領域を除外してみることができます。

GraphicsPath path = new GraphicsPath();
path.AddArc(0, 0, (this.Width / 2), (this.Height / 2), 135, 195);
path.AddArc((this.Width / 2), 0, (this.Width / 2), (this.Height / 2), 210, 195);
path.AddLine((this.Width / 2), this.Height, (this.Width / 2), this.Height);

using (Region r = new Region(path)) {
  e.Graphics.ExcludeClip(r);
}

// continue drawing...
e.Graphics.Clear(Color.Yellow);

または、コントロールのリージョンを変更しようとしている場合は、リージョンのExcludeプロパティを使用します。

GraphicsPath path = new GraphicsPath();
path.AddArc(0, 0, (this.Width / 2), (this.Height / 2), 135, 195);
path.AddArc((this.Width / 2), 0, (this.Width / 2), (this.Height / 2), 210, 195);
path.AddLine((this.Width / 2), this.Height, (this.Width / 2), this.Height);

Region r = new Region(new Rectangle(Point.Empty, this.ClientSize));
r.Exclude(path);

this.Region = r;
于 2012-10-23T22:03:12.797 に答える
0

選択を反転する方法はわかりませんが、いつでも背景色でハートを描いてから、背景色を黒に変更することができます。

this.BackColor = Form.BackColor;
Form.BackColor = Color.Black;
于 2012-10-23T21:53:26.800 に答える
0

ここに元の解決策。私はあなたのニーズに合わせてそれを変更しました

 this.Region = InvertRegion(new Region(path), this.Width, this.Height);

private Region InvertRegion(Region region, int width, int height)
{
    Bitmap mask = new Bitmap(width, height);
    Graphics.FromImage(mask).FillRegion(Brushes.Black, region);

    int matchColor = Color.Black.ToArgb();

    Region inverted = new System.Drawing.Region();
    inverted.MakeEmpty();
    Rectangle rc = new Rectangle(0, 0, 0, 0);
    bool inimage = false;
    for (int y = 0; y < mask.Height; y++)
    {
        for (int x = 0; x < mask.Width; x++)
        {
            if (!inimage)
            {
                if (mask.GetPixel(x, y).ToArgb() != matchColor)
                {
                    inimage = true;
                    rc.X = x;
                    rc.Y = y;
                    rc.Height = 1;
                }
            }
            else
            {
                if (mask.GetPixel(x, y).ToArgb()  == matchColor)
                {
                    inimage = false;
                    rc.Width = x - rc.X;
                    inverted.Union(rc);
                }
            }

        }
        if (inimage)
        {
            inimage = false;
            rc.Width = mask.Width - rc.X;
            inverted.Union(rc);
        }
    }
    return inverted;
}
于 2012-10-23T22:06:50.173 に答える