使用 Graphics.DrawImage 在 C# 中创建自定义选项卡

2024-02-26

我有一个项目,您可以在其中添加和删除选项卡(如网络浏览器)。到目前为止我有这个:

//Button to add a new tab page
    private void cb_addPage_Click(object sender, EventArgs e)
    {
        string title = "TabPage " + (tabControl1.TabCount + 1).ToString() + "   ";
        TabPage myTabPage = new TabPage(title);
        tabControl1.TabPages.Add(myTabPage);
        tabControl1.SelectedTab = myTabPage;
    }


//Form1_Load
    private void Form1_Load(object sender, EventArgs e)
    {
        tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
        cb_addPage.Top = tabControl1.Top;
        cb_addPage.Left = tabControl1.Right - cb_addPage.Width;
        foreach (TabPage tp in tabControl1.TabPages) tp.Text += "   ";
    }

    Rectangle closeX = Rectangle.Empty;

//Sets background and places the X button on each tab
    private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
    {
        Size xSize = new Size(15, 15);
        TabPage tp = tabControl1.TabPages[e.Index];
        e.DrawBackground();
        using (SolidBrush brush = new SolidBrush(e.ForeColor))
            e.Graphics.DrawString(tp.Text + "   ", e.Font, brush,
                                  e.Bounds.X + 3, e.Bounds.Y + 4);

        if (e.State == DrawItemState.Selected)
        {
            closeX = new Rectangle(e.Bounds.Right - xSize.Width - 3, 
                           e.Bounds.Top + 5, xSize.Width, xSize.Height);
            e.Graphics.DrawImage(imageList1.Images[0], closeX, 
                         new Rectangle(0,0,16,16), GraphicsUnit.Pixel );
        }

    }

//Removes current tab (from X button)
    private void tabControl1_MouseClick(object sender, MouseEventArgs e)
    {
        if (closeX.Contains(e.Location))
            tabControl1.TabPages.Remove(tabControl1.SelectedTab);
    }

因此,这一切所做的就是让您添加带有按钮的选项卡,并且在每个单独的选项卡上都有一个X按钮删除选项卡。

我用过Graphics.DrawImage显示自定义X按钮(位于图像列表中)。但是,我将如何使用来制作自定义选项卡Graphics.DrawImage.

总而言之,我想要选项卡,但我希望它们是我制作的自定义图像,这样看起来更好。 - 谢谢


你的问题不是很清楚。也许您想在每个选项卡上显示不同的文本。您可以使用TextRenderer这样做:

const TextFormatFlags flags = TextFormatFlags.PreserveGraphicsClipping |
    TextFormatFlags.VerticalCenter;

TextRenderer.DrawText(e.Graphics, tp.Text, tp.Font, e.Bounds, tp.ForeColor, flags);

在文本前面添加一些空格以便为 X 留出空间,或者为文本定义新的坐标

const int XCrossWidth = 20;
Rectangle textRect = new Rectangle(e.Bounds.Left + XCrossWidth,  e.Bounds.Top,
                                   e.Width - XCrossWidth, e.Height);

并将其替换为e.Bounds in TextRenderer.DrawText(...).


UPDATE

因此您想在选项卡上显示自定义图像。我假设您已将这些图像放入imageList1。您如何知道其中哪些显示在哪个 TabPage 上?

您可以创建自己的选项卡页类并使用这个类来代替TabPage.

public TabPageEx : TabPage
{
    public int ImageIndex { get; set }
}

现在将该属性设置为适当的图像索引。

TabPageEx myTabPage = new TabPageEx(title);
myTabPage.ImageIndex = 3; // As an example.
tabControl1.TabPages.Add(myTabPage);

然后你可以用以下命令绘制图像

TabPageEx tp = (TabPageEx)tabControl1.TabPages[e.Index];

...

Rectangle imageRect = new Rectangle(e.Bounds.Left + 20,  0, 16, 16);
e.Graphics.DrawImage(imageList1.Images[tp.ImageIndex], imageRect);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Graphics.DrawImage 在 C# 中创建自定义选项卡 的相关文章

随机推荐

  • 如何使用 Angular 过滤器对数据进行分组?

    我有一份球员名单 每个球员都属于一个组 如何使用过滤器列出每个组的用户 name Gene team team alpha name George team team beta name Steve team team gamma name
  • jdk1.6内存布局

    我使用的是jdk1 6 我配置了 Xmx 2G Xms 2G 新尺寸 最大新尺寸 660m 我启用了详细GC 我看到了这一点 但我不明白 PSYoungGen total 608256K used 32440K eden space 540
  • 我应该有多少个 DBContext

    使用实体 我目前拥有 dbcontext 其中包含每个表 我想知道是否每个人都这样做 或者例如每个模块都有一个上下文 对我来说 dbcontext 是一种将模型映射到数据库的连接 并且由于只有一个数据库 所以我只需要一个 在我深入讨论之前
  • 防止登录请求泛滥的简单方法?

    如果我的网站使用 POST 表单进行登录 有什么快速 简单的方法可以防止恶意客户端向我的 Web 服务器发送大量 POST 请求 试图暴力破解我的用户帐户 PHP MySQL Apache 防止暴力破解比乍看起来要棘手 解决方案是组合控制
  • 对象、类、函数

    我想知道 JavaScript 对象 类和函数之间有什么区别 我认为类和函数是对象类型是正确的吗 类和函数的区别是什么 或者它们真的是同一件事 只是它们的术语根据它们的使用方式而变化 function func alert foo a fu
  • vscode 选择不寻常的自动完成选项

    在使用最新版本的 Visual Studio Code 时 我正在编辑 JavaScript 文件 并且经常希望将输出记录到控制台 我创建了一个用户片段 以便更容易自动完成 但我发现自动完成中获得的默认选项是下面红色突出显示的选项 而不是绿
  • 重载不明确(int -> int64_t 与 int -> double)

    为什么是隐式转换int to int64 t vs int to double模糊的 我本以为积分重载会优先于浮点积分 include
  • 无法将 X 用作 Y,因为该名称已在使用中,即使尚未使用

    我使用的是 PHP 5 4 并且具有类似于以下内容的 PSR 0 类结构 A Library Session php namespace A Library class Session 我的 应用程序 Session php namespa
  • Kendo UI 指令要求 jQuery 在 AngularJS 之前可用。请在文档中的 Angular 之前包含 jquery

    我有一个带有角度应用程序的 Mvc 有两个布局文件 登录布局 默认布局 主布局 单击 影片 按钮时 调用 影片控制器 和 影片动作 public ActionResult Movie return View 它使用 mainlayout 文
  • 如何编写具有默认值和选项的 tcl 程序?

    我正在尝试编写一个 tcl 程序 它执行以下操作 proc myProc arg1 def1 arg2 def2 tcl gt myProc arg1 val1 arg2 val2 arg1 variable has val1 arg2 v
  • Maven Buildnumber 插件 - Git

    Maven Buildnumber 插件似乎还不能与 GIT 一起使用 暂时有解决办法吗 我最近从 SVN 切换到 GIT 发现这是一个简单的过渡 但这是我目前唯一没有做的事情 Walter 我使用这个 Maven 插件 https git
  • 茉莉花角度单元测试'无法读取未定义的'属性'

    我刚刚开始学习角度单元测试 但是 对具有 http 调用的函数的此测试失败 我已经指出了问题 但我无法解决它 我知道这是一个简单的问题 控制器 Get data from URL vm getJson function var url ht
  • Process.Start,WorkingDirectory,从一个exe启动另一个

    我希望你能明白我的问题 不知道我是否能用英语正确描述它 但我会尝试 情况 文件夹结构 MainFolder Sub1 Sub2 2个exe文件 MainFolder MainProg exe和 Sub2 SecondProg exe Mai
  • 具有主备集群 POD 的 Kubernetes 服务

    很抱歉没有保持简短 因为任何此类尝试都会让我错过问题的一些重要细节 我有一个旧版 Java 应用程序 它在集群环境中以主动 备用模式工作 通过预定义端口公开某些 RESTful Web 服务 如果我的应用程序集群中有两个节点 则在任何时间点
  • ng-reflect-model 显示错误的值,但输入正确

    输入值为01020304050607080900010203040506 并且输入显示了正确的值 但是 当我检查ng reflect model时 该值是010203040506070809000102030405 ngModel 有长度限
  • 亚马逊 MWS ListOrders 从 Scratchpad 请求

    我正在尝试通过 MWS Scratchpad 获取订单列表 在便签本中一切正常 HTTP POST 是 POST Orders 2013 09 01 AWSAccessKeyId CHIAVE ACCESSO Action ListOrde
  • 如何在 Microsoft SQL Server 中仅使用日期查询 DATETIME 字段?

    我有一个表 TESTDATETIME字段 像这样 ID NAME DATE 1 TESTING 2014 03 19 20 05 20 000 我需要一个查询返回该行以及日期为 03 19 2014 的每一行 无论时间是什么 我尝试使用 s
  • 想要 Delphi5 虚拟 TreeView

    有人碰巧拥有与 Delphi5 兼容的 Virtual TreeView 的副本吗 或者有谁知道哪里可以下载吗 预先感谢您的任何回复 在虚拟树视图创建者的官方网站上 http www soft gems net http www soft
  • vscode 片段 - 多个正则表达式转换文件路径+文件名

    经过 1 周的搜索并尝试错误创建这个问题 希望有人愿意帮助我解决这个问题 我的 VsCode 片段应转换以下内容 D FolderX FolderY src Folder1 Folder2 Folder3 into FOLDER1 FOLD
  • 使用 Graphics.DrawImage 在 C# 中创建自定义选项卡

    我有一个项目 您可以在其中添加和删除选项卡 如网络浏览器 到目前为止我有这个 Button to add a new tab page private void cb addPage Click object sender EventArg