天道酬勤,学无止境

为什么Graphics.MeasureString()返回的数字比预期的高?(Why is Graphics.MeasureString() returning a higher than expected number?)

问题

我正在生成一张收据,并且正在使用Graphics对象来调用DrawString方法以打印出所需的文本。

graphics.DrawString(string, font, brush, widthOfPage / 2F, yPoint, stringformat);

这对我需要做的事情很好。 我一直都知道我要打印的内容,因此我可以手动修剪任何字符串,使其适合80mm的收据纸。 然后,我不得不添加一些额外的功能,以使其更加灵活。 用户可以传递将添加到底部的字符串。

由于我不知道它们将要放置什么,因此我创建了自己的自动换行函数,该函数接受许多要换行的字符和字符串本身。 为了找出字符数,我正在做这样的事情:

float width = document.DefaultPageSettings.PrintableArea.Width;
int max = (int)(width / graphics.MeasureString("a", font).Width);

现在,宽度返回我283,单位为毫米,约为72,这在考虑80毫米纸张上的边距时很有意义。

但是MeasureString方法在Courier New 8pt字体上返回10.5。 因此,我得到的是26,而不是超出预期的36-40,导致两行文本变成了3-4。

PrintableArea.Width的单位为1/100英寸,图形对象的PageUnit为Display(表示打印机通常为1/100英寸)。 那为什么我只拿回26呢?

回答1

从WindowsClient.net:

GDI +在显示的每个字符串的每一端添加少量(1/6 em)。 此1/6 em允许带有悬垂末端的字形(例如斜体“ f ”),并且还为GDI +提供了少量回旋余地,以帮助扩展网格拟合。

DrawString的默认操作将在显示相邻运行时对您不利:

  • 首先,默认的StringFormat在每个输出的每一端添加一个额外的1/6 em。
  • 其次,当网格拟合的宽度小于设计的宽度时,允许字符串最多收缩一个em。

为避免这些问题:

  • 始终将MeasureStringDrawString传递给基于印刷StringFormat( GenericTypographic )的StringFormat。
    将图形TextRenderingHint设置为TextRenderingHintAntiAlias 。 此渲染方法使用抗锯齿和子像素字形定位来避免进行网格拟合,因此固有地与分辨率无关。

.NET中有两种绘制文本的方式:

  • GDI +( graphics.MeasureStringgraphics.DrawString
  • GDI( TextRenderer.MeasureTextTextRenderer.DrawText

来自Michael Kaplan(出色的博客)的出色博客,在.NET 1.1中,一切都使用GDI +进行文本渲染。 但是有一些问题:

  • GDI +的某种无状态性质会导致一些性能问题,先设置设备上下文,然后在每次调用后还原原始上下文。
  • 国际文本的整形引擎已针对Windows / Uniscribe和Avalon(Windows Presentation Foundation)进行了多次更新,但尚未针对GDI +进行更新,这会导致对新语言的国际渲染支持不具有相同的质量水平。

因此,他们知道他们想更改.NET框架以停止使用GDI +的文本呈现系统,并使用GDI 。 最初,他们希望他们可以简单地进行更改:

graphics.DrawString

调用旧的DrawText API而不是GDI +。 但是他们不能像GDI +那样使文本包装和间距完全匹配。 因此他们被迫保留graphics.DrawString来调用GDI +(兼容性原因;正在调用graphics.DrawString会突然发现他们的文本没有像以前那样包装)。

创建了一个新的静态TextRenderer类,以包装GDI文本呈现。 它有两种方法:

TextRenderer.MeasureText
TextRenderer.DrawText

注意: TextRenderer是GDI的包装,而graphics.DrawString仍然是GDI +的包装。


然后是如何处理所有现有的.NET控件的问题,例如:

  • Label
  • Button
  • TextBox

他们想切换到使用TextRenderer (即GDI)的功能,但是必须小心。 可能有些人像在.NET 1.1中一样依赖控件绘图。 因此诞生了“兼容的文本渲染”。

默认情况下,应用程序中的控件的行为与.NET 1.1中的控件相同(它们是“兼容的”)。

可以通过以下方式关闭兼容模式:

Application.SetCompatibleTextRenderingDefault(false);

这使您的应用程序更好,更快,并得到了更好的国际支持。 总结一下:

SetCompatibleTextRenderingDefault(true)  SetCompatibleTextRenderingDefault(false)
=======================================  ========================================
 default                                  opt-in
 bad                                      good
 the one we don't want to use             the one we want to use
 uses GDI+ for text rendering             uses GDI for text rendering
 graphics.MeasureString                   TextRenderer.MeasureText
 graphics.DrawString                      TextRenderer.DrawText
 Behaves same as 1.1                      Behaves *similar* to 1.1
                                          Looks better
                                          Localizes better
                                          Faster

注意GDI + TextRenderingHint与用于GDI字体绘制的相应LOGFONT Quality之间的映射也很有用:

TextRenderingHint           mapped by TextRenderer to LOGFONT quality
========================    =========================================================
ClearTypeGridFit            CLEARTYPE_QUALITY (5) (Windows XP: CLEARTYPE_NATURAL (6))
AntiAliasGridFit            ANTIALIASED_QUALITY (4)
AntiAlias                   ANTIALIASED_QUALITY (4)
SingleBitPerPixelGridFit    PROOF_QUALITY (2)
SingleBitPerPixel           DRAFT_QUALITY (1)
else (e.g.SystemDefault)    DEFAULT_QUALITY (0)

样本

以下是GDI +(graphics.DrawString)与GDI(TextRenderer.DrawText)文本呈现的一些比较:

GDI +TextRenderingHintClearTypeGridFitGDICLEARTYPE_QUALITY

在此处输入图片说明

GDI +TextRenderingHintAntiAliasGDIANTIALIASED_QUALITY

在此处输入图片说明

GDI +TextRenderingHintAntiAliasGridFitGDI不支持,使用ANTIALIASED_QUALITY

在此处输入图片说明

GDI +TextRenderingHintSingleBitPerPixelGridFitGDIPROOF_QUALITY

在此处输入图片说明

GDI +TextRenderingHintSingleBitPerPixelGDIDRAFT_QUALITY

在此处输入图片说明

我发现奇认为DRAFT_QUALITY相同PROOF_QUALITY ,其等同于CLEARTYPE_QUALITY

也可以看看

  • UseCompatibleTextRendering-与whaaaaaat兼容吗?
  • 全部整理:快速浏览Whidbey的TextRenderer
  • MSDN:LOGFONT结构
  • AppCompat Guy:GDI与GDI +文本渲染性能
  • GDI +文本,分辨率独立性和渲染方法。 或-为什么我的文字在GDI +和GDI中看起来不同?
回答2

信使新尺寸11

当您创建大小为11的'Courier New'字体时,您将得到如上图所示的输出。 您会看到高度为14像素(不包括下划线)。 宽度恰好是14像素(每个字符7像素)。

因此,此字体呈现14x14像素。

但是TextRenderer.MeasureText()返回的宽度为21个像素。 如果您需要精确的值,这是没有用的。

解决方案是以下代码:

Font i_Courier = new Font("Courier New", 11, GraphicsUnit.Pixel);

Win32.SIZE k_Size;
using (Bitmap i_Bmp = new Bitmap(200, 200, PixelFormat.Format24bppRgb))
{
    using (Graphics i_Graph = Graphics.FromImage(i_Bmp))
    {
        IntPtr h_DC = i_Graph.GetHdc();
        IntPtr h_OldFont = Win32.SelectObject(h_DC, i_Courier.ToHfont());

        Win32.GetTextExtentPoint32(h_DC, "Áp", 2, out k_Size);

        Win32.SelectObject(h_DC, h_OldFont);
        i_Graph.ReleaseHdc();
    }
}

k_Size将包含正确的大小:14x14

重要说明:此代码正确测量常规字体。 如果您还需要斜体字体(在右边总是有一个突出的)的确切值,则应阅读本文中提到的链接:http://www.codeproject.com/Articles/14915/Width-of-斜体文字

附录:对于那些从未在C#中使用过API调用的人,这里提供了如何创建Win32类的提示。 这还不完整。 有关更多详细信息,请访问http://www.pinvoke.net

using System.Runtime.InteropServices;

public class Win32
{       
    [StructLayout(LayoutKind.Sequential)]
    public struct SIZE
    {
        public int cx;
        public int cy;
    }

    [DllImport("Gdi32.dll")]
    public static extern bool GetTextExtentPoint32(IntPtr hdc, string lpString, int cbString, out SIZE lpSize);

    [DllImport("Gdi32.dll")]
    public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
}
回答3

这是可以帮助您了解其工作原理的说明。 是什么导致每个字符前后或多或少的空格。

GDI DrawString Configurator应用程序

屏幕截图

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Why is Graphics.MeasureString() returning a higher than expected number?
    I'm generating a receipt and am using the Graphics object to call the DrawString method to print out the required text. graphics.DrawString(string, font, brush, widthOfPage / 2F, yPoint, stringformat); This works fine for what I needed it to do. I always knew what I was printing out, so I could manually trim any strings so it would fit properly on 80mm receipt paper. Then I had to add an extra bit of functionality that would make this more flexible. The user could pass in strings that would be added to the bottom. Since I didn't know what they were going to put, I just created my own word wrap
  • TextRenderer.MeasureText and Graphics.MeasureString mismatch in size
    This is not a rounding problem. Difference ~ 5+ pixels. Test Case String: ""MACD (26,12,9) -0.000016" e.Graphics.MeasureString("MACD (26,12,9) -0.000016", SystemFonts.DefaultFont).Width) TextRenderer.MeasureText("MACD (26,12,9) -0.000016", SystemFonts.DefaultFont).Width) The result is always: 139.3942 134 Why is there so much difference in size? I just need the round of width of string outside paint method. But it should match MeasureString or vice versa.
  • How to highlight wrapped text in a control using the graphics?
    I need to highlight the particular character in a control using the fill rect. I can get the location of the text when it's not wrapped by using the Graphics.MeasureString() method like below, var size = g.MeasureString(tempSearchText, style.Font, 0, StringFormat.GenericTypographic); If the text is wrapped then I'm not able to find the exact bounds of the character to highlight the text. I need to get the exact bounds of the given character in the text wich is wrapped. Provide your suggestion to achive this scenario.
  • 带有文字的半透明圆形控件(Translucent circular Control with text)
    问题 我正在做一个项目,其中我需要添加一个圆形的控件,中间带有一些文本。 我的问题是圆圈太小,当我调整它的大小时,它与其他控件重叠。 我想画一个与正方形相同宽度的圆。 否则。 如何使控件的背景透明? 我正在使用下面的代码: protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); using (Bitmap bitmap = new Bitmap(this.Width, this.Height)) { using (Graphics graphics = Graphics.FromImage(bitmap)) { graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.Clear(this.BackColor); using (SolidBrush brush = new SolidBrush(this._FillColor)) { graphics.FillEllipse(brush, 0x18 - 6, 0x18 - 6, (this.Width - 0x30) + 12, (this.Height - 0x30) + 12); } Brush FontColor = new SolidBrush(this.ForeColor)
  • Properly draw text using Graphics Path
    As you can see in the image below, the text on the picturebox is different from the one in the textbox. It is working alright if I use Graphics.DrawString() but when I use the Graphics Path, it truncates and doesn't show the whole text. What do you think is wrong in my code? Here is my code: public LayerClass DrawString(LayerClass.Type _text, string text, RectangleF rect, Font _fontStyle, PaintEventArgs e) { using (StringFormat string_format = new StringFormat()) { rect.Size = e.Graphics.MeasureString(text, _fontStyle); rect.Location = new PointF(Shape.center.X - (rect.Width / 2), Shape.center
  • Translucent circular Control with text
    I am working on a project wherein I need to add a Control with the shape of a Circle with some text in the middle. My problem is the circle is too small, when I resize it, it overlaps other controls. I want to draw the circle same width as the square. Otherwise. how can I make the Control's background transparent? I am using the code below: protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); using (Bitmap bitmap = new Bitmap(this.Width, this.Height)) { using (Graphics graphics = Graphics.FromImage(bitmap)) { graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.Clear
  • 为什么使用整数而不是Long?(Why Use Integer Instead of Long?)
    问题 我经常看到与vba Overflow错误有关的问题。 我的问题是为什么要使用integer变量声明而不是仅将所有数字变量(不包括double等)定义为long ? 除非您要执行for循环之类的操作,否则您可以保证该值不会超过32,767的限制,那么这是否会对性能产生影响或导致其他问题导致不使用long ? 回答1 整数变量存储为16位(2字节)数字 Office VBA参考 长(长整数)变量存储为带符号的32位(4字节)数字 Office VBA参考 因此,好处是减少了存储空间。 整数占用Long内存的一半。 现在,我们谈论的是2个字节,因此它不会对单个整数产生真正的影响,仅当您处理整数(例如大数组)的TONS且内存使用至关重要时,才需要担心。 但是在32位系统上,内存使用量减少了一半,但会降低性能。 当处理器实际上使用16位整数执行某些计算时(例如,增加循环计数器),该值将无提示地转换为临时Long,而没有使用更大范围的数字的好处。 仍然会发生溢出,并且处理器用来存储计算值的寄存器将以相同的方式占用相同数量的内存(32位)。 性能甚至可能会受到损害,因为必须转换数据类型(非常低的级别)。 不是我要找的参考,而是...。 我的理解是,底层的VB引擎即使将整数声明为整数,也会将整数转换为long。 因此,可以注意到速度略有下降。 我已经相信了一段时间
  • 为什么使用整数而不是Long?(Why Use Integer Instead of Long?)
    问题 我经常看到与vba Overflow错误有关的问题。 我的问题是为什么要使用integer变量声明而不是仅将所有数字变量(不包括double等)定义为long ? 除非您要执行for循环之类的操作,否则您可以保证该值不会超过32,767的限制,那么这是否会对性能产生影响或导致其他问题导致不使用long ? 回答1 整数变量存储为16位(2字节)数字 Office VBA参考 长(长整数)变量存储为带符号的32位(4字节)数字 Office VBA参考 因此,好处是减少了存储空间。 整数占用Long内存的一半。 现在,我们谈论的是2个字节,因此它不会对单个整数产生真正的影响,仅当您处理整数(例如大数组)的TONS且内存使用至关重要时,才需要担心。 但是在32位系统上,内存使用量减少了一半,但会降低性能。 当处理器实际上使用16位整数执行某些计算时(例如,增加循环计数器),该值将无提示地转换为临时Long,而没有使用更大范围的数字的好处。 仍然会发生溢出,并且处理器用来存储计算值的寄存器将以相同的方式占用相同数量的内存(32位)。 性能甚至可能会受到损害,因为必须转换数据类型(非常低的级别)。 不是我要找的参考,而是...。 我的理解是,底层的VB引擎即使将整数声明为整数,也会将整数转换为long。 因此,可以注意到速度略有下降。 我已经相信了一段时间
  • Flip the GraphicsPath that draws the text/string
    I have this method in my Text Class and I can't seem to flip the whole text. I am using a Matrix to transform the GraphicsPath which is used to draw the string. Here's the code since I used @Jimi's answer: public LayerClass DrawString(LayerClass.Type _text, string text, RectangleF rect, Font _fontStyle, Brush brush, float angle, PaintEventArgs e) { using (StringFormat string_format = new StringFormat()) { SizeF stringSize = e.Graphics.MeasureString(text, _fontStyle); rect.Location = new PointF(Shape.center.X - (rect.Width / 2), Shape.center.Y - (rect.Height / 2)); GraphicsContainer gc = e
  • MySQL高可用之组复制(1):组复制技术简介
    1.MySQL高可用的背景 数据库的主从复制是一个很实用的功能,但如何保证它的高可用却是一件难事。实现MySQL主从复制高可用的工具,常见的有: (1).MMM:淘汰了,在一致性和高并发稳定性等方面有些问题。(2).MHA:有些人还在用,但也有些问题,也是趋于淘汰的MySQL主从高可用方案。(3).Galera:引领时代的主从复制高可用技术。(4).MariaDB Galera Cluster:MariaDB对Galera的实现。(5).PXC:Percona XtraDB Cluster,是Percona对Galera的自我实现,用的人似乎很多。(6).GR:Group Replication,MySQL官方提供的组复制技术(MySQL 5.7.17引入的技术),基于Paxos算法。 MariaDB Galera Cluster、PXC、GR是类似的,都各有优点。但GR是革命性的,基于原生复制技术,据传很多方面都优于PXC。 但是,上面每个高可用实现方法,都有这样那样的缺点,甚至mmm还是通过perl脚本来自动化模拟高可用环境的。到了Galera,这是一个引领潮流的高可用技术,它主要针对具有事务特性的Innodb存储引擎,Percona和MariaDB都分别实现了自己的Galera技术:MariaDB Galera Cluster和Percona XtraDB Cluster
  • 方法链接-为什么这是一个好习惯?(Method chaining - why is it a good practice, or not?)
    问题 方法链接是对象方法返回对象本身以使结果被另一个方法调用的实践。 像这样: participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save() 这似乎被认为是一种好习惯,因为它会产生可读的代码或“流畅的界面”。 但是,对我而言,它似乎打破了面向对象本身所隐含的对象调用表示法-生成的代码不代表对先前方法的结果执行的动作,通常这就是预期面向对象的代码如何工作的方式: participant.getSchedule('monday').saveTo('monnday.file') 这种差异设法为“调用结果对象”的点符号创建了两种不同的含义:在链接的上下文中,以上示例将被视为保存参与者对象,即使该示例实际上旨在保存计划表也是如此。 getSchedule接收到的对象。 我知道这里的区别在于是否应期望被调用方法返回某些内容(在这种情况下,它将返回被调用对象本身以进行链接)。 但是,这两种情况与符号本身并没有区别,仅与被调用方法的语义相区分。 当不使用方法链接时,我总能知道方法调用是在与上次调用的结果相关的操作上进行的-通过链接,这种假设会中断,并且我必须在语义上处理整个链,以了解实际对象是什么叫真的是。 例如: participant.attend(event)
  • 将data.frame列从因子转换为字符(Convert data.frame columns from factors to characters)
    问题 我有一个数据框。 我们称他为bob : > head(bob) phenotype exclusion GSM399350 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119- GSM399351 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119- GSM399352 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119- GSM399353 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119- GSM399354 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119- GSM399355 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119- 我想连接此数据框的行(这将是另一个问题)。 但看: > class(bob$phenotype) [1] "factor" Bob的专栏文章是因素。 因此,例如: > as.character(head(bob)) [1] "c(3, 3, 3, 6, 6, 6)" "c(3, 3, 3, 3, 3, 3)" [3] "c(29, 29, 29, 30
  • 为什么不将异常用作常规控制流?(Why not use exceptions as regular flow of control?)
    问题 为了避免我可能会在Google上找到所有标准答案,我将提供一个示例,让您所有人都可以随意攻击。 C#和Java(以及太多其他类型)具有许多我根本不喜欢的“溢出”行为(例如type.MaxValue + type.SmallestValue == type.MinValue ,例如: int.MaxValue + 1 == int.MinValue )。 但是,从我的恶毒天性来看,我会通过将这种行为扩展为Overridden DateTime类型来加重这种伤害。 (我知道DateTime在.NET中是密封的,但是出于这个示例的缘故,我使用的伪语言与C#完全一样,除了DateTime没有密封)。 重写的Add方法: /// <summary> /// Increments this date with a timespan, but loops when /// the maximum value for datetime is exceeded. /// </summary> /// <param name="ts">The timespan to (try to) add</param> /// <returns>The Date, incremented with the given timespan. /// If DateTime.MaxValue is
  • 为什么列表上的总和(有时)比itertools.chain快?(why sum on lists is (sometimes) faster than itertools.chain?)
    问题 我在这里回答了几个问题,使用它来“拉平”列表列表: >>> l = [[1,2,3],[4,5,6],[7,8,9]] >>> sum(l,[]) 它工作正常,并产生: [1, 2, 3, 4, 5, 6, 7, 8, 9] 尽管有人告诉我sum运算符的作用是a = a + b ,但它的表现不如itertools.chain 我计划的问题是“为什么在列表上可能在字符串上被阻止”,但是我在计算机上进行了一个快速基准测试,比较了sum和itertools.chain.from_iterable在同一数据上: import itertools,timeit print(timeit.timeit("sum(l,[])",setup='l = [[1,2,3],[4,5,6],[7,8,9]]')) print(timeit.timeit("list(itertools.chain.from_iterable(l))",setup='l = [[1,2,3],[4,5,6],[7,8,9]]')) 我做了几次,总是得到如下相同的数字: 0.7155522836070246 0.9883352857722025 令我惊讶的是, chain -每个人在对我的答案的几条评论中都推荐给列表的sum -慢得多。 当在for循环中for迭代时,它仍然很有趣,因为它实际上并没有创建列表
  • C#:在节点上单击时,TreeView所有者图形带有ownerdrawtext和怪异的黑色突出显示(C#: TreeView owner drawing with ownerdrawtext and the weird black highlighting when clicking on a node)
    问题 我将DrawMode设置为OwnerDrawText并添加到DrawNode事件上,添加了我的代码以所需的方式绘制文本,并且所有工作都很好,除了在选择节点时突出显示了一些奇怪的黑色选择。 没问题,我添加了逻辑来检查节点的状态是否被突出显示,并绘制了自己的突出显示,除了单击节点时才添加黑色突出显示,而不仅仅是选中了...一旦鼠标按钮突出显示,矩形就会覆盖我的突出显示被释放但确实被绘制并闪烁...这很烦人。 :/ 显然我忘了真正问我的问题...在不完全处理图纸的情况下如何摆脱选择呢? 回答1 以我的经验,您通常不会。 您自己绘制还是不绘制。 如果尝试在控件绘制的图形之上合成图形,则最终会出现故障。 这有点麻烦,因为您必须处理焦点矩形,选择突出显示并自己绘制所有字形。 从好的方面来说,视觉样式可以用来完成大部分工作。 这是一些代码,可以帮助您找到大部分的方法(这是不完整的,因为它使用了一些未包括的方法,并且不能完全呈现普通树视图的功能,因为它支持渐变填充的项目和列,但是应该是方便参考) protected virtual void OnDrawTreeNode(object sender, DrawTreeNodeEventArgs e) { string text = e.Node.Text; Rectangle itemRect = e.Bounds; if (e.Bounds
  • 为什么将整数除以-1(负数)会导致FPE?(Why does integer division by -1 (negative one) result in FPE?)
    问题 我的任务是解释一些看似奇怪的C代码行为(在x86上运行)。 我可以轻松完成所有其他工作,但是这真的让我感到困惑。 代码段1输出-2147483648 int a = 0x80000000; int b = a / -1; printf("%d\n", b); 代码段2不输出任何内容,并给出Floating point exception int a = 0x80000000; int b = -1; int c = a / b; printf("%d\n", c); 我很清楚代码片段1( 1 + ~INT_MIN == INT_MIN )结果的原因,但我不太了解如何将-1除以整数会生成FPE,也无法在Android手机上重现它(AArch64 ,GCC 7.2.0)。 代码2的输出与代码1相同,没有任何例外。 它是x86处理器的隐藏错误功能吗? 作业没有任何其他信息(包括CPU架构),但是由于整个课程都是基于台式机Linux发行版的,因此您可以放心地假定它是一台现代的x86。 编辑:我联系了我的朋友,他在Ubuntu 16.04(Intel Kaby Lake,GCC 6.3.0)上测试了代码。 结果与指定的赋值一致(代码1输出上述内容,代码2因FPE崩溃)。 回答1 这里发生了四件事: gcc -O0行为说明了两个版本之间的区别: idiv与neg 。 (当clang
  • 无法从领域对象检索字段值,调试器中的值为null(Cannot retrieve field values from realm object, values are null in debugger)
    问题 似乎RealmProxy类隐藏了我的RealmObject值,但可以从proxyclass进行设置。 如您所见,我的模型非常简单。 public class GroupRealm extends RealmObject { @PrimaryKey public String id; @Index public String name; public String imageUrl; public int order; public GroupRealm parent; public RealmList<GroupRealm> children; public RealmList<ContentRealm> contents; } 这就是我设置值的方式(db是有效的领域,并且一切都在提交正常的事务中): GroupRealm gr = db.where(GroupRealm.class).equalTo("id",g.GroupID).findFirst(); if(gr==null){ gr = db.createObject(GroupRealm.class,g.GroupID); } gr.imageUrl = g.GlyphUrl; gr.name = g.Title; gr.order = g.OrderNum; 下图是我查询后面的db时得到的结果
  • How to print a text file on thermal printer using PrintDocument?
    I'm creating an application using C# with Winforms and now I need to print the receipt of sale on a thermal printer. To do this I'm creating a text file and reading it to print using the PrintDocument but I cannot do this because I don't know how to configure paper size, align text center on the paper, and others configurations. When I do print the text file is printed, but all messy, and after the end print the paper isn't stopping. How could I do this ? trying. private PrintDocument printDocument = new PrintDocument(); private static String RECEIPT = Environment.CurrentDirectory + @"
  • 为什么Ruby中的除法返回整数而不是十进制值?(Why is division in Ruby returning an integer instead of decimal value?)
    问题 例如: 9 / 5 #=> 1 但我预期为1.8 。 如何获得正确的十进制(非整数)结果? 为什么它全部返回1 ? 回答1 它正在做整数除法。 您可以通过添加.0来使数字之一成为Float: 9.0 / 5 #=> 1.8 9 / 5.0 #=> 1.8 回答2 它正在做整数除法。 您可以使用to_f强制事物进入浮点模式: 9.to_f / 5 #=> 1.8 9 / 5.to_f #=> 1.8 如果您的值是变量而不是文字,那么这也适用。 将一个值转换为浮点数足以将整个表达式强制转换为浮点运算。 回答3 也可以使用Numeric#fdiv方法代替: 9.fdiv(5) #=> 1.8 回答4 您可以使用irb进行检查: $ irb >> 2 / 3 => 0 >> 2.to_f / 3 => 0.666666666666667 >> 2 / 3.to_f => 0.666666666666667 回答5 您可以包括ruby mathn模块。 require 'mathn' 这样,您将能够正常进行划分。 1/2 #=> (1/2) (1/2) ** 3 #=> (1/8) 1/3*3 #=> 1 Math.sin(1/2) #=> 0.479425538604203 这样,您可以得到精确的除法(Rational类),直到决定应用无法表示为有理数的运算(例如Math.sin
  • 如何写斐波那契数列?(How to write the Fibonacci Sequence?)
    问题 我最初对程序进行了错误编码。 我没有为程序返回范围内的斐波那契数(即startNumber 1,endNumber 20应该仅= 1和20之间的那些数字),而是为程序编写了显示范围之间的所有斐波那契数(即startNumber 1,endNumber 20)。显示=前20个斐波那契数字)。 我以为我有一个确定的代码。 我也看不出为什么会这样。 startNumber = int(raw_input("Enter the start number here ")) endNumber = int(raw_input("Enter the end number here ")) def fib(n): if n < 2: return n return fib(n-2) + fib(n-1) print map(fib, range(startNumber, endNumber)) 有人在我的第二部分中指出了这一点(由于重复而被关闭-https://stackoverflow.com/questions/504193/how-to-write-the-fibonacci-sequence-in-python-part-ii)需要使用while循环将startNumber和endNumber通过生成器传递。 有人可以指出我的操作方向吗? 欢迎任何帮助。 我是一名学习型程序员