- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
介绍
我的问题来自过去几天来我一直在处理的一个相当有趣的问题。我最近问了一个有关Writing a custom property inspector - How to handle inplace editor focus when validating values?的问题
自那以来,我的控件取得了一些不错的进步,例如在中间添加了一个分隔符以分隔Name和Value行,并且重要的是,该分隔符可用于调整两列的大小。
这是我的问题开始的地方,在调整分隔符大小的同时可以看到就地编辑器,这会导致我的控件稍微变慢。因此,我进一步更改了代码,以仅在未调整分隔符大小的情况下显示就地编辑器。因此,基本上,我使用Canvas.TextOut
将我的值绘制为字符串,如果选择了一行,则上面显示了Inplace编辑器。如果调整分隔符的大小,则内部编辑器将隐藏,一旦调整大小操作完成,内部编辑器将再次变为可见。
虽然这解决了我提到的缓慢问题,但我遇到了一个新问题,即就地编辑器(基本上是TEdit)中的文本与我使用Canvas.TextOut
绘制的文本略有不同
例子1
区别是非常细微的,但是如果您看起来足够近,则可以看到它:
图1 Canvas.TextOut
图2 DrawText
您可能需要使用屏幕放大镜看得更近一些,但是使用SomeText行时,它更加引人注目,因为Some
和Text
之间的间距以及T
中e
和Text
之间的间距略有不同。
例子2
一个更好的示例也许是将Canvas.TextOut
和DrawText
与就地编辑器(TEdit)文本进行比较:
图3比较
如您所见,这里的区别更加明显。使用True
时,字符串Canvas.TextOut
显然显示出文本字符之间的间距要大得多,因为DrawText
和inplace editor
完全相同地呈现文本。
当我使用Canvas.TextOut
时,在调整检查器分隔符的大小以及显示和隐藏就地编辑器之间,我遇到各种可怕的文本不匹配的情况。如果我没有尝试过并尝试过其他的文本绘制方法,我想我不会意识到其中的区别并找到解决方案。重要的是要知道在将文本绘制到 Canvas 上时,我使用的字体设置与为原位编辑器定义的字体完全相同。
现在,我使用的是DrawText
而不是Canvas.TextOut
,一切都可以与就地编辑器以及我希望的方式一致地工作。
题
我的问题是什么使Canvas.TextOut
呈现文本与DrawText
如此不同?从我的示例并处理我当前的问题,很明显Canvas.TextOut
不会以与具有相同Font设置的TEdit相同的方式呈现文本,但是DrawText
似乎以正确的方式呈现文本。
这使我对Canvas.TextOut
的使用提出疑问,如果它不能正确呈现文本,我是否应该始终使用DrawText
代替?
测试演示
您可以使用以下代码自行测试:
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
FFont: TFont;
FRect: TRect;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FFont := TFont.Create;
FFont.Color := clNavy;
FFont.Name := 'Segoe UI';
FFont.Size := 9;
FFont.Style := [];
FRect := Rect(10, 30, 100, 100);
Canvas.Font.Assign(FFont);
Edit1.Font.Assign(FFont);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FFont.Free;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.TextOut(10, 10, 'Canvas.TextOut: [True]');
DrawText(Canvas.Handle, PChar('DrawText: [True]'), Length('DrawText: [True]'), FRect, DT_LEFT);
end;
True
时字符串
Canvas.TextOut
中的间距,从我的 Angular 来看,它与
DrawText
和
TEdit
绘制文本的方式明显不同。
T
中的
e
和
Text
之间以及在
T
中的
r
和
True
之间可以看到明显的差异。
T
和
e
之间的字距紧调比
DrawText
(使用
Canvas.TextOut
)的
ExtTextOut
更近一个像素。
True
在指导下放大了700%
T
和
r
之间的字距调整比
DrawText
(使用
Canvas.TextOut
)和
ExtTextOut
和Inplace编辑器(TEdit)距更近一个像素。
Arial, Cambria, Candara, Comic Sans MS, Consolas, Courier, Courier New, Fixedsys, Georgia, Lucida Console, Lucida Sans Unicode, Microsoft Sans Serif, Tahoma, Terminal and Times New Roman.
Calibri, Corbel, Myriad Pro, Segoe UI, Trebuchet MS and Verdana.
DrawText
一样呈现文本的字体,Inpace编辑器(TEdit)控件也使用
Canvas.TextOut
进行渲染。不好的结果表明
Canvas.TextOut
呈现的文本与其他方法略有不同。
最佳答案
观察到的差异是由于使用了不同的WinAPI文本呈现功能及其行为。具体字符kerning
In typography, kerning (less commonly mortising) is the process of adjusting the spacing between characters in a proportional font, usually to achieve a visually pleasing result. Kerning adjusts the space between individual letter forms, while tracking (letter-spacing) adjusts spacing uniformly over a range of characters.
The DrawText function draws formatted text in the specified rectangle. It formats the text according to the specified method (expanding tabs, justifying characters, breaking lines, and so forth).
Canvas.TextOut
使用)ExtTextOut
声明:
BOOL ExtTextOut(
_In_ HDC hdc,
_In_ int X,
_In_ int Y,
_In_ UINT fuOptions,
_In_ const RECT *lprc,
_In_ LPCTSTR lpString,
_In_ UINT cbCount,
_In_ const INT *lpDx
);
If the lpDx parameter is NULL, the ExtTextOut function uses the default spacing between characters. The character-cell origins and the contents of the array pointed to by the lpDx parameter are specified in logical units. A character-cell origin is defined as the upper-left corner of the character cell.
DrawText
将自动绘制格式化的文本,包括调整字符之间的间距(字距调整),而
ExtTextOut
默认情况下将使用字符之间的默认间距(无字距调整)。如果要调整字符之间的间距,则必须计算并提供字距调整数组(
lpDx
)参数。
T
和视觉上适合
T
的小写字母,或
AV
适合
V
的
A
。不同的字体也具有不同的默认字距,这就是为什么某些字体使用这两种功能在外观上呈现相同效果的原因,而有些字体则没有。字距调整还取决于字体大小。例如,在
AV
处用
Arial
呈现的字符
9 pt
将对两个函数具有相同的输出,而在
Arial
处的
12 pt
将导致不同的输出。
ExtTextOut
进行无字距调整,第二行使用
DrawText
进行自动字距调整。
关于delphi - 使用Canvas.TextOut有什么含义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31968771/
这个问题在这里已经有了答案: Towards the "true" definition of JAVA_HOME (5 个答案) 关闭 4 年前。 为什么 ActiveMQ 提供者需要设置 JAV
这个问题在这里已经有了答案: What is a lambda expression in C++11? (10 个答案) 关闭 8 年前。 这是来自 boosts asio 的一个例子。这是什么意
这个问题在这里已经有了答案: What does the double colon (::) mean in CSS? (3 个答案) 关闭 7 年前。 我经常看到这种用法。特别是伪类。“::”在
嗨,另一个愚蠢的简单问题。我注意到在Apple框架中的某些typedef中使用符号"<<"谁能告诉我这是什么意思?: enum { UIViewAutoresizingNone
someObject.$() 是什么意思? 我正在浏览 sapui5 工具包中的 tilecontainer-dbg 文件,发现了这个: var oDomRef = this.$(); or some
这个问题已经有答案了: How to interpret function parameters in software and language documentation? (4 个回答) 已关闭
我遇到过这个语法。任何人都可以解释一下 getArg1ListInfo:()=>(object.freeze(arg1)) 的含义 function foo (arg1,arg2) { let
对于子类,我有以下代码: class child1 : public parent { public: static parent* function1(void) { ret
这个问题在这里已经有了答案: What does "|=" mean? (pipe equal operator) (6 个答案) 关闭 1 年前。 我有一部分代码包含以下功能: void Keyb
以下在 C++ 中是什么意思? typedef PComplex RComplex [100]; 请注意,PComplex 是我代码中的用户定义类型。 谢谢 最佳答案 RComplex 是 PComp
在我的 Lisp 代码中,我有函数 (nfa-regex-compile),它创建一个包含初始状态、转换和最终状态的 cons 列表(表示自动机的节点)从作为参数给出的正则表达式开始。 在这种情况下,
以下文字摘自 Learning Spark 第 3 章 One issue to watch out for when passing functions is inadvertently seria
PHP 文档 block 中以下内容的含义是什么: #@+ zend框架代码中的一个例子: /**#@+ * @const string Version constant numbers */ c
由于 python 的一些版本控制问题,我必须使用自定义函数来比较 HMAC (SHA512)。为此,我找到了这个函数: def compare_digest(x, y): if not (i
取自this answer here : static const qi::rule node = '{' >> *node >> '}' | +~qi::char_("{}"); 请注意,声明了名称
我正在查看 chi 包的文档。我看到类似的东西: https://github.com/pressly/chi/blob/master/_examples/rest/main.go#L154 data
我想知道如果我采用值为 8 的 INT,这是否意味着我只能从 1 到 99999999 或从 1 到 4294967295 UNSIGNED? 最佳答案 文档似乎很清楚这一点: Numeric Typ
我想知道如果我采用值为 8 的 INT,这是否意味着我只能从 1 到 99999999 或从 1 到 4294967295 UNSIGNED? 最佳答案 文档似乎很清楚这一点: Numeric Typ
这个问题在这里已经有了答案: 关闭9年前。 Possible Duplicate: Does “/* (non-javadoc)” have a well-understood meaning? 以下
在 Prolog 代码中,可以使用“ headless ”Horn 子句将指令传递给编译器,这些子句与指向左侧的物质蕴涵 ':-' (⇐) 的左侧没有头部关系。例如,导入模块或声明 Unit Test
我是一名优秀的程序员,十分优秀!