【问题标题】:WinForms - groupBox as in WinApiWinForms - 在 WinApi 中的 groupBox
【发布时间】:2016-04-18 21:05:16
【问题描述】:

Win32 API 中,BS_GROUPBOX 只是创建了一个“按钮”,它基本上被绘制为一个组,它不用作任何其他控件的容器。

在 WinForms 中,这个概念发生了变化,GroupBox 实际上是一个容器。

我正在将一个旧的Win32 应用程序移植到WinForms,我通过解析Win32 API 对话框定义字符串在运行时生成对话框表单。一切正常,除了这些 groupBoxes,我在 .NET 世界中找不到替代品。

我如何获得一个不作为.NET GroupBox 拥有任何所有权的控制ala Win32 GroupBox?

谢谢

【问题讨论】:

  • 看看this,它确实看起来好像总是包含一组控件,而不是真正用作按钮。那么为什么不使用 GroupBox 控件呢?
  • 我查了那篇文章,上面写的很清楚,那个groupBox主要是为了创建视觉组而已。 GroupBox 是一个容器,在解析字符串并将控件放置在正确的父级时会产生很多问题。
  • 如果它可以帮助您可以将控件放在而不是放入 GroupBox;例如在设计器中通过键盘移动它,在代码中通过简单地不将它们添加到 GB 的 Controls 集合中。
  • 是的,问题是我们在这些组下有控件,所以现在表单是空的:)
  • 设置 z 顺序应该会有所帮助,不是吗?把它弄好也一定是原始代码的一部分,不是吗?还是原来的“组按钮”也是透明的?

标签: c# .net winforms winapi


【解决方案1】:

毕竟我通过在 .NET 中创建一个透明 GroupBox 解决了这个问题。这是代码。

 public sealed class IGTransparentGroupBox : GroupBox
    {
        public IGTransparentGroupBox()
        {
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            SetStyle(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 OnBackColorChanged(EventArgs e)
        {
            Parent?.Invalidate(Bounds, true);
            base.OnBackColorChanged(e);
        }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多