【问题标题】:Delete transparent background from picturebox in winforms c#从winforms c#中的图片框中删除透明背景
【发布时间】:2014-03-09 23:45:21
【问题描述】:

我想在点击图片框时获得 x、y 位置。我有 2 个图片框,一个在另一个之上。小图片框有一个透明区域背景 (.png)。 当我点击这个区域时,我想得到第二个的图片框。

这是获取 x,y 位置的代码:

  pictureBox2.MouseClick += (s, e) =>
        {
            if (e.Button == MouseButtons.Right)
            {
                MessageBox.Show(String.Format("Right Clicked2 at X: {0} Y: {1}", e.X, e.Y));
            }
            else if (e.Button == MouseButtons.Left)
            { MessageBox.Show(String.Format("Mouse Clicked2 at X: {0} Y: {1}", e.X, e.Y)); }
        };

        pictureBox1.MouseClick += (s, e) =>
        {
            if (e.Button == MouseButtons.Right)
            {
                MessageBox.Show(String.Format("Right Clicked at X: {0} Y: {1}", e.X, e.Y));
            }
            else if (e.Button == MouseButtons.Left)
            { MessageBox.Show(String.Format("Mouse Clicked at X: {0} Y: {1}", e.X, e.Y)); }
        };

使用此代码显示第二张图片(显示效果很好)。但是当我点击透明区域时,它给了我来自picturebox2而不是picturebox1的消息。知道如何将此区域分配给picturebox1吗?

     var pos = this.PointToScreen(pictureBox2.Location);
        pos = pictureBox1.PointToClient(pos);
        pictureBox2.Parent = pictureBox1;
        pictureBox2.Location = pos;
        pictureBox2.BackColor = Color.Transparent;

【问题讨论】:

  • 不相关:无论您想在这里做什么,winforms 都不是正确的技术。如果您想创建硬核游戏,请查看 XNA、MonoGame 或 Unity3D。如果您想创建更简单的 2D 游戏,可以使用 WPF。
  • 我不明白你在做什么。 “删除透明背景”是什么意思?
  • 我不想显示这个透明区域。当点击这个区域时,我希望点击picturebox1而不是picturebox2
  • @HighCore XNA 不是“死”了吗? (至少根据XNA Wikipedia article)。
  • 它已经死了,它不是正确的技术。游戏框架的生存技能只比我冰箱里的牛奶好:) pictureBox1 鼠标事件永远不会触发,一个简单的解决方法是使用 Bitmap.GetPixel() 并检查 alpha。

标签: c# winforms picturebox regions


【解决方案1】:

只需使用一个图片框,看看您是否在该区域内。该区域是一个以x0, 0为中心的半循环。所以计算

squareroot(y*y + (x0-x)*(x0-x)), x,y is where you click. 

如果它小于你在里面的半径,否则在外面。

编辑。

创建图形路径

using System.Drawing.Drawing2D; //is needed for the graphics path

GraphicsPath gp = new GraphicsPath();

gp.AddEllipse (x, y, width, height); //x,y the upper left corner of the rect containing the ellipse

if( gp.IsVisible (e.X, e.Y) ){
    //is inside
}
else{
    //is outside
}

注意:y坐标为负数

瓦尔特

【讨论】:

  • 非常好。你知道椭圆也一样吗?里面的形状是椭圆
  • 最佳答案。谢谢 Valter。
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 2016-05-11
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
相关资源
最近更新 更多