fszhang 发表于 2021-7-9 19:42:12

C#能开发半透明背景图片的窗体程序吗

下面这个游戏背景是图片,左边一块全是镂空的,我用C#放了png图片,是另一个鬼样子。









Himem 发表于 2021-7-9 19:47:24

本帖最后由 Himem 于 2021-7-9 19:54 编辑

https://stackoverflow.com/questions/33530623/c-sharp-windows-form-transparent-background-image/33531201

fszhang 发表于 2021-7-9 20:07:18

Himem 发表于 2021-7-9 19:47
https://stackoverflow.com/questions/33530623/c-sharp-windows-form-transparent-background-image/33531 ...

谢谢,感觉代码量好多的样子

fszhang 发表于 2021-7-9 20:33:29

算了,放弃镂空窗体了,做一个全图片的吧,再用几行代码拖动窗体




      public Point startPoint;
      public bool pressed=false;
      public Form1()
      {
            InitializeComponent();
      }

      private void mouseDown(object sender, MouseEventArgs e)
      {
            startPoint = e.Location;
            pressed = true;
      }

      private void mouseMove(object sender, MouseEventArgs e)
      {
            if (pressed)
            {
                this.Location = new Point(this.Location.X + e.X - startPoint.X, this.Location.Y+ e.Y - startPoint.Y);         
            }
      }

      private void mouseUp(object sender, MouseEventArgs e)
      {
            pressed = false;
      }

wye11083 发表于 2021-7-9 21:53:08

win并不擅长干这些事。。你要用android等着力于用户体验的系统。

fszhang 发表于 2021-7-9 21:55:57

wye11083 发表于 2021-7-9 21:53
win并不擅长干这些事。。你要用android等着力于用户体验的系统。

可惜了,我这个只在Win上使用的程序,因为配置一次后就隐藏到系统栏,还可以接受

wudicgi 发表于 2021-7-9 23:35:22

需要一定量的代码, WinForm 的话可以看看这个项目,里边的 DirectUI 就是干这个的

https://github.com/anonymous5l/ncmdump-gui

wurst 发表于 2021-7-9 23:47:52

有两种方案:自定义不规则窗体,或是选择带透明的png作为背景图片

t3486784401 发表于 2021-7-10 11:24:15

原来MFC的时候,用SetWindowRgn做过不规则窗体,不足是没有羽化边缘。

Name_006 发表于 2021-7-10 11:35:50

可能你需要 wpf 来做。                                                                                                               

armstrong 发表于 2021-7-10 12:47:24

本帖最后由 armstrong 于 2021-7-10 12:54 编辑

wye11083 发表于 2021-7-9 21:53
win并不擅长干这些事。。你要用android等着力于用户体验的系统。

楼主位展示的就是Windows程序,你却说……
早在Windows 98年代,当时就流行一些桌面小精灵,可以鼠标交互,都是这种技术。

armstrong 发表于 2021-7-10 12:57:29

本帖最后由 armstrong 于 2021-7-10 13:02 编辑

给楼主一个示例,桌面小金鱼宠物,我在十几年前编译起来玩过,用的就是这种技术。
这种技术足以完成高帧率动画,而且是镂空的。
https://www.haolizi.net/example/view_10919.html
演示


源码

wye11083 发表于 2021-7-10 13:04:51

armstrong 发表于 2021-7-10 12:47
楼主位展示的就是Windows程序,你却说……
早在Windows 98年代,当时就流行一些桌面小精灵,可以鼠标交互 ...

是啊,没毛病啊,m$就是不擅长这种半透明啊。我所见过的所有程序基本只有破解器会用这种方式炫耀编程能力。

armstrong 发表于 2021-7-10 13:06:47

很多软件的启动或者关于界面也会使用这种技术,比如phtoshop:

armstrong 发表于 2021-7-10 13:08:02

本帖最后由 armstrong 于 2021-7-10 13:12 编辑

wye11083 发表于 2021-7-10 13:04
是啊,没毛病啊,m$就是不擅长这种半透明啊。我所见过的所有程序基本只有破解器会用这种方式炫耀编程能力 ...

你觉得这是炫耀,但其实很普通的效果而已,只要Ctrl+C和Ctrl+V就能搞定的东西。再说这种花里胡哨的界面,应用场景并不多,只在某些展示窗口用得到。

armstrong 发表于 2021-7-10 13:16:57

本帖最后由 armstrong 于 2021-7-10 13:18 编辑

如果要使整个窗口半透明,更简单,只要SetLayeredWindowAttributes函数就搞定了,连标题栏都半透明:

armstrong 发表于 2021-7-10 13:23:58

wye11083 发表于 2021-7-10 13:04
是啊,没毛病啊,m$就是不擅长这种半透明啊。我所见过的所有程序基本只有破解器会用这种方式炫耀编程能力 ...

一般情况下开发应用,都是先确定操作系统平台,不可能为了某个效果而换平台。所以你说要用androind根本不成立,还不如别回复。

fszhang 发表于 2021-7-10 13:25:51

armstrong 发表于 2021-7-10 12:57
给楼主一个示例,桌面小金鱼宠物,我在十几年前编译起来玩过,用的就是这种技术。
这种技术足以完成高帧率 ...

非常感谢,我正愁没有注册账号下载源码呢,现在马上试试。

modbus 发表于 2021-7-10 13:48:57

wye11083 发表于 2021-7-9 21:53
win并不擅长干这些事。。你要用android等着力于用户体验的系统。

这和WIN系统没关系,而和编程语言有关系,编程语言不做这功能只能自己码代码实现了

armstrong 发表于 2021-7-10 14:02:21

用二楼给的链接,帮楼主测试了一下,比金鱼更简单,因为它不需要动画。
https://stackoverflow.com/questions/33530623/c-sharp-windows-form-transparent-background-image/33531201


当然,关闭窗口按钮需要自己添加一个

Himem 发表于 2021-7-10 14:13:00

本帖最后由 Himem 于 2021-7-10 14:16 编辑

modbus 发表于 2021-7-10 13:48
这和WIN系统没关系,而和编程语言有关系,编程语言不做这功能只能自己码代码实现了 ...

本身就是靠win的layeredwindow机制,和语言毫无关

armstrong 发表于 2021-7-10 14:14:08

armstrong 发表于 2021-7-10 14:02
用二楼给的链接,帮楼主测试了一下,比金鱼更简单,因为它不需要动画。
https://stackoverflow.com/questio ...

这个方法不好,放在窗口上的按钮会消失不见,其实它存在,可以点击。

fszhang 发表于 2021-7-10 14:18:10

搞定了,12楼的方案,后面继续优化代码,因为不需要定时器刷新


      private Image FullImage
      {
            get
            {            
                return RotateTransformDemo.Properties.Resources.Picture10;
            }
      }

      public Bitmap FrameImage
      {
            get
            {
                Bitmap bitmap = new Bitmap(frameWidth, frameHeight);
                Graphics g = Graphics.FromImage(bitmap);
                g.DrawImage(FullImage, new Rectangle(0, 0, bitmap.Width, bitmap.Height), new Rectangle(0, 0, FullImage.Width, FullImage.Height), GraphicsUnit.Pixel);
                return bitmap;
            }
      }


armstrong 发表于 2021-7-10 14:18:41

Himem 发表于 2021-7-10 14:13
本身就是靠win的layerwindow机制,和语言毫无关

其实楼上说的可能是指:某种语言没有提供现成的库可用。比如C++标准库有Queue,Stack;那么对于C++这两个东西就直接可用。
如果C#在System.Windows.Forms命名空间里自带不规则窗口的函数,那么就说C#语言直接支持吧。

armstrong 发表于 2021-7-10 14:22:15

本帖最后由 armstrong 于 2021-7-10 14:25 编辑

记得镂空出是真正镂空,连鼠标事件也穿透的。你在圆角附近拖动鼠标试试看。

fszhang 发表于 2021-7-10 14:25:18

armstrong 发表于 2021-7-10 14:22
错了错了

可以交互,不过我这个应用无所谓了,我只需要一个外观漂亮的界面

armstrong 发表于 2021-7-10 14:37:18

fszhang 发表于 2021-7-10 14:25
可以交互,不过我这个应用无所谓了,我只需要一个外观漂亮的界面

这个方案有一个缺陷:窗口的控件都会看不见。如果是按钮还算好办,就是在背景图片上画出按钮,然后对应位置放置控件。但其它复杂控件就不好办了。
https://blog.csdn.net/jinjazz/article/details/1860437

armstrong 发表于 2021-7-10 15:01:12

本帖最后由 armstrong 于 2021-7-10 15:46 编辑

可能最实用的方法还是System.Drawing.Region对象。也就是9楼的SetWindowRgn方案的C#版。
下面这个是Region实现方法,供参考。

xstt 发表于 2021-7-10 19:14:38

WPF啊。简单

vtte 发表于 2021-7-10 20:47:55

用unity啊,多酷炫都行。

fszhang 发表于 2021-7-10 22:19:33

vtte 发表于 2021-7-10 20:47
用unity啊,多酷炫都行。

Unity我会做,你看一下我之前的帖子。我现在做的这个是一个轻量的后台驱动程序,界面是偶尔出来一下,Unity做太大了。

fszhang 发表于 2021-7-10 22:29:09

armstrong 发表于 2021-7-10 15:01
可能最实用的方法还是System.Drawing.Region对象。也就是9楼的SetWindowRgn方案的C#版。
下面这个是Region ...

你这个和我楼主位的差不多,在窗体属性最后面的那个透明颜色选择,你发的这个例程里面,被扣掉的是背景的颜色,就是属性里面设置的颜色,但没法处理羽化的透明图片。
页: [1]
查看完整版本: C#能开发半透明背景图片的窗体程序吗