【问题标题】:Problems with pictureboxs and transparency图片框和透明度的问题
【发布时间】:2015-12-28 05:57:46
【问题描述】:

我正在尝试开发一个扑克复盘手,但我遇到了一个不知道如何解决的问题。使用以下方法:

public Replayer() //ctor
    {
        InitializeComponent();

        pics = null;
        iCounter = 0;
        bShow = true;

        var pos = picTable.PointToScreen(picTable.Location);
        pos = picTable.PointToClient(pos);
        picTable.Parent = picBackground;
        picTable.Location = pos;
        picTable.BackColor = Color.Transparent;

        TenPlayerHoldem(); // for only test   
    }

 private void TenPlayerHoldem() // only test
    {
        int iCounter = 10;

        pics = new PictureBox[10];

        for(int i = 0; i < iCounter; i++)
        {
            pics[i] = new PictureBox();
            pics[i].Name = "pics" + i.ToString();
            pics[i].Size = new Size(148, 74);
            pics[i].Image = FreePokerReplayer.Properties.Resources.seatbold;
            pics[i].SizeMode = PictureBoxSizeMode.StretchImage;
            pics[i].BackColor = Color.Transparent;
            pics[i].Visible = true;
            pics[i].MouseClick += new MouseEventHandler(pics_Click);
            picTable.Controls.Add(pics[i]);
        }

        pics[0].Location = new Point(379, 410);
        var pos00 = pics[0].PointToScreen(pics[0].Location);
        pos00 = pics[0].PointToClient(pos00);
        pics[0].Parent = picTable;
        pics[0].Location = pos00;

        pics[1].Location = new Point(188, 377);
        var pos01 = pics[1].PointToScreen(pics[1].Location);
        pos01 = pics[1].PointToClient(pos01);
        pics[1].Parent = picTable;
        pics[1].Location = pos01;

        pics[2].Location = new Point(56, 288);
        var pos02 = pics[2].PointToScreen(pics[2].Location);
        pos02 = pics[2].PointToClient(pos02);
        pics[2].Parent = picTable;
        pics[2].Location = pos02;

我得到了这个结果:

代码如下:

//another picturebox    
var poscard = pictureBox1.PointToScreen(pictureBox1.Location);
poscard = pictureBox1.PointToClient(poscard);
pictureBox1.Parent = picTable;
pictureBox1.Location = poscard;

结果是:

卡被切断...我尝试了所有我知道的解决方法,但没有用。知道如何使卡片出现在图像后面,即卡片的一部分被隐藏而没有这个“剪切”吗?

感谢您的帮助。

【问题讨论】:

  • pics[i].Size = new Size(148, 74); 您是否尝试过更改这些值?他们看起来不对。对于扑克牌,高度应该是宽度的 2 或 3 倍。
  • 使用BringToFront()
  • 我建议你先给我们一些运行时值,比如@JohnnyMopp 说卡片的大小等

标签: c#


【解决方案1】:

cmets 都适用,但由于您的标题提到了透明度,您应该意识到 重叠 控件严格没有透明度

只有嵌套的控件可以是透明的。

这似乎是你遇到的问题:

  • 看起来椭圆在表格中嵌套,因此它们的透明度有效。

  • 但是卡片和椭圆是**重叠的**,所以它们之间的透明度不起作用

您可以通过使用region..

制作椭圆圆角矩形来解决问题

请参阅here for an example,但您在搜索“圆角矩形”时会发现很多其他代码示例。

由于您需要其中很多,因此最好创建一个RoundedPictureBox 课程!

通常最好的解决方案是不使用任何控件来显示(非矩形)图像,而是使用DrawImage它们。

【讨论】:

  • 感谢 TaW 实际上将矩形四舍五入结果更好,这真的让我很生气 AddArc 方法是“椭圆矩形”的完美方式的坐标再次感谢
  • 好吧,不要碰它们,我想说.. 调用GetRoundPath 函数时,您只需要使用一半的高度作为半径,不是吗?
  • 如果您对答案感到满意,请考虑accepting it..!
猜你喜欢
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2014-12-08
  • 2014-08-13
相关资源
最近更新 更多