控件不透明效果

.Net技术 码拜 9年前 (2016-05-11) 1310次浏览
本人想设置控件不透明的效果,例如
控件不透明效果
但是假如winform透明了,图片也就透明了
能不能winform透明,但是图片不透明
图片是个picturebox控件
解决方案

10

先上图(本该是上动画的,但是截不下来)
控件不透明效果
再上码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
namespace 半透
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            TransparencyKey = BackColor;
            DoubleBuffered = true;
        }
        
        protected override void OnLoad(EventArgs e)
        {
            RegionCopy();
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            RegionCopy();
        }
        private void Form1_Move(object sender, EventArgs e)
        {
            RegionCopy();
        }
        void RegionCopy()
        {
            Image objImage = new Bitmap(Width, Height);
            Graphics gd = Graphics.FromImage(objImage);
            var r = ClientRectangle; 
            Point f = this.PointToScreen(new Point(0, 0));
            
            gd.CopyFromScreen(f, new Point(0, 0), new Size(r.Width, r.Height));
            IntPtr dc1 = gd.GetHdc();
            gd.ReleaseHdc(dc1);
            float k = 0.3f;
            float[][] nArray =
            {
                new float[] {k, 0, 0, 0, 0},
                new float[] {0, k, 0, 0, 0},
                new float[] {0, 0, k, 0, 0},
                new float[] {0, 0, 0, k, 0},
                new float[] {0, 0, 0, 0, k}
            };
            ColorMatrix matrix = new ColorMatrix(nArray);
            ImageAttributes attributes = new ImageAttributes();
            attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
            gd.DrawImage(objImage, new Rectangle(0, 0, this.Width, this.Height), 0, 0, objImage.Width, objImage.Height, GraphicsUnit.Pixel, attributes);
            BackgroundImage = objImage;
        }
    }
}

30

引用:

窗体并非总在前面,当你滚动了一下浏览器滚动条是,窗体已经被浏览器遮挡了
当你通过状态栏或窗体为遮挡的部分,重新使窗体位于前面时,必然发生刷新而更换背景
所以,你说的坑只能埋你本人

至于你说的 RegionCopy 的所谓严重问题,你只要实际运行一下就知道,是并不存在的
这是 TransparencyKey = BackColor; 的功劳
只是这样的窗体,只能用 Prlsc Sys Rq 键截屏或截窗口,用截图工具是截不了的
再说,图中已经显示的是被窗体覆盖的区域了,再问 怎么样copy到窗体背后的图像 不显得很幼稚了吗?

第一个问题 就算本人窗体不是 TopMost 那么本人窗体在浏览器上 浏览器上面窗体背后正好是一张GIF动态图呢?。
控件不透明效果
就像这样。
还有这不是在埋本人 而是有问题就得面对 而不是逃避问题的说“你非要置顶什么之类的”“本人给本人埋坑什么的”
既然本人都放出本人截图了 那就说明 本人已经运行过代码了 才说话的 而且在本人机器上就算是move也没有刷新图像 但是move事件肯定是被触发了的
就像本人上面说的 本人窗体往右边移动了20个像素 那么窗体被移动到一个新的区域上面触发move事件 问一下你窗体上显示的是新的区域的图像吗?所以说 你的代码 在本人电脑上 无论本人怎么移动都是初始图像 原因是移动到新的区域上面 然后触发move事件 截取到的都是本人本身的图像 而本身则又是上一次move的图像 除非最小化再最大化之类的 才会截取到新的图像
还有一点 提出质疑搞的来好像本人是故意在拆你台一样 不显得很幼稚吗?


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明控件不透明效果
喜欢 (0)
[1034331897@qq.com]
分享 (0)