- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将椭圆中间的数字显示为 Canvas 上绘制的文本。坐标(对于椭圆)将存储在数据库内,文本值将存储在数据库的另一部分中。
到目前为止,我所做的是我一直在使用 FMXExpress (Github) 的演示项目(DrawApp)。我将一些程序从私有(private)更改为公开。这些程序包括 StartDrawing(startP:TPointF)、EndDrawing(startP:TPointF)、DoDraw(),这样我就可以从外部单元/对象使用这些函数。该对象使用这些函数与 MouseUp/MouseDown 配合使用,以及一些属性(包括 fDrawing)来区分绘图是否正在进行以及正在使用什么工具(fdEllipse)。
我的主窗体在 FormCreate 中使用以下代码来初始创建 fdrawbox := TMyPaintBox.Create(Rectangle1);矩形 1 位于图像顶部,它代表显示 body 部位的网格,并且能够在图像顶部绘制圆圈。我发现创建文本或椭圆并不难,但是为了创建多个带有标识符的圆圈来区分圆圈,正如我所提到的,我想要一个数字来显示哪个圆圈是哪个。甚至在将来,我可能想更改颜色以显示要关注哪个圆圈。
demonstration for mypaintbox http://www.abatepain.com/abate/OHlbF.jpg
因此,以下代码 (Delphi FMX) 展示了通过利用 TRectangle 作为其父级来创建绘图应用程序。
with fdrawbox do begin
Parent := Rectangle1;
Visible := True;
ForegroundColor := TAlphaColor($FF000000); //
BackgroundColor := TAlphaColor($00000000); //
FuncDraw := TFunctionDraw.fdEllipse; //fdrawbox.fDrawing := True;
StartDrawing(PointF(100, 100));
EndDrawing(PointF(200, 200));
FuncDraw := TFunctionDraw.fdNone;
OnPaint := PaintBox1Paint;
end;
圆圈是使用最后几行创建的,但为了利用 FillText,我需要使用我创建的 OnPaint 函数,代码如下所示。我相信 DrawApp 在内部处理 OnPaint 函数,但它如何处理它仍然未知。但打印“Hello Text!!”仍然是必需的
procedure TMainForm.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
begin
with Canvas do begin
BeginScene();
//Clear(cbbg.Color);
Font.Style := [];
Font.Size := 12;
Fill.Color := TAlphaColors.Red;
FillText(TRectF.Create(0, 0, 300, 295), 'Hello Text!!', false, 100, [], TTextAlign.Center, TTextAlign.Center); //TFillTextFlag.RightToLeft
EndScene;
end;
Application.ProcessMessages;
end;
有人可以举一个例子来说明如何处理这个问题(可能在单个函数内),我可以在其中打印多个圆圈并在其后添加关联的文本吗?我相信在前面的示例中,我可以自己完成,但我必须手动输入 PointF(用于圆)和 TRectF 用于文本,并且它们都使用不同的值作为坐标。
最佳答案
正如您所注意到的,TMyPaintBox
类不支持文本渲染,也不支持文本输出中经常使用的属性,如字体或颜色等。但是您可以通过在私有(private)中定义字段来自行添加这些属性部分以及用于获取/设置公共(public)部分中的值的属性。
在下面,我假设添加字段 ftextout
、ffontsize
和 ffontcolor
以及相应的属性 TextOut
字体大小
和字体颜色
。
要以与绘制其他元素类型类似的方式添加渲染文本的功能,请将 fdText
作为新枚举添加到 TFunctionDraw
。
TFunctionDraw=(fdNone,fdPen,fdLine,fdRectangle,fdEllipse,fdFillBgr,fdBitmapStamp,fdPolyLine, fdText);
然后在TMyPaintBox.DoDraw
中向case ffdraw of
添加一个新的case选项,例如:
with vCanvas do
begin
BeginScene();
case ffdraw of
//
// other TFunctionDraw enums
//
TFunctionDraw.fdText: begin
{Canvas.}Font.Size := ffonsize; // new field
{Canvas.}Fill.Color := ffontcolor; // new field
{Canvas.}FillText(r, TextOut, False, 1, [],
TTextAlign.Center, TTextAlign.Center);
end;
end;
编辑:
TFunctionDraw.fdText
中对 Canvas
的引用是多余的。删除注释掉的引用文献。要使用的 Canvas 已在 with
语句中定义(添加到要显示的代码中)。哦,我讨厌那些with
!
还值得注意的是,如果您只想显示带有文本的圆圈,而不让用户在 Canvas 上绘制,则可以使用自己制作的组件更简单地实现它。
另外,不要直接调用DoDraw
。它由 Paint
调用,每当 fdrawbox
失效时都会触发该函数。因此,当您想要强制更新时,请调用 invalidate
。
编辑结束
然后您可以像任何其他元素绘制一样实现文本渲染(使用您的代码模板):
with fdrawbox do begin
Parent := Rectangle1;
Visible := True;
ForegroundColor := TAlphaColor($FF000000); //
BackgroundColor := TAlphaColor($00000000); //
FuncDraw := TFunctionDraw.fdEllipse; //fdrawbox.fDrawing := True;
StartDrawing(PointF(100, 100));
EndDrawing(PointF(200, 200));
FuncDraw := TFunctionDraw.fdText;
FontSize := 12; // set new property
FontColor := TAlphaColorRec.Red; // set new property
TextOut := 'Hello text!';
StartDrawing(PointF(100, 100));
EndDrawing(PointF(200, 200));
FuncDraw := TFunctionDraw.fdNone;
invalidate;
// OnPaint := PaintBox1Paint; // no need for this
end;
关于delphi - (Delphi FMX) 如何使用 Canvas.FillText 显示在椭圆的中间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38360343/
我想在 Canvas 上写一段文字。以下是代码: HTML JS var scaleCtx = document.getElementById("scaleChart").getContext("2
您好,我正在尝试将变量放入 context.fillText 的文本中。现在屏幕上显示“未定义”。我想在 Canvas 中显示用户输入的文本。我的代码是: Text: var t, wor
出于某种原因,当客户端连接到服务器时,ctx.fillText 不想绘制任何内容。控制台正在正确记录所有内容,因此该功能可以正常工作,但 Canvas 有点愚蠢。 这是服务器端代码的一部分: io.s
关于这个问题请看我的jsfiddle https://jsfiddle.net/gL4m2z6v/ 这是一个 Canvas 中的分数计算器,应该显示两个分数之间的最大公约数。您需要在 fiddle 中
我只是想在 Canvas 上 50、50 处绘制“hello”一词,但没有显示任何内容: var ctx = document.getElementByID("ctx").getContext(
我只是想在 Canvas 上画一封信。我正在使用 filltext() 在 Canvas 上绘制一个字符。 这是第一次工作,但如果我返回菜单并重试, Angular 色不会显示在 Canvas 上。
我正在尝试在 HTML5 Canvas 的 2d 上下文中使用 fillText() 方法来绘制用阿拉伯语编写的字符串。它工作得很好,直到我在字符串的末尾放置了一个标点符号。然后标点符号出现在字符串的
我正在尝试显示已存储在 MariaDB 中的文本区域信息。我存储文本信息没有问题。我遇到的问题是将格式从文本区域转换到我希望其显示的 Canvas 。 目标是让用户在文本区域中填写注释,然后将这些注释
我有一个 Canvas 元素,我想使用 fillText() 方法在其上放置一些文本。 我正在使用以下格式来执行此操作: ctx.font = "Bold Italic" + myText.fontS
只希望阴影动画并防止 fillText 由于字母像素化而动画一遍又一遍。 var canvas = document.getElementById('canvas') var ctx
我正在像这样将文本渲染到 HTML-Canvas 上: https://www.w3schools.com/code/tryit.asp?filename=FMSIQUFFO5PL 如您所见,文本应该
在 IE9 中运行下面的脚本会生成一个黄油般的平滑 动画。但是当在 Chrome20(win 和 mac)中运行时,相同的脚本会产生一个摇摆不定的动画。我该如何解决这个问题? 此外,如果有人也能对以下
从问题底部的屏幕截图中可以看出,或者通过 directly to the game .文本的放置方式因浏览器而异(firefox 15.0.1 的呈现方式与 IE 9.9 和 Chrome 21 不同
我有一个 Chart.js 圆环图,我必须在其中心显示一个值。有一个日期字段会刷新图表,从而影响中心值。 var text = dataTxt, textX = Math.round(
尝试将 fillStyle 颜色更改为许多不同的颜色,也尝试更改不同的位置,但没有任何效果。控制台也没有错误。我已经在 Canvas 上绘制了图 block 集和 Sprite ,这有什么关系吗?我只
我使用 OffscreenCanvas.getContext().fillText() 生成一些文本,然后使用 OffscreenCanvas.transferToImageBitmap() 获取 m
它确实显示了文本,但是在完全错误的位置(甚至不在 Canvas 元素本身!),并且颜色错误(总是黑色)。有没有人有这方面的经验或让它工作? 最佳答案 是的,这在 iOS 4.0 之前被破坏了。 它似乎
我想做的事情看起来很简单,但我就是无法让它正常工作。我正在尝试更改在 HTML5 Canvas 中绘制的元素的字体类型。我所拥有的是: function drawStaticElements(){
如果文本包含“\n”,我似乎无法将文本添加到 Canvas 。我的意思是,换行符不显示/不起作用。 ctxPaint.fillText("s ome \n \\n thing", x, y); 上
如果文本包含“\n”,我似乎无法将文本添加到 Canvas 。我的意思是,换行符不显示/不起作用。 ctxPaint.fillText("s ome \n \\n thing", x, y); 上
我是一名优秀的程序员,十分优秀!