- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将在这里扔掉它以获得一些反馈,我称之为“remember to count zero”(感谢Andreas Rejbrand提供的链接。事实证明,使用像素时被称为“一个问题解决”)。记住要数零是什么意思?好吧,如果您实现了一个例程,该例程需要计算矩形运算中涉及的像素数(例如FillRect
或CopyRect
),则必须记住零(0,0)是一个像素。但是,将零视为像素而不是无值数量的规则似乎只在涉及<= 0值的坐标时起作用。举个例子:
mRect:=Rect(0,0,10,10);
mRectWidth:=mRect.right-mRect.left; // returns 10 - 0 = 10
function getRectWidth(const aRect:TRect):Integer;
Begin
result:=(aRect.right-aRect.left) +1;
End;
mRect:=Rect(0,0,0,0);
mRectWidth:=(mRect.right-mRect.left) + 1;
0 – 0 = 0 : +1 = 1
,这意味着如果您不注意盲点,将渲染像素。让我感到困惑的是,Delphi XE实际上似乎存在一个裁剪问题(?),或者至少在矛盾上是矛盾的。因为您实际上会在底部和最右边损失一个像素(如果绘制到该像素)。
ClientRect
是否不应该从第一个像素到最后一个像素返回完整的绘图范围? –但是,如果您尝试这样做:
mRect:=getClientRect;
MoveTo(mRect.left,mRect.Bottom);
LineTo(mRect.right,mRect.bottom);
clientrect
时,您必须手动对其进行调整?
clientrect
是可以使用的整个区域范围。当在裁剪区域外滑动并使用重叠的矩形时,它们还为“盲点”增加了高度。
Rect(-10,-10,10,10)
。为了在此处正确地“剪切”目标,以免在外部写入内存缓冲区时遇到访问冲突,您必须计算X1/Y1与
cliprect
(此处为
0,0,Width-1,Height-1
)之间的距离。
mOffset:= x2 - abs(x1)
。在我们的情况下,它变为10-10 =0。只要将
cliprect
设置为0,0,它就可以正常工作。但是,当您的
cliprect
移动到正数空间时,您将偏离一个像素。而且,如果您自动增加
getRectWidth
(例如
mWidth:=aRect.right-aRect.left +1
)中的值-根据源矩形,您将偏离2个像素(我知道,这是很无聊的事情)。
clientrect
是绝对的。这意味着您可以绘制到
mRect.bottom
或
mRect.right
并获得可见的结果。因此,我感到奇怪的是,我最喜欢的语言和工具包Delphi在使用它时总是必须手动调整每个
clientrect
或自定义控件的
ownerdrawn
。
最佳答案
这就是GDI的工作方式,而Delphi的TCanvas
仅反射(reflect)了基础框架。
例如,考虑 LineTo()
:
The LineTo function draws a line from the current position up to, but not including, the specified point.
FillRect()
:
The FillRect function fills a rectangle by using the specified brush. This function includes the left and top borders, but excludes the right and bottom borders of the rectangle.
Rectangle()
:
The rectangle that is drawn excludes the bottom and right edges.
GetWindowRect()
。
Retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen.
bottom
中的
right
和
RECT
值超出窗口边界1个像素。因此,窗口的宽度实际上是
width = right-left
,高度也是如此。我猜想选择惯例是为了保持这种平等。
TCanvas
代码中的错误-该代码可以正确且完全按设计工作。
关于delphi - Delphi的TCanvas中有错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6087286/
问题 我想开始将 TCanvas 从本质上是我程序的“模型”部分动态传递到“ View ”部分。我考虑这样做的方式是在启动时简单地在 View 上创建我的 TCanvas,然后在填充图形后用 View
我想创建一个TCanvas,这样我就可以更轻松地绘图。首先,我创建 Canvas MyCanvas:=TCanvas.Create;,然后获取句柄 DC:=GetWindowDC(Handle); 现
我正在使用这个 TCanvas 为我的鼠标绘制光标 Canv := TCanvas.Create; Canv.Handle := GetWindowDC(0); …… 对于每个老鼠事件,请执行以下操作
问题 我有一个 32 位像素数据数组,用于保存位图图像。 TPixel = packed record B: Byte; G: Byte; R: Byte; A: Byte; end;
令我惊讶的是,我发现在 TCanvas 上重复渲染文本在某种程度上是“附加的”。我意识到设置 Canvas.Brush.Style:=bsClear 是问题的原因,但我确实需要透明且重复地渲染文本(即
我正在尝试制作一个“空白”背景以在其上放置图像。通过将 TImage 放置在表单上并执行以下操作来创建剖面线并不太困难: image1.Canvas.brush.Style := bsDiagCros
不确定我是否在这里遗漏了一些东西,但是你可以在 Firemonkey TCanvas 中设置字体颜色吗? 我在以下属性中没有看到任何建议: Canvas.Font. ???? 任何帮助都会很棒 谢谢
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在使用 TextOut() 在 TCanvas 上绘制文本,但我想要更大的字体。 我能做什么? 最佳答案 试试这个 Canvas.Font.Size := ; Canvas.TextOut(0,0
在我的应用程序中,我需要在 TCanvas 上绘制一个“标记”,例如 Google map 标记(参见图片)。 我想使用半径、高度和原点作为参数: 我不知道要使用的算法。我可以使用圆弧来绘制顶部,但是
我需要什么 我需要获取 Firemonkey 组件的 TCanvas 的 DC。我需要它来使用无法通过 Firemonkey 访问的 Win API 绘图功能,主要是 100% 控制字体渲染。 显然,
最近我发现对于 TIcon 实例的对象,TCanvas.StretchDraw 无法按预期工作(快速查看 TIcon.Draw code> 和 DrawIconEx 方法告诉了原因)。德尔福help承
我正在使用 TextOut() 在 TCanvas 上绘制文本,但我需要不同的文本颜色。 我能做什么? 最佳答案 更改 Canvas 字体的颜色 Canvas.Font.Color := ; 关于de
我需要创建一个过程,例如: procedure GdiPie(Canvas: TCanvas; X1: Integer; Y1: Integer; X2: Integer; Y2: Integer;
我为我的公司编写了一个从图元文件到 SVG 的转换器(TCanvas->arc)。我已经完成了矩形或其他一些元素的转换,但我不知道如何转换圆弧。我用 JavaScript 编写代码。 :) 我有一个文
假设我有一个包含两个 TGraphs 的宏:T1 和 T2 并且我有一个 Canvas “C>”分为两部分: TCanvas *C = new TCanvas("","",0,0,400,400);
绘制到屏幕的规则是什么? 我的最终目标是将 TCanvas 放入一个类中并从那里绘画,但现在我认为也许看一个不太复杂的例子可能会有所帮助。下面是一些在我的计算机上编译并绘制到屏幕上的代码。 # inc
我开发了以下 AnimateRects() 方法来在 Windows 桌面上绘制动画矩形。我用它来动画显示模态表单,使它看起来像是从网格单元格中“生长”出来的。 在表单显示之前,我使用 bExpand
我有一个非常简单的 FireMonkey 应用程序,它只有一个表单,在 OnPaint 事件中有以下代码。当我使用 Windows 目标运行它时,我看到一条红线和一个红色方 block 。当我在我的
考虑以下代码: procedure TForm1.PaintBox1Paint(Sender: TObject); var vRect : TRect; vFormat : TTextForm
我是一名优秀的程序员,十分优秀!