C#:堆叠和移动透明图像

C#:堆叠和移动透明图像,c#,.net,image,transparency,alpha,C#,.net,Image,Transparency,Alpha,我对C#和这里的.NET库相当陌生,我正在整理一个项目,让自己更熟悉它。我想做的是创建一个带有背景图像(一张“地图”)的表单,上面有更小的图像(“人物”,游戏片段),可以拖拽,整个过程可以放大/缩小。在我尝试支持透明图像之前,一切都运行得很好。如果我能同时支持透明背景的图像(用于数字)和alpha层的图像(用于地图覆盖,如天气效果等),那就太好了 我对所有图像使用PictureBox控件,每次放大或拖动地图或地物(每次鼠标移动)时,我基本上都会重新绘制整个图像。我为“支持”透明度所做的一切就是将

我对C#和这里的.NET库相当陌生,我正在整理一个项目,让自己更熟悉它。我想做的是创建一个带有背景图像(一张“地图”)的表单,上面有更小的图像(“人物”,游戏片段),可以拖拽,整个过程可以放大/缩小。在我尝试支持透明图像之前,一切都运行得很好。如果我能同时支持透明背景的图像(用于数字)和alpha层的图像(用于地图覆盖,如天气效果等),那就太好了

我对所有图像使用PictureBox控件,每次放大或拖动地图或地物(每次鼠标移动)时,我基本上都会重新绘制整个图像。我为“支持”透明度所做的一切就是将人物的背景色设置为Color.Transparent,并将其父对象设置为地图的PictureBox控件。由此产生的错误是:当我不接触地图时,人物的透明度确实起作用,但当我拖动地图或人物时,它不会重新绘制人物的图像,直到我停止移动,并且扭曲了区域(看起来像是我在末日中穿过墙壁),图像结束,即使人物没有透明度

图形、图形文件等是我的一个薄弱环节,所以我真的不知道这里发生了什么。如果有人对如何解决这个问题有任何想法,或者只是想让它更顺利地工作(除了PictureBox之外,还有其他图像控件吗?),我将不胜感激。我知道的另一个小问题是,如果我把两个透明的图形重叠起来,它们会相互覆盖,我只能看到背景图像,所以我可能只是朝着错误的方向走了

提前谢谢

编辑:在下面添加“我的渲染”函数,每当移动或创建任何贴图/地物对象(MouseMove和MouseWheel事件)时都会调用该函数


首先,如果你正在创建一个游戏,你应该看看XNA之类的。否则,如果您正在创建一个基本的Windows UI,您应该使用WPF。winforms是一种非常古老的技术,它不支持任何东西,不推荐用于任何新项目。它实际上不支持透明性,也不支持硬件加速,因此生成的UI可能会持续闪烁。请发布您正在使用的相关代码,而不是太多的文本。代码中确实没有太多可查看的内容,但我编辑了这篇文章,添加了主要的“渲染”功能。它只是移动和缩放图片框。我认为XNA不适合这个,但今天下午我会给WPF看一看。谢谢你的建议。如果你能发布一个你需要的截图,也许我可以给你一些WPF的跳转来完成这项工作。
    //This method is attached to my "Map" class.
    //The "control" variables are PictureBoxes; I should probably have the Map/Figure classes extend PictureBox instead of that, though.
    public void Render()
    {
        this.control.Image = this.background;
        this.control.Width = (int)(this.background.Width * Scalar());
        this.control.Height = (int)(this.background.Height * Scalar());
        this.control.Location = new Point(offset.X, offset.Y);
        foreach (Figure figure in this.figures)
        {
            figure.control.Location = new Point(this.control.Location.X + System.Convert.ToInt32(figure.offset.X * Scalar()), this.control.Location.Y + System.Convert.ToInt32(figure.offset.Y * Scalar()));
            figure.control.Width = System.Convert.ToInt32(figure.base_size.Width * Scalar());
            figure.control.Height = System.Convert.ToInt32(figure.base_size.Height * Scalar());
        }
    }