gpt4 book ai didi

windows - Windows 窗体 ce 中 tabcontrol 的透明背景

转载 作者:可可西里 更新时间:2023-11-01 12:05:05 27 4
gpt4 key购买 nike

我正在尝试在紧凑型框架中自定义选项卡控件,但我找不到为此控件设置透明背景的解决方案。我正在尝试重写“OnPaintBackground()”方法以开始在其上设置背景,但未调用此函数。我如何使用这个函数在创建控件时被调用?

最佳答案

编辑:我阅读了您关于尝试设置容器而不是单个选项卡背景颜色的评论,并且我进行了一些试验和研究。

似乎 TabControl 类的 OnDrawItem 方法用于绘制选项卡“标题”(包含每个选项卡文本的控件部分,用户单击以选择选项卡),以及背景容器(除了所选选项卡的内容之外的所有内容,这些内容由选项卡本身在其 OnPaintBackground 方法中绘制)。

您可以通过覆盖其 OnDrawItem 方法使 TabControl 的背景透明,但简单地填充通过 DrawItemEventArgs 传递的边界也会使选项卡标题透明,使它们不可点击(点击将穿过表单,到达它后面的任何内容)。

在我看来,您有几个选项可以尝试解决此问题:

  1. 清除传递给 OnDrawItem 的边界,然后手动重绘每个 TabPage 的页眉。这是一个痛苦的过程,因为如果不使用页面文本、字体大小、边框以及谁知道其他什么来手动计算,就无法获得每个选项卡的标题。似乎没有任何公开的 API 用于从 TabControl 的背景中单独绘制 TabPages 的标题。
  2. 不是让 TabControl 的背景和 TabPages 的标题完全透明,而是只让它们半透明,让标题可以点击。这可能看起来不那么漂亮,但它比第一个选项容易得多。为此,您需要将表单的 AllowTransparency 属性设置为 true,然后使用以下代码:
    class TransparentisTabControl : TabControl    {        //Without declaring this as new, you'd probably get a warning saying this property hides a member of the base class.        //The base class's BackColor property, as I'm sure you've found out,        //is hidden with attributes anyway, so it doesn't really matter.        public new Color BackColor {get; set;}        public TransparentishTabControl(Color backColor)        {            if (backColor.A == 0)                throw new ArgumentException("The alpha component of backColor cannot be zero, or this TransparentisTabControl's tab pages won't be selectable.");            BackColor = backColor;        }        protected override void OnDrawItem(DrawItemEventArgs e)        {            base.OnDrawItem(fake);            e.Graphics.Clear(BackColor);        }    }

This code works fine for me, but it might behave differently on your target platform. Let me know if you need any more help/clarification :)

Are you trying to make the tab control transparent, or the individual tab pages? Overriding OnPaintBackground in a TabControl-derrived class isn't enough because each TabPage paints itself as well. You need a custom class that is derived from TabPage and has an override of OnPaintBackground.

    class TransparentTabPage : TabPage
{
public TransparentTabPage()
: base("TransparentTabPage")
{

}

protected override void OnPaintBackground(PaintEventArgs e)
{
base.OnPaintBackground(e);

Form form = FindForm();

e.Graphics.CompositingMode = CompositingMode.SourceCopy;
using (SolidBrush sb = new SolidBrush(form.TransparencyKey))
e.Graphics.FillRectangle(sb, Bounds);
}
}

为此,您的表单需要将其 TransparencyKey 设置为某个值,并且其 AllowTransparency 属性的值必须为真。

关于windows - Windows 窗体 ce 中 tabcontrol 的透明背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5774485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com