求教控件透明度问题

xfy_ 2018-01-22 05:13:07
请教大佬一个问题:
控件可以设置透明度吗? 窗体有个opacity属性,控件没有找到,各位大佬有可以实现的思路吗?

在重绘里面这样写,完全不管用 .
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(this._opacity, this.BackColor)),
this.ClientRectangle);

...全文
676 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
xfy_ 2018-01-26
  • 打赏
  • 举报
回复
引用 21 楼 xuzuning 的回复:
大佬, 我给widget_button自定义控件中画图,画完之后,他就遮挡住左上对其的text值, 这时候我可以使用drawstring()来画出来text值,但是其他文本对齐的时候需要做很多判断,而且text值为止,使用drawstring有点难控制,您有其他思路亲赐教
 g.DrawImage(ForeImage, new Rectangle(new Point(0, 0), ForeImage.Size));
xfy_ 2018-01-24
  • 打赏
  • 举报
回复
引用 21 楼 xuzuning 的回复:
你都需要有相应的代码来解释 FlatStyle 属性所起的作用 FlatStyle 可译为扁平化风格,那么 扁平化风格 是什么样子的呢?如何绘制,是要你自己写代码实现的
我感觉我绕进死胡同了, 既然widget_button没有继承button, 也就没有btn的FlatStyle 属性,我觉得所以就没法设置FlatStyle 属性; 就相当于 要去上海浦东区,人没到上海这个条件,接下来就没法到浦东区
xuzuning 2018-01-24
  • 打赏
  • 举报
回复
如果 rtgui_BaseWidget 没有 FlatStyle 属性 那么 widget_button 显然也不会有 无论是在 widget_button 还是 rtgui_BaseWidget 中定义一个 FlatStyle 属性 你都需要有相应的代码来解释 FlatStyle 属性所起的作用 FlatStyle 可译为扁平化风格,那么 扁平化风格 是什么样子的呢?如何绘制,是要你自己写代码实现的
xfy_ 2018-01-24
  • 打赏
  • 举报
回复

拖出来的btn不显示text的值,属性里有的,需要在控件OnPaint()里面进行画文本吗还是?
xfy_ 2018-01-24
  • 打赏
  • 举报
回复
引用 17 楼 lkf181 的回复:
win32 API?
不是开发API
xfy_ 2018-01-24
  • 打赏
  • 举报
回复
引用 15 楼 xuzuning 的回复:
基本属性当然可以 个性属性还是要单独些的 不然不都一样了吗?
我定义一个基本控件baseWidget, 然后再定义控件的时候直接继承它,就像这样,我设置btn的外观,因为它没有关于btn的信息,无法进行设置
 public partial class widget_button : rtgui_BaseWidget
    {
        public widget_button()
        {
            InitializeComponent();
            this.FlatStyle = System.Windows.Forms.FlatStyle.Flat; //在这里报错
        }
    }
我在下面生成对应属性
public FlatStyle FlatStyle { get; private set; } // 这个属性需要进行别的操作吗?
我刚接触自定义控件,有些东西不是太懂,麻烦您讲解一下
threenewbee 2018-01-23
  • 打赏
  • 举报
回复
不可以。opacity属性是对SetLayeredWindowAttributes这个api函数的包装,但是它只能支持窗口。
xuzuning 2018-01-23
  • 打赏
  • 举报
回复
你基础类中没有的属性并在派生类中也未声明,自然都是未定义 但是即便你自己定义了一个 TextAlign,也不会自动就有文字对齐的行为的,渲染时还是需要写代码的
xfy_ 2018-01-23
  • 打赏
  • 举报
回复
引用 9 楼 xuzuning 的回复:
但是方法并没有改变,我只是举个例子 所有的 控件都继承于 Control,包括 Form 只是 panel 没有特定行为,所以用它为例
比如我自定义button控件时,需要对text进行对齐,使用
this.TextAlign = ContentAlignment.MiddleCenter;
时,说TextAlign未定义. 现在我是这样的情况: 自定义个基础控件(baseWidget),里面有控件的部分基本属性,类似于control, 后面自定义控件的时候,就在这个baseWidget上面进行自定义其他的控件来使用
xuzuning 2018-01-23
  • 打赏
  • 举报
回复
但是方法并没有改变,我只是举个例子 所有的 控件都继承于 Control,包括 Form 只是 panel 没有特定行为,所以用它为例
xfy_ 2018-01-23
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
继承于 Panel 即可 一定想要 opacity属性,可以从 Form 继承
非常感谢, 继承panel时候确实可以达到透明效果. 但是我这边自定义很多控件, 控件继承label, button之后,就不能继承第二个基类panel了,
xuzuning 2018-01-23
  • 打赏
  • 举报
回复
继承于 Panel 即可
    public class TransparentPanel : Panel
{
public TransparentPanel()
{
SetStyle(ControlStyles.SupportsTransparentBackColor
| ControlStyles.Opaque,
true);
BackColor = Color.Transparent;
}

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | 0x20;
return cp;
}
}

protected override void OnPaint(PaintEventArgs e)
{
if (BackColor != Color.Transparent)
{
var bounds = new Rectangle(0, 0, Width - 1, Height - 1);
const int alpha = 128;

using (var bckColor = new SolidBrush(Color.FromArgb(alpha, BackColor)))
{
e.Graphics.FillRectangle(bckColor, bounds);
}
}
base.OnPaint(e);
}

protected override void OnBackColorChanged(EventArgs e)
{
//Parent?.Invalidate(this.Bounds, true);
base.OnBackColorChanged(e);
}

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

一定想要 opacity属性,可以从 Form 继承
xfy_ 2018-01-23
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
winform 控件架是20年前的东西,它不容易扩展修改,而且功能很少。你自己开发一整套此平台的底层控件,否则最好就不要使用winform。
水平有限,自己开发搞不来,现在先想想其他办法,后面再解决
xfy_ 2018-01-23
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
不可以。opacity属性是对SetLayeredWindowAttributes这个api函数的包装,但是它只能支持窗口。
是嘞,我也查了,控件没有这个属性,
xfy_ 2018-01-23
  • 打赏
  • 举报
回复
引用 1 楼 xianfajushi 的回复:
嵌套窗体,变通一下
是做自定义控件,嵌套窗体估计行不通吧~
  • 打赏
  • 举报
回复
winform 控件架是20年前的东西,它不容易扩展修改,而且功能很少。你自己开发一整套此平台的底层控件,否则最好就不要使用winform。
xuzuning 2018-01-23
  • 打赏
  • 举报
回复
基本属性当然可以 个性属性还是要单独些的 不然不都一样了吗?
xuzuning 2018-01-23
  • 打赏
  • 举报
回复
要不 sp 怎么会让你 自己开发一整套此平台的底层控件
xfy_ 2018-01-23
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
你基础类中没有的属性并在派生类中也未声明,自然都是未定义 但是即便你自己定义了一个 TextAlign,也不会自动就有文字对齐的行为的,渲染时还是需要写代码的
能不能通过写一个类或者什么, 里面定义这些公共属性(X,Y,Width,Height,等), 别的控件通过调用这些属性来实现? 这种有没有可能?
zhang__hang 2018-01-23
  • 打赏
  • 举报
回复
引用 10 楼 HonSinsin 的回复:
[quote=引用 9 楼 xuzuning 的回复:] 但是方法并没有改变,我只是举个例子 所有的 控件都继承于 Control,包括 Form 只是 panel 没有特定行为,所以用它为例
比如我自定义button控件时,需要对text进行对齐,使用
this.TextAlign = ContentAlignment.MiddleCenter;
时,说TextAlign未定义. 现在我是这样的情况: 自定义个基础控件(baseWidget),里面有控件的部分基本属性,类似于control, 后面自定义控件的时候,就在这个baseWidget上面进行自定义其他的控件来使用[/quote] 非常有意义
加载更多回复(2)

110,533

社区成员

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

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

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