如何在 C# 中旋转标签? [复制]

2024-04-18

我想显示一个旋转 90 度的标签(这样我就可以将它们中的一堆作为标题放在表格的顶部)。是否有捷径可寻?


您需要编写自己的控件或使用自定义控件。

A 代码项目 http://en.wikipedia.org/wiki/The_Code_Project你可以开始的文章是自定义文本 - C# 中的面向控件 - 第一部分(标签控件) http://www.codeproject.com/KB/miscctrl/customtext.aspx。这包含额外的功能,因此您应该可以根据需要对其进行缩减。

这是其中一些有趣的代码:

/// <summary>
/// This is a lable, in which you can set the text in any direction/angle
/// </summary>

#region Orientation

//Orientation of the text

public enum Orientation
{
    Circle,
    Arc,
    Rotate
}

public enum Direction
{
    Clockwise,
    AntiClockwise
}

#endregion

public class OrientedTextLabel : System.Windows.Forms.Label
{
    #region Variables

    private double rotationAngle;
    private string text;
    private Orientation textOrientation;
    private Direction textDirection;

    #endregion

    #region Constructor

    public OrientedTextLabel()
    {
        //Setting the initial condition.
        rotationAngle = 0d;
        textOrientation = Orientation.Rotate;
        this.Size = new Size(105,12);
    }

    #endregion

    #region Properties

    [Description("Rotation Angle"),Category("Appearance")]
    public double RotationAngle
    {
        get
        {
            return rotationAngle;
        }
        set
        {
            rotationAngle = value;
            this.Invalidate();
        }
    }

    [Description("Kind of Text Orientation"),Category("Appearance")]
    public Orientation TextOrientation
    {
        get
        {
            return textOrientation;
        }
        set
        {
            textOrientation = value;
            this.Invalidate();
        }
    }

    [Description("Direction of the Text"),Category("Appearance")]
    public Direction TextDirection
    {
        get
        {
            return textDirection;
        }
        set
        {
            textDirection = value;
            this.Invalidate();
        }
    }

    [Description("Display Text"),Category("Appearance")]
    public override string Text
    {
        get
        {
            return text;
        }
        set
        {
            text = value;
            this.Invalidate();
        }
    }

    #endregion

    #region Method

    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics graphics = e.Graphics;

        StringFormat stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Center;
        stringFormat.Trimming = StringTrimming.None;

        Brush textBrush = new SolidBrush(this.ForeColor);

        //Getting the width and height of the text, which we are going to write
        float width = graphics.MeasureString(text,this.Font).Width;
        float height = graphics.MeasureString(text,this.Font).Height;

        //The radius is set to 0.9 of the width or height, b'cos not to
        //hide and part of the text at any stage
        float radius = 0f;
        if (ClientRectangle.Width<ClientRectangle.Height)
        {
            radius = ClientRectangle.Width *0.9f/2;
        }
        else
        {
            radius = ClientRectangle.Height *0.9f/2;
        }

        //Setting the text according to the selection
        switch (textOrientation)
        {
            case Orientation.Arc:
            {
                //Arc angle must be get from the length of the text.
                float arcAngle = (2*width/radius)/text.Length;
                if(textDirection == Direction.Clockwise)
                {
                    for (int i=0; i<text.Length; i++)
                    {
                        graphics.TranslateTransform(
                            (float)(radius*(1 - Math.Cos(arcAngle*i + rotationAngle/180 * Math.PI))),
                            (float)(radius*(1 - Math.Sin(arcAngle*i + rotationAngle/180*Math.PI))));
                        graphics.RotateTransform((-90 + (float)rotationAngle + 180*arcAngle*i/(float)Math.PI));
                        graphics.DrawString(text[i].ToString(), this.Font, textBrush, 0, 0);
                        graphics.ResetTransform();
                    }
                }
                else
                {
                    for (int i=0; i<text.Length; i++)
                    {
                        graphics.TranslateTransform(
                            (float)(radius*(1 - Math.Cos(arcAngle*i + rotationAngle/180*Math.PI))),
                            (float)(radius*(1 + Math.Sin(arcAngle*i + rotationAngle/180*Math.PI))));
                        graphics.RotateTransform((-90 - (float)rotationAngle - 180*arcAngle*i/(float)Math.PI));
                        graphics.DrawString(text[i].ToString(), this.Font, textBrush, 0, 0);
                        graphics.ResetTransform();
                    }
                }
                break;
            }
            case Orientation.Circle:
            {
                if (textDirection == Direction.Clockwise)
                {
                    for(int i=0;i<text.Length;i++)
                    {
                        graphics.TranslateTransform(
                            (float)(radius*(1 - Math.Cos((2*Math.PI/text.Length)*i + rotationAngle/180*Math.PI))),
                            (float)(radius*(1 - Math.Sin((2*Math.PI/text.Length)*i + rotationAngle/180*Math.PI))));
                        graphics.RotateTransform(-90 + (float)rotationAngle + (360/text.Length)*i);
                        graphics.DrawString(text[i].ToString(), this.Font, textBrush, 0, 0);
                        graphics.ResetTransform();
                    }
                }
                else
                {
                    for(int i=0;i<text.Length;i++)
                    {
                        graphics.TranslateTransform(
                            (float)(radius*(1 - Math.Cos((2*Math.PI/text.Length)*i + rotationAngle/180*Math.PI))),
                            (float)(radius*(1 + Math.Sin((2*Math.PI/text.Length)*i + rotationAngle/180*Math.PI))));
                        graphics.RotateTransform(-90 - (float)rotationAngle - (360/text.Length)*i);
                        graphics.DrawString(text[i].ToString(), this.Font, textBrush, 0, 0);
                        graphics.ResetTransform();
                    }

                }
                break;
            }

            case Orientation.Rotate:
            {
                //For rotation, who about rotation?
                double angle = (rotationAngle/180)*Math.PI;
                graphics.TranslateTransform(
                    (ClientRectangle.Width+(float)(height*Math.Sin(angle))-(float)(width*Math.Cos(angle)))/2,
                    (ClientRectangle.Height-(float)(height*Math.Cos(angle))-(float)(width*Math.Sin(angle)))/2);
                graphics.RotateTransform((float)rotationAngle);
                graphics.DrawString(text,this.Font,textBrush,0,0);
                graphics.ResetTransform();

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

如何在 C# 中旋转标签? [复制] 的相关文章

  • 使用 Moq 模拟实体框架 6 ObjectResult

    如何使用 Moq 模拟 Entity Framework 6 ObjectResult 以便对依赖 EF 数据库连接的代码进行单元测试 沿着这些思路阅读了大量的问题和答案 并从我所读到的内容中收集了许多有价值的信息 我已经实现了我认为相当优
  • 如果变量的值在编译时已知/未知,则进行专门化

    如何在编译时 在实际编译和运行程序之前 其参数之一的值已知 未知的情况下专门化模板函数 我还不知道怎么办 idea 1 include
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 不使用 razor viewengine 进行 Nancy 本地化

    目前我在 Nancy 使用 razor 作为我的视图引擎 我可以在剃刀中像这样访问我的资源文件 Text text greeting 但我想切换到不同的视图引擎 是否有其他支持 TextResource 的视图引擎 在超级简单的视图引擎中本
  • 修改 FOR 循环内的索引变量是否是一种好的做法? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 给定代码 for int i 1 i lt 5 i Do work 改变其值是可以接受的i从循环内 例如 for int i 1 i lt 5
  • TransactionScope 超时过早发生?

    我在用着TransactionScope进行一些批量插入和更新 问题是 即使我设置了超时 我也会在 30 分钟长的操作中遇到超时异常TransactionScope到一小时 此外 在异常之后 它会插入看似随机数量的批次记录 例如 最后一个操
  • asp.net mvc 3 中模糊的远程属性验证

    asp net mvc 3 中的内置远程属性会执行 onchange 验证 我希望它在模糊时验证 有没有办法自定义它 或者还有其他东西可以这样做 我确信这是一个非常普遍的需求 你可以设置默认值 http docs jquery com Pl
  • libxml2 用缩进解析文档

    我正在尝试调试正在解析包含缩进的 xml 文档的代码 我正在尝试找出在 xmlReadMemory 函数上使用的正确参数 XML PARSE NOBLANKS 选项对以下方法调用有何作用 xmlReadMemory buffer data
  • 软件预取手动指令合理的场景

    我读过有关 x86 和 x86 64 Intel 的内容gcc提供特殊的预取指令 include
  • 移动构造函数和 std::move 混淆

    我正在阅读有关std move http en cppreference com w cpp utility move 移动构造函数和移动赋值运算符 说实话 我现在得到的只是困惑 现在我有一堂课 class A public int key
  • asp.net-mvc 中模型绑定双精度的 CultureInfo 问题(2)

    在我的 Jquery 脚本中 我使用浏览器的 CultureInfo en UK 发布了两个双打 该浏览器使用 作为分数分隔符 我的 MVC 应用程序在区域设置为 nl BE 的服务器上运行 使用 作为分数分隔符 AcceptVerbs H
  • 强制动态链接库中静态变量的预初始化

    C 11 标准第 3 6 2 条 第 4 条规定 具有静态存储持续时间的非局部变量的动态初始化是否在 main 的第一个语句之前完成是由实现定义的 C 标准将静态初始化与动态初始化区分开来 静态初始化仅需要计算编译时常量 我相信急切静态初始
  • C# Null 传播运算符/条件访问表达式和 if 块

    The 空传播运算符 条件访问表达式 https roslyn codeplex com discussions 540883进来c 6 0 questions tagged c 23 6 0看起来是一个非常方便的功能 但我很好奇它是否有助
  • XNA:Unload() 的意义是什么?

    XNA 游戏有一个Unload 方法 其中内容应该被卸载 但这有什么意义呢 如果所有内容都被卸载 那么游戏一定会退出 在这种情况下 无论如何 所有内容都会被垃圾收集 对吗 据我了解 它对于任何标准用途都没有用 因为正如您所说 垃圾收集器为您
  • NamedScopes Ninject 绑定和异步(线程)

    我的项目由服务和存储库构成 所有存储库共享数据库上下文 在我的一个服务层中 我有一个使用存储库写入数据库的异步方法 Web 请求将完成并处理上下文 然后此方法才能使用它 我试着去理解命名范围 http www planetgeek ch 2
  • 用更有意义的文本替换 GCC 输出中的 a-hats [重复]

    这个问题在这里已经有答案了 可能的重复 为什么 gcc 的所有错误消息中都有 https stackoverflow com questions 547071 why does gcc have a in all its error mes
  • Telegram编译过程:没有规则来制作目标'/usr/lib/libicutu.a'

    我正在关注 Telegram 的编译过程here https github com telegramdesktop tdesktop blob master doc building cmake md在最后一步编译应用程序本身时 它给了我这
  • 在 C# 中实现记忆化 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道这个话题 记忆 已经被讨论了很多 比如here https stackoverflow com questions 285216
  • 在 Ubuntu 上用 C 项目编译和链接 GTK 3

    我相信这不是重复的问题 在发布此问题之前我已经看过所有问题 答案 我想我这里的情况有所不同 我使用Ubuntu 12 04并下载GTK 2 和 3 我从 GNOME 网站复制了一个简单的 GTK 源代码 但是当我在终端中使用这个命令时 gc
  • 文件嵌套时嵌入资源名称丢失扩展名

    我有一些脚本存储在我标记为嵌入式资源的文件中 我将每个文件嵌套在其关联的下面 cs文件 不幸的是 由于某种原因 当您以这种方式嵌套文件时 嵌入的资源名称会丢失文件扩展名 这意味着在运行时我无法识别哪些嵌入式资源是脚本 哪些不是脚本 对此我能

随机推荐

  • 单击父节点时检查树的子节点 [ExtJS]

    我想知道如何在单击 ExtJs 中的特定节点时检查树的同级节点 我已经给了每个节点的 id 我可以访问单击的节点的 id 那么我如何继续自动检查子节点 有人请帮助我 or any other way of getting hands on
  • Bitnami:如何在 Apache2 中配置 GitLab 5.0 应用程序而不具有相对根目录?

    或者如何使 GitLab 应用程序作为 Apache2 HTTP 服务器上的根应用程序 我以前没有使用过 Apache2 但是我得到了Bitnami GitLab 虚拟机 http bitnami com stack gitlab virt
  • 如何将输入参数作为以逗号分隔的字符串或 DB2 中 IN 子句的列表传递

    我是存储过程的新手 我有一个疑问 我需要将输入参数作为以逗号分隔的字符串或 DB2 中 IN 子句的列表传递 请参阅下面的示例程序 CREATE PROCEDURE TEST SP IN listofUsername SPECIFIC TE
  • iOS 上可写的目录位置有哪些?

    我无法在 Apple iOS SDK 上找到有关哪些目录可写 哪些目录不适合您的应用程序的信息 我只假设NSCachesDirectory and NSDocumentDirectory是可写的 但其他的怎么样 比如NSApplicatio
  • 无法分配给属性:“$text”是不可变的

    我想在 SwiftUI 中创建一个自定义文本字段来处理第一响应者 但我在代码中遇到此错误并且结构是不可变的我不知道该怎么办 struct CustomTextField UIViewRepresentable class Coordinat
  • 使用 make 构建多个二进制文件

    我想创建一个 Makefile 在父目录中 来调用其他几个 Makefile 在子目录中 这样我就可以通过仅调用一个父 Makefile 来构建多个二进制文件 每个项目子目录一个 我的研究因在递归 Makefile 上找到大量内容而受到阻碍
  • 从同一文件和不同文件调用nodejs函数

    Model js 文件具有以下条目 exports update function tag view date 并调用该函数 例如 update test 1213 11 10 2014 它抛出以下错误 update test 1213 1
  • 如何将 ffplay 作为无窗口进程运行?

    我正在运行 ffplay 作为后台进程 它向我的主 UI 进程提供图像数据 我已经设定 SDL VIDEODRIVER dummy 抑制 SDL 窗口中显示的 ffplay 视频 问题是 即使不显示视频输出窗口 ffplay 进程仍然显示为
  • GNU C++ 如何检查 -std=c++0x 何时生效?

    我的系统编译器 gcc42 可以很好地满足我想要的 TR1 功能 但尝试支持除系统之外的较新编译器版本 尝试访问 TR1 标头时会出现 error 要求 std c 0x 选项 因为它如何与图书馆或类似的集线器接口 usr local li
  • IntelliJ 调试器:连接但不会注意到代码何时遇到断点

    我尝试使用 IntelliJ IDEA 11 1 Ultimate 调试应用程序服务器 WebLogic 调试器配置以前有效 我没有更改任何内容 发生的情况是 IntelliJ 告诉我 连接到目标虚拟机 地址 snip 9009 传输 so
  • 黑色视频 CAAnimation 和 AVFoundation AVAssetExportSession

    我是整个 AVFoundation 视频编辑电路的新手 我当前的测试应用程序是一个双屏幕应用程序 第一个屏幕执行 AVFoundation 视频录制 1 mov 第二个屏幕可让您查看视频并使用 CAAnimation 在其上添加一些标题 1
  • Windows 窗体中的本机外观(类似资源管理器)主菜单

    除了使用 MenuStrip 之外 还有其他方法在 C 中创建主菜单吗 它看起来与标准资源管理器菜单不相似 我在这里做错了什么吗 我只想要标准应用程序主菜单 例如浏览器菜单 听起来您想要一个尊重操作系统主题的菜单 MainMenu 类将执行
  • 使用 Android 应用程序访问 SIM 卡?

    我想知道是否可以使用 Android 应用程序访问 SIM 卡 你可以像这样获取 IMEI 但这是你想要的吗 只是一个例子 mTelephonyMgr TelephonyManager getSystemService Context TE
  • API 平台 - 我应该使用哪种方法来创建没有实体的自定义操作

    我是 API 平台的新手 我认为这很棒 但我找不到任何示例如何创建不基于任何实体的自定义端点 有很多基于实体的示例 通常都是关于 CRUD 的 但是自定义操作呢 我需要使用一些与任何实体无关的自定义参数通过数据库创建自定义搜索 例如 我想接
  • ASP中,位运算符左移和右移

    有谁知道左移和右移运算符示例吗 我是 ASP 新手 我发现了位运算符 例如 AND OR NOT 等等 对于 vbscript 左移是通过乘法完成的 即 var 2 左移一个位置 var 4 左移两个位置等 右移是通过除法完成 即 var
  • Zend Framework 2 的多个表

    我是 Zend Framework 2 的新手 我成功完成了 ZF2 的专辑教程 现在我想仅显示数据库中多个表中的某些数据 我有一个简单的数据库设置 其中包含表格 例如人员 书籍 状态等 数据库应该做什么并不重要 我想知道是否有一个教程可以
  • 从 C 代码获取当前使用的文件描述符的计数

    是否有 C API 可以获取 系统范围内当前使用的文件描述符 当前进程当前使用的文件描述符 对于当前进程计数 您可以使用getrlimit获取文件描述符限制 然后迭代从 0 到该限制的所有整数并尝试调用fcntl与F GETFD命令 它只会
  • PubNub:将所有已发布消息记录到我的数据库的正确方法是什么

    记录每条已发布消息并将其保存到我的服务器数据库的正确方法是什么 我能想到的有两种选择 使用PubNub功能发布事件后并将消息转发到专用记录器通道 服务器将订阅该频道并将到达的消息保存到数据库 这里又产生一个问题 当我在PubNub函数中将消
  • 使用 ActiveRecord 和 Rails 3 进行复杂 JOIN

    我有以下型号 class User lt ActiveRecord Base has many memberships has many groups through gt memberships end class Group lt Ac
  • 如何在 C# 中旋转标签? [复制]

    这个问题在这里已经有答案了 我想显示一个旋转 90 度的标签 这样我就可以将它们中的一堆作为标题放在表格的顶部 是否有捷径可寻 您需要编写自己的控件或使用自定义控件 A 代码项目 http en wikipedia org wiki The