当前位置: 首页 > news >正文

C# GDI+的DrawString无法绘制Tab键的现象

【啰嗦2句】

     现在用C#的人很少了吧?GDI+更少了吧?所以这个问题估计也冷门。没关系,分享给特定需要的人也不错。

【问题现象】   

    工作中开发了一个报告编辑器,实现图文排版等功能,用着没什么问题,直到有一天发现,文本框粘贴的内容暗藏Tab键(保存为\t字符),比如“银丝鸡蛋面        GB 28050-2011       100克 ”,用DrawString怎么绘制都会忽略中间的间距,变成“银丝鸡蛋面GB 28050-2011100克”

   比较糟糕的是MySQL数据库查看时的值也是“银丝鸡蛋面GB 28050-2011100克”。

 【分析历程】

     刚开始并不知道是中间包含着Tab键,从MySQL数据库复制到NotePad++后,发现有这个tab分隔才找到原因。还以为是没法保存\t这个符号。

    既然有这个键值为什么DrawString没有识别并区分呢?不知道。CSDN的做法比较巧妙,我编辑这篇文章时,看到CSDN把Tab键转换成了8个空格。这个是不错的做法,按理说我的报告编辑器也可以这么做。但是,仍然希望所见所得吧,作为报告,希望保留内容的原始性。

    最终在微软在线文档中发现有个StringFormat.SetTabStops()方法,似乎是一个希望。链接看这个:微软文档StringFormat.SetTabStops(Single, Single[]) 方法

  【解决案例】

    1、微软文档的做法,其实并没有解决问题。

    新建一个窗体Form1,双击Paint事件编辑代码。

/// <summary>
/// 直接在Form的Paint演示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Paint(object sender, PaintEventArgs e)
{//注意“直接的”前面是换行符string text = "Hello, 移动中的鸭子!\n直接的\t方法\t来获\t取每\t个字符的精确位置。";Graphics graphics = e.Graphics;// 设置文本的布局,制表符将会根据这个对齐方式计算StringFormat format = new StringFormat();format.Alignment = StringAlignment.Near;//这个tabStops是重点,但是也很难搞懂float[] tabStops = { 100.0f,50.0f,20.0f,100.0f,20.0f };  //每个间隔跟上一个的间隔像素format.SetTabStops(0, tabStops);//设置起始符位置0,其他的按tabStopsgraphics.DrawString(text, this.Font, new SolidBrush(Color.Green), 10, 10, format);
}
原文:Hello, 移动中的鸭子!\n直接的\t方法\t来获\t取每\t个字符的精确位置

运行效果如下图:

这里微软官方解释:

tabStops 数组中的每个制表位偏移量(第一个除外)相对于上一个。 第一个制表位偏移量相对于由 firstTabOffset指定的初始偏移位置。 例如,如果初始偏移位置为 8,第一个制表位偏移量为 50,则第一个制表位位于位置 58。 如果初始偏移位置为零,则第一个制表位偏移量相对于位置 0(字符串原点)。

实际我测试了多个tabStops数组值,第一个值比较准,其他表现得莫名其妙。比如:

tabStops = { 100.0f,50.0f,20.0f,50.0f}

    由于资料很少,所以这个方案只能作为参考,可能受不同系统语言、地区等影响表现未必符合要求。有兴趣的读者可以再摸索摸索。

 2、参照CSDN这种做法,直接把\t替换为4个或8个空格。推荐用这种方法。

label3.Text = text.Replace("\t", "    ");

 

相关文章:

C# GDI+的DrawString无法绘制Tab键的现象

【啰嗦2句】 现在用C#的人很少了吧&#xff1f;GDI更少了吧&#xff1f;所以这个问题估计也冷门。没关系&#xff0c;分享给特定需要的人也不错。 【问题现象】 工作中开发了一个报告编辑器&#xff0c;实现图文排版等功能&#xff0c;用着没什么问题&#xff0c;直到有一天…...

C# GID+绘制不透明和半透明的线条

绘制线条时&#xff0c;必须将 Pen 对象传递给 DrawLine 类的 Graphics 方法。 Pen 构造函数的参数之一是 Color 对象。 若要绘制不透明的线条&#xff0c;请将颜色的 alpha 分量设置为 255。 若要绘制半透明的线条&#xff0c;请将 alpha 分量设置为从 1 到 254 的任何值。 在…...

L4-Prompt-Delta

Paper List PromptPapers:https://github.com/thunlp/PromptPapersDeltaPapers: https://github.com/thunlp/DeltaPapers Programming Toolkit OpemPrompt: https://github.com/thunlp/OpenPromptOpenDelta: https://github.com/thunlp/OpenDelta 一、传统微调方法&#xff1…...

Qt 自定义控件(Qt绘图)

一、QPaintEvent绘图事件1、QPaintEvent是Qt框架中一个重要的事件类&#xff0c;专门用于处理绘图事件。 2、当Qt视图组件需要重绘自己的一部分时&#xff0c;就会产生QPaintEvent事件。 3、Qt视图组件重绘自己&#xff0c;通常发生在以下情况: (1)、窗口第一次显示时: 当窗…...

electron 上怎么用node 调用 c++ 提供的方法

背景 在 Electron 上调用 C 代码的场景主要出现在需要执行高性能、低延迟的任务&#xff0c;或者需要与现有的本地 C 库集成时。这些场景往往涉及底层系统交互、性能优化或跨平台兼容性需求。 我们都知道c 的性能和安全性都比JavaScript 要高&#xff0c;但我认为在 Electron …...

Chromium 132 编译指南 Windows 篇 - Git 初始化设置 (四)

1. 引言 在 Chromium 编译指南系列的前几篇文章中&#xff0c;我们已经完成了编译环境的基础设置和关键环境变量的配置。本篇将重点介绍 Git 的安装与初始化配置&#xff0c;这是获取和管理 Chromium 源代码的重要前提。 2. 安装 Git 在 Windows 环境下&#xff0c;Git 并不…...

day03-前端Web-Vue3.0基础

目录 前言1. Vue概述2. 快速入门2.1 需求2.2 步骤2.3 实现 3. Vue指令3.1 介绍3.2 v-for3.2.1 介绍3.2.2 演示3.2.3 v-for的key3.2.4 案例-列表渲染 3.3 v-bind3.3.1 介绍3.3.2 演示3.3.3 案例-图片展示 3.4 v-if & v-show3.4.1 介绍3.4.2 案例-性别职位展示 3.6 v-model3.…...

Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;初版&#xff09;Linux 下Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;重置版&#xff09;Windows …...

GitLab本地服务器配置ssh和克隆项目

1. 本地安装好git git链接&#xff1a;https://git-scm.com/downloads/win 无脑点击下一步安装即可,打开Git Bash命令终端如下&#xff1a; 2. 配置本地用户名和邮箱 git config --global user.name "你的名字" git config --global user.email "你的邮箱&quo…...

Win10和11 git/Android Studio遇到filename too long问题的解决

1、打开windows长文件、长路径支持&#xff1a; 可以参考这篇文章&#xff1a; 修改注册表方法&#xff1a; 使用Admin登陆machine&#xff0c;在run中输入regedit并回车&#xff1b; 找到路径 ’Computer -> HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -&g…...

【JavaWeb学习Day11】

java程序操作数据库&#xff08;JDBC&#xff09; JDBC:&#xff08;Java DataBase Connectivity&#xff09;&#xff0c;就是使用Java语言操作关系型数据库的一套API。 本质&#xff1a; 1.sun公司官方定义的一套操作所有关系型数据库的规范、即接口。 2.各个数据库厂商去…...

rom定制系列------小米max3安卓12 miui14批量线刷 默认开启usb功能选项 插电自启等

小米Max3是小米公司于2018年7月19日发布的机型。此机型后在没有max新型号。采用全金属一体机身设计&#xff0c;配备6.9英寸全面屏.八核处理器骁龙636&#xff0c;后置双摄像头1200万500万像素&#xff0c;前置800万像素.机型代码 &#xff1a;nitrogen.官方最终版为稳定版12.5…...

CES 2025|美格智能高算力AI模组助力“通天晓”人形机器人震撼发布

当地时间1月7日&#xff0c;2025年国际消费电子展&#xff08;CES 2025&#xff09;在美国拉斯维加斯正式开幕。美格智能合作伙伴阿加犀联合高通在展会上面向全球重磅发布人形机器人原型机——通天晓&#xff08;Ultra Magnus&#xff09;。该人形机器人内置美格智能基于高通QC…...

汽车电子相关的协议UDS、DOIP、CAN

UDS协议 UDS&#xff08;Unified Diagnostic Services&#xff0c;统一诊断服务协议&#xff09; 是一种标准化的通信协议&#xff0c;广泛应用于汽车电子系统中&#xff0c;尤其是在车辆诊断和服务过程中。它用于车辆的诊断、维护、控制和测试&#xff0c;支持通过车载诊断接…...

k8s笔记29--使用kyverno提高运维效率

k8s笔记29--使用kyverno提高运维效率 介绍原理安装应用场景自动修正测试环境pod资源强制 Pod 标签限制容器镜像来源禁止特权容器其它潜在场景 注意事项说明 介绍 Kyverno是一个云原生的策略引擎&#xff0c;它最初是为k8s构建的&#xff0c;现在也可以在k8s集群之外用作统一的…...

Life Long Learning(李宏毅)机器学习 2023 Spring HW14 (Boss Baseline)

1. 终身学习简介 神经网络的典型应用场景是,我们有一个固定的数据集,在其上训练并获得模型参数,然后将模型应用于特定任务而无需进一步更改模型参数。 然而,在许多实际工程应用中,常见的情况是系统可以不断地获取新数据,例如 Web 应用程序中的新用户数据或自动驾驶中的…...

libc.so.6不兼容

1、查看电脑所有libc.so.6 daviddavid-Shangqi-X4270:~/MySoft/ubuntusoft$ locate libc.so.6 /home/david/MySoft/ubuntusoft/EXEApp/libc.so.6 /home/david/MySoft/ubuntusoft/EXEApp_TEST/libc.so.6 /home/david/MySoft/ubuntusoft/RTMG_APP/libc.so.6 /home/david/MySoft/…...

树的模拟实现

一.链式前向星 所谓链式前向星&#xff0c;就是用链表的方式实现树。其中的链表是用数组模拟实现的链表。 首先我们需要创建一个足够大的数组h&#xff0c;作为所有结点的哨兵位。创建两个足够大的数组e和ne&#xff0c;一个作为数据域&#xff0c;一个作为指针域。创建一个变…...

AsyncOperation.allowSceneActivation导致异步加载卡死

先看这段代码&#xff0c;有个诡异的问题&#xff0c;不确定是不是bug public class Test : MonoBehaviour {void Start(){StartCoroutine(LoadScene(Ego.LoadingLevel));}IEnumerator LoadScene(string sceneName){LoadingUI.UpdateProgress(0.9f);yield return new WaitForS…...

如何搭建 Vue.js 开源项目的 CI/CD 流水线

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...