在组件上画线

2024-05-06

我有一个包含 2 列的表,在其中一列中我有一个由我创建的组件。我想在此表中画一条线放在前面,但是当我尝试使用我发布的代码时,该线位于我创建的其他组件后面

 public void CoTableLayoutPanel2_Paint(object sender, PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.FillRectangle(new SolidBrush(Color.Black), 0, 50, this.Width, 1);

    }

这是一个例子构成通过让图形所有嵌套控件都绘制其图形部分到他们自己身上。

诀窍是让他们都参与并改变Graphics使复合无缝。

请注意,并非所有控件都支持Paint适当地举办活动;最值得注意的是遗产TextBox不会一起玩..

为了使其工作,我创建了一个类来存储图形数据;这很简单。对于更多涉及的东西,人们可以简单地扩展它......:

public class DrawAction
{
    public Point p1 { get; set; }
    public Point p2 { get; set; }
    public Color c1 { get; set; }
    public int mode { get; set; }

    public DrawAction(Point p1_, Point p2_, Color c_, int mode_)
    {
        p1 = p1_; p2 = p2_; c1 = c_; mode = mode_;
    }

    public void Draw(Graphics g)
    {
        switch (mode)
        {
            case 0: // line
                using (Pen pen = new Pen(c1)) 
                  g.DrawLine(pen, p1, p2);
                break;
            case 1: // rectangle
                using (Pen pen = new Pen(c1)) 
                  g.DrawRectangle(pen, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.Y);
                break;
            case 2: // filled rectangle
                using (SolidBrush brush = new SolidBrush(c1)) 
                  g.FillRectangle(brush, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.Y);
                break;
            default:
                break;
        }
    }
}

我不会显示代码UserObject。它包含一些控件,包括GroupBox with a Radiobutton在其中表明深度嵌套的控件仍然有效。

班级有一个Draw可以调用的方法,传入一个有效的Graphics object.

为了初始化,我们使用以下代码:

void initPainting(Control parent, Control baseCtl)
{
    foreach (Control ctl in parent.Controls)
    {
        ctl.Paint += (s, e) =>
        {
            foreach (var drawing in drawings)
            {
                Point offset = 
                     baseCtl.PointToClient(ctl.PointToScreen(Point.Empty));

                Graphics g = e.Graphics;
                g.TranslateTransform(-offset.X, -offset.Y);
                drawing.Draw(g);
                g.ResetTransform();

            }
        };
        initPainting(ctl, baseCtl);  // recursion
    }
}

我使用 lambda 来连接Paint所有控件的事件。

方法是递归的捕获公共父控件内的所有控件。

这是图形列表..

 List<DrawAction> drawings = new List<DrawAction>();

及其初始化:

    ..
    InitializeComponent();
    Size sz = tableLayoutPanel1.Size;
    drawings.Add(
      new DrawAction(Point.Empty, new Point(sz.Width, sz.Height), Color.Red, 0));
    drawings.Add(
      new DrawAction(new Point(0, sz.Height), new Point(sz.Width, 0), Color.Blue, 0));
    drawings.Add(
      new DrawAction(new Point(50, 50), new Point(300, 300), Color.Green, 1));

    initPainting(tableLayoutPanel1, tableLayoutPanel1);

这是结果和设计者的视图:

您可以看到TextBoxes不要一起玩;还有一个小故障GroupBoxes,不知道为什么..

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在组件上画线 的相关文章

随机推荐

  • 如何快速更改 SKSpriteNode 的颜色?

    我创建了一个游戏SKSpriteNode那是黑色的 当用户触摸屏幕时我想要SKSpriteNode更改为白色 我已经用谷歌搜索了一切 并尝试了很多不同的策略 但没有成功 有谁知道如何做到这一点 这是我的场景的代码 var blackBird
  • 将 ART.xcodeproj 添加到 Library 后 Xcode 崩溃

    我正在使用 React Native 开发一个应用程序 将 ART xcodeproj 添加到 Library 后 Xcode 崩溃了 这是版本信息 版本 9 0 beta 4 9M189t Some 崩溃的日志如下 Process Xco
  • 通过鼠标和触摸在画布上绘图

    我想在画布上绘图 使用鼠标效果很好 但我必须如何修改代码才能使其在 iPad 或 Nexus 上运行 link http jsfiddle net FgNQk 6 var canvas document getElementById can
  • PHP-MySQL 或 MySQLi 中哪个最快?

    我想知道是否有人对这种二分法有任何第一手经验 一些博客说 mysql 扩展比 mysqli 更快 这是真的 我只是问速度 我知道 mysqli 具有旧扩展中不存在的功能 在我看到的大多数基准测试中 MySQL 扩展比 MySQLi 稍快一些
  • 无逻辑模板(例如胡子)有什么优点?

    最近 我遇到了mustache http mustache github com 据称是无逻辑模板 然而 没有解释为什么它是以无逻辑的方式设计的 换句话说 无逻辑模板的优点是什么 换句话说 它可以防止你搬起石头砸自己的脚 在过去的 JSP
  • .NET VM 是编译器还是解释器?

    NET 的虚拟机是编译 CIL 字节码 然后在最低级别 CPU 汇编程序 执行代码 还是解释器 读取以下指令并执行它们 NET 的虚拟机吗 编译 CIL 字节码 然后 在最低级别执行代码 CPU 汇编器 是的 它是 CLR 的一个组件 称为
  • 如何计算两个字符串向量之间的余弦相似度

    我有 2 个维度为 6 的向量 我想要一个介于 0 和 1 之间的数字 a c HDa 2Pb 2 BxU BuQ Bve b c HCK 2Pb 2 09 F G 谁能解释我应该做什么 使用lsa包和该包的手册 create some f
  • 从我的应用程序阻止/取消阻止应用程序:Android

    我想从我的应用程序阻止 取消阻止 用户无法使用 访问被阻止的应用程序 Android 设备中的某些应用程序 但我找不到任何解决方案 想法 I read Android如何以编程方式隐藏启动器图标 https stackoverflow co
  • Codeigniter 分页不呈现分页链接

    你好我有以下代码 this gt load gt library pagination this gt data products this gt products model gt get products and category th
  • 声纳+MS SQL数据库

    我正在尝试使用 mssql 服务器数据库初始化声纳 但我不能 使用 Microsoft SQL Server Management Studio 我创建了用户名 sonar 和密码 sonar 的用户 并向同时创建的 sonar 数据库授予
  • Python twill:下载可通过 PHP 脚本访问的文件

    I use twill在受登录表单保护的网站上导航 from twill commands import go http www example com login index php fv login form identifiant l
  • Android 自定义视图忽略 XML 中的“android:enabled”?

    我正在设置android enabled false 在自定义视图上 但它似乎对isEnabled 财产 这是一个简单的测试用例 public class TestView extends View public TestView Cont
  • .NET(或 MFC)的高速图形控件?

    我需要编写一个数字示波器类型的应用程序 有很多很棒的静态绘图控件 但我需要一些可以绘制每秒处理 4000 个样本的 16 条轨迹的东西 有人知道 NET 的高速图形控件吗 我什至会选择 MFC 因为它可以封装到 NET 控件中 谢谢您的帮助
  • PHP 中的 MPTT(修改的先序树遍历)问题

    我的第一篇文章在这里 看来这是一个变得明智的地方 我目前正在进行一些测试 第一次尝试使用 MPTT 修改的预序树遍历 方法在 PHP 的帮助下将数据存储在 Mysql 数据库中 但是 我试图找到最注重性能的方法来获取特定级别上的所有列表元素
  • 从 Vowpal Wabbit 的内存中读取数据?

    有没有办法发送数据来训练 Vowpal Wabbit 中的模型而不将其写入磁盘 这就是我正在尝试做的事情 我有一个相对较大的 csv 数据集 大约 2gb 可以毫无问题地容纳在内存中 我将它在 R 中加载到数据框中 并且有一个函数将该数据框
  • 如何在 C# 中创建可以转换为 DateTime 的类?

    我怎样才能制作可以转换为 DateTime 的类 但我需要在班级拥挤的时候进行选角 例如 object date1 new MyDateTime DateTime date2 DateTime date1 我直接需要这个工作示例 我知道怎么
  • SWRevealViewController 在滑动时关闭键盘

    我在用SWRevealViewController https github com John Lluch SWRevealViewController在我的应用程序中 我遇到了问题 我在场景中有一个文本字段 如果我在键盘打开时向左滑动 则
  • 如何判断谁登录了 SQL Server

    我正在设计一个应用程序 我正在寻找最好的方法来告诉谁当前登录到 SQL Server 我将使用 SSMS 内置的活动监视器 它显示访问服务器的所有进程的列表 非常酷 但是 如果在我的 NET 代码中 每次访问数据库时它都使用单独的连接 那么
  • 使用文本文件中的 var

    我的问题是 我想使用由从文本文件中在 carac 中接收的关键字启动的函数 并在该函数中使用 carac 之后的字符串 该函数位于包含的其他文件中 但我不知道该怎么做 for std string carac fichier gt gt c
  • 在组件上画线

    我有一个包含 2 列的表 在其中一列中我有一个由我创建的组件 我想在此表中画一条线放在前面 但是当我尝试使用我发布的代码时 该线位于我创建的其他组件后面 public void CoTableLayoutPanel2 Paint objec