C#如何做一个半透明的panel,使得可以透出窗体的背景

gg_1986 2014-09-01 02:46:57
如标题所示,如何做一个半透明的panel,使得可以透出窗体的背景。本人是想在别人做好的UI按钮上直接画个panel或者picturebox点击或者鼠标移动到那里的时候使panel,的背景色改变,如何实现?或者各位大侠,能告诉我在别人做好的整张图片上怎么实现点击按钮处,按钮有反应,这个按钮没有抠出来哦,是在窗口背景的整张图片中的。
...全文
16429 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystal_lz 2017-01-16
  • 打赏
  • 举报
回复
设置 parent 设置 background
zyfhongyang 2017-01-16
  • 打赏
  • 举报
回复
对应控件多次切换显示,效果就不来了,例如把窗体拖到显示区域外,再拖回来,或者tabpage页签切换。
失落的神庙 2014-09-02
  • 打赏
  • 举报
回复
picturebox 需要放在容器控件里面才能实现半透明。 比如 picturebox 背景是 0,0,0 把他放在 背景是 80,0,0,0 的panel里 就可以实现半透明。 其它控件直接设置背景色即可
失落的神庙 2014-09-02
  • 打赏
  • 举报
回复 1
panel1.BackColor = Color.FromArgb(80, 255, 0, 0);
前面的80设置255为不透明。 ARGB 后面3位是rgb值 不谢
gxingmin 2014-09-01
  • 打赏
  • 举报
回复
上面的 public TransparentInfo() 改成 public PanelEx()
gxingmin 2014-09-01
  • 打赏
  • 举报
回复
可以重绘Panel,参考下这个代码
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

namespace Monitor
{
    public partial class PanelEx : System.Windows.Forms.Panel
    {
        private string m_strInfo;
        public void ShowInfo(string strInfo)
        {
            m_strInfo = strInfo;
            this.Invalidate();
        }

        private void PanelEx_MouseEnter(object sender, EventArgs e)
        {
            this.Visible = true;
        }

        public bool drag = false;
        public bool enab = false;
        private Color fillColor = Color.White;
        private int opacity = 50;
        private int alpha;

        public TransparentInfo()
        {
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            SetStyle(ControlStyles.Opaque, true);
            this.BackColor = Color.Transparent;
        }

        public Color FillColor
        {
            get
            {
                return this.fillColor;
            }
            set
            {
                this.fillColor = value;
                if (this.Parent != null) Parent.Invalidate(this.Bounds, true);
            }
        }

        public int Opacity
        {
            get
            {
                if (opacity > 100) { opacity = 100; }
                else if (opacity < 1) { opacity = 1; }
                return this.opacity;
            }
            set
            {
                this.opacity = value;
                if (this.Parent != null) Parent.Invalidate(this.Bounds, true);
            }
        }

        //protected override CreateParams CreateParams
        //{
        //    get
        //    {
        //        CreateParams cp = base.CreateParams;
        //        cp.ExStyle |= 0x20;
        //        return cp;
        //    }
        //}
石头  16:55:08
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1);

            Color frmColor = this.Parent.BackColor;
            Brush brushColor;
            Brush bckColor;

            alpha = (opacity * 255) / 100;

            if (drag)
            {
                Color dragFillColor;
                Color dragBckColor;

                if (BackColor != Color.Transparent)
                {
                    int Rb = BackColor.R * alpha / 255 + frmColor.R * (255 - alpha) / 255;
                    int Gb = BackColor.G * alpha / 255 + frmColor.G * (255 - alpha) / 255;
                    int Bb = BackColor.B * alpha / 255 + frmColor.B * (255 - alpha) / 255;
                    dragBckColor = Color.FromArgb(Rb, Gb, Bb);
                }
                else dragBckColor = frmColor;

                if (fillColor != Color.Transparent)
                {
                    int Rf = fillColor.R * alpha / 255 + frmColor.R * (255 - alpha) / 255;
                    int Gf = fillColor.G * alpha / 255 + frmColor.G * (255 - alpha) / 255;
                    int Bf = fillColor.B * alpha / 255 + frmColor.B * (255 - alpha) / 255;
                    dragFillColor = Color.FromArgb(Rf, Gf, Bf);
                }
                else dragFillColor = dragBckColor;

                alpha = 255;
                brushColor = new SolidBrush(Color.FromArgb(alpha, dragFillColor));
                bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor));
            }
            else
            {
                Color color = fillColor;
                brushColor = new SolidBrush(Color.FromArgb(alpha, color));
                bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor));
            }

            if (this.BackColor != Color.Transparent | drag)
            {
                g.FillRectangle(bckColor, bounds);
            }

            if(m_strInfo!=null && m_strInfo.Length>0)
            {
                g.DrawString(m_strInfo, this.Font, new SolidBrush(this.ForeColor), 10, 10);
            }

            brushColor.Dispose();
            bckColor.Dispose();
            g.Dispose();

            base.OnPaint(e);
        }

        protected override void OnBackColorChanged(EventArgs e)
        {
            if (this.Parent != null) Parent.Invalidate(this.Bounds, true);
            base.OnBackColorChanged(e);
        }

        protected override void OnParentBackColorChanged(EventArgs e)
        {
            this.Invalidate();
            base.OnParentBackColorChanged(e);
        }
    }


}
assky124 2014-09-01
  • 打赏
  • 举报
回复
控件的BackColor=Transparent
gg_1986 2014-09-01
  • 打赏
  • 举报
回复
谢谢回复,就是给整个窗口设置张图片作为背景,这张图片上有按钮这些,我在按钮这个地方画个picturebox,点击picturebox就相当于点击了这个按钮事件,这个好处就是不用我重绘界面了,用背景就可以了,有个问题就是,我点击这个按钮的时候,图片是没反应的,所以我想做个控件,设置其半透明,点击这个picturebox的时候使按钮看起来有反应,不知道我说明白了没有
Cnwanglin 2014-09-01
  • 打赏
  • 举报
回复
button.bringtofront ?? 没理解你的需求

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧