将省略号添加到 WinForms 程序中的路径,无需 Win32 API 调用(重新访问)

2023-11-27

我正在寻找一种在 C# 路径中插入省略号的方法,并在 stackoverflow 上找到了答案:没有 Win32 API 调用的 C# 路径省略号

使用VS2010和.Net 4.0的RTM版本,我无法让建议的方法起作用。我搜索了'Net并找到了使用相同方法的示例代码,但它以同样的方式失败了。

您可以在下面的代码中看到我试图缩短的字符串。

调用 MeasureText 方法后,输入字符串 (OriginalName) 和输出字符串 (ellipsisizedName) 均如下所示:

d:\abcd\efgh\ijkl\mnop\qrst\...\test.txt\0F\GHIJ\KLMN\OPQR\STIV\WXYZ\test.txt

两个问题:

1) 生成的字符串被 narfed(路径按预期被截断,但后面跟着看起来像 C 风格的 null 终止符和原始路径的一大块)。

2) My 原来的字符串被改变了与输出字符串相同。

难道我做错了什么?

namespace WindowsFormsApplication2 {
   public partial class Form1 : Form {
      public Form1()
      {
         InitializeComponent();

         string OriginalPath = @"d:\abcd\efgh\ijkl\mnop\qrst\uvwx\yzAB\CDEF\GHIJ\KLMN\OPQR\STIV\WXYZ\test.txt";
         string ellipsisedPath = OriginalPath;

         Size proposedSize = new Size(label1.Width, label1.Height);

         TextRenderer.MeasureText(ellipsisedPath, label1.Font, proposedSize, TextFormatFlags.ModifyString | TextFormatFlags.PathEllipsis);
      }
   }
}

天哪,你发现了一个巨大的错误。 TextRenderer 类中调用 DrawTextEx() 的 P/Invoke 被中断。该 API 函数将写回字符串,这是允许的,因为 cchText 参数是 LPTSTR,而不是 LPCTSTR。这会破坏 .NET 字符串内容both变量,因为字符串是内部的。

该错误并非特定于 .NET 4.0,我在 .NET 3.5 SP1 的 ReferenceSource 中也看到了错误,并且可以在 VS2008 上重现它。问题出在内部 WindowsGraphics.MeasureText 函数中。您可以在 connect.microsoft.com 上报告该错误。

一种可能的解决方法是更改​​字符串,使其被复制并且不会影响原始字符串:

  string ellipsisedPath = OriginalPath + '\0';

但在这种情况下,更好的解决方法是不传递ModifyString选项,它没有任何作用。这也更安全,第一个解决方法仍然有可能破坏垃圾收集堆。 Microsoft 的修复也同样简单,它应该只屏蔽修改字符串选项。据记载,它没有任何效果。

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

将省略号添加到 WinForms 程序中的路径,无需 Win32 API 调用(重新访问) 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags

随机推荐

  • 自调用函数内的递归函数上的 setTimeout()

    我想将我的代码作为自调用匿名函数分发 正如我看到的许多人所做的那样 另外 在我的代码中 我必须监视另一个库的加载 这样我就可以在它可用时使用它 function window document undefined staffHappens
  • Google Drive Sdk - iOS 应用程序中的音频和视频流

    嗨 Google 云端硬盘工作人员 我已经尝试过从 Google 云端硬盘流式传输视频文件 无需下载 但我收到登录提醒 我已经彻底检查了 Dr Edit 示例应用程序 但没有找到任何解决方案 我尝试过downloadUrl embedLin
  • Android应用程序盗版预防[关闭]

    Closed 这个问题是无关 目前不接受答案 看看 stackoverflow 上的一些帖子 截至撰写本文时 似乎确实没有办法有效防止应用程序盗版 这里真的有人因应用程序盗版而蒙受损失吗 您当前针对应用程序破解者的解决方案 免费或非免费 是
  • NSString nslog 显示“\n”换行符

    我想记录一个 NSString 但当我记录它时 它不显示新行字符 n 我怎样才能做到这一点 谢谢 您可以先处理该字符串并替换所有出现的 n with n NSString newString originalString stringByR
  • 图像中的 r 轴标签

    我需要按呼叫中心的空间位置绘制指标图表 我用 R 写了一个小例子 tt lt data frame a1 c 0 4 5 5 7 a2 c 5 6 7 8 a3 c 8 7 9 8 row names tt lt paste L 1 4 s
  • 如何使用 SharedPreferences [重复]

    这个问题在这里已经有答案了 我是 Android 开发新手 使用一本名为 Sams Teach Yourself Android Application Development in 24 hours 的书 到目前为止 但在尝试使用 Sha
  • 在 Visual Studio 2010 中,如何搜索不在单行注释内的文本?

    在 Visual Studio 2010 中 如何搜索不在单行注释内的文本 例如 如何在以下位置找到 bas foo bar bas 但不在 foo bar bas 请注意 它应该找到以下行 foo bar bas 编辑 它不应该找到该行
  • 相同的 Ajax 调用了两次..JQuery

    我在 JQuery 中有一个问题 我正在使用 ajax 在我的代码中 Function 1 将字段名和序列号发送到 ctrller 后者通过以下方式获取数据 POST name and POST sequenceno 并使用未给定的序列更新
  • Math.Round 返回奇数向上舍入,但偶数向下舍入

    我正在尝试使用数学循环找到一个浮点数 我发现了以下内容 0 5 gt 0 1 5 gt 2 2 5 gt 2 3 5 gt 4 等等 我相信这是由于浮点错误造成的 但不太确定是如何造成的 我怎样才能解决这个问题 以便偶数正确舍入 From
  • 避免 Android Market 对可选使用位置进行过滤

    在我的应用程序中 我尝试使用位置信息 如果可用 因此 我的清单中有这些权限 e g
  • 对列中的每个单元格应用函数并将结果添加到新列

    我有一个 data table 如下所示 我想要的是将一个函数应用于 C 列中的每个元素 该函数将接受一个向量 因为 Col C 包含向量元素 并返回另一个向量 应将所得向量添加到新列中 A B C 1 16 151 c 2579 2659
  • Yii框架登录后重定向页面

    我是 Yii 框架的新手 在 Yii 中 当您默认登录时 它会重定向到索引页面 我希望当我登录 Yii 时 页面将重定向到另一个页面而不是索引页面 那么任何人都可以帮助我吗 任何帮助或建议将非常感激 edit 当我使用用户模块时 重定向将如
  • 显示与线连接的树视图项目?

    有没有办法让树视图在展 开项目时显示连接项目的线 Thanks 您必须替换 TreeViewItem 控件模板才能实现这一点 看着MSDN 上的这个线程应该有您需要的所有信息
  • XSLT:更改节点内部文本

    我需要转换以下 xml 文档 a b b a
  • pandas散点矩阵显示相关系数

    我试图找到一种方法来显示 pandas 散点矩阵的下三或上三中的相关系数 有人能指出我正确的方向吗 谢谢 一个最小的工作示例 import matplotlib pyplot as plt import pandas as pd impor
  • Foundation 5 顶栏在 Rails 4 中无法一致工作

    我在 Rails 4 应用程序中使用 Foundation 5 当我发送请求时 顶栏菜单工作正常 我可以悬停项目和嵌套项目没有问题 然后 我单击其中一个项目 该项目具有与其关联的 link to 方法 有时它会给出正确的结果 我的菜单仍然可
  • 向量值多元函数中的插值

    在Python中 我试图构建一个在多维 5 参数空间中插入向量值数据的例程 即我有一个函数 它接受多个输入变量并返回多个输出变量 目前 向量的每个元素都有一个调用 数据位于列式文件中 因此我使用以下命令检索它 import numpy x
  • 在 CollectionView 上的滚动需求上加载更多数据

    我正在 collectionView 上实现一项功能 其中用户滚动底部的 collectionView 20 个项目 并从服务器请求另一组数据 另外 20 个项目 我已经实施了以下两种方法 但我想知道哪种方法更好 或者还有其他我不知道的更好
  • Grailsquartz 插件在 Tomcat 中部署时不起作用

    我有一个使用 Grails 开发的 Web 应用程序 我正在尝试实现一个后台进程 使用 Grails 的quartz1 0 RC9 插件每 5 分钟扫描一次数据库中的表 在尝试编写实际逻辑之前 我正在学习如何使用该插件 因为我是石英新手 因
  • 将省略号添加到 WinForms 程序中的路径,无需 Win32 API 调用(重新访问)

    我正在寻找一种在 C 路径中插入省略号的方法 并在 stackoverflow 上找到了答案 没有 Win32 API 调用的 C 路径省略号 使用VS2010和 Net 4 0的RTM版本 我无法让建议的方法起作用 我搜索了 Net并找到