问题标签 [paintbox]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2011 浏览

delphi - 使用 DragImage 在拖放期间绘制 TPaintBox

在我的应用程序(Delphi 2007)中,我想将项目从 ListView 拖到 PaintBox 并突出显示 PaintBox 的 OnPaint 处理程序中的相应区域。然而,我总是得到丑陋的文物。你对我如何摆脱它们有什么建议吗?

测试项目:新建一个 VCL 应用,将 Unit1.pas 中的代码替换为以下代码。然后启动应用程序并将列表项拖到 PaintBox 中的矩形上。

编辑:这是故障图片:DragImage artefact http://img269.imageshack.us/img269/6535/15778780.png

我希望看到带有粗边框的完整蓝色矩形。然而,在拖动图像下方可以看到未突出显示的矩形。

编辑 2: 本网站谈论“绘画问题”:

ImageList SDK 指出,在绘制拖动图像时,您可能会遇到更新或屏幕绘制问题,除非您使用 ImageList_DragLeave API 函数在绘制时隐藏拖动图像(这是类中的 HideDragImage 方法所做的)。不幸的是,如果您不拥有正在绘制的控件,那么这样做并不是一个真正的选择。

我没有最后一句中提到的问题。尽管如此,我还是找不到正确的位置和正确的图像列表(它不是我的测试项目中的 ImageList1 - 可能是 ListView1.GetDragImages)来调用 ImageList_DragLeave。

0 投票
1 回答
3639 浏览

delphi - Delphi - TPaintBox - 调整大小

我在调整 TPaintBox 大小并在其上绘图时遇到问题:

在我的表单(名为 FMain)上,我删除了一个 TPaintBox(名为 DisplayImage),我试图在调整表单大小时调整它的大小。

为此,我为 FMain 编写了一个 OnResize() 方法(我确认它被正确调用),在该方法中我尝试调整 DisplayImage 的大小:

恕我直言,最后一个代码应该在整个图像上绘制一个完整的绿色矩形,使其有效地始终为绿色。相反,我得到一个灰色图像(就像 Delphi 的标准 bg-color 一样),并且在调整大小期间每隔一段时间,绿色图像就会闪烁。

我错过了什么,调整大小后是否需要更新一些隐藏组件?

先感谢您,

暴风雪

0 投票
2 回答
1175 浏览

delphi - 在 tpanel 上创建 tpaintbox 的问题

我有一个小问题。我正在尝试在 TPanel 上创建一个 TPaintBox,如下所示:

现在,如果我将 PaintBox 的父级更改为 Form1,我可以看到画笔。但是,将父级更改为 Panel1,没有任何反应。知道如何解决这个问题吗?

提前致谢!

0 投票
2 回答
6643 浏览

delphi - 如何消除TPaintBox右边缘的闪烁(例如调整大小时)

总结:
假设我有一个 TForm 和两个面板。面板对齐 alTop 和 alClient。alClient 面板包含一个 TPaintBox,其 OnPaint 涉及绘图代码。

组件上 DoubleBuffered 的默认值为 false。

在绘图过程中,闪烁很明显,因为表格,面板都绘制了它们的背景。

因为表单被面板覆盖,所以截取它的 WM_ERASEBKGND 消息可能没问题。如果不是这样,当窗体调整大小时,可能会在面板上看到闪烁,并在面板的右边缘闪烁,因为窗体绘制了它的背景。

其次,因为 alTop 面板旨在成为某些按钮的容器,所以最好将其 DoubleBuffered 设置为 true 以让 Delphi 确保其上没有闪烁。它可能不会带来太多的性能负担。

第三,由于 alClient 面板仅作为另一个绘图组件的容器,因此该面板很可能参与最终绘图的组成。在这方面,使用 TPanel 后代而不是标准 TPanel 可能会更好。在这个 TPanel 后代中,覆盖受保护的过程 Paint 并且在过程内部不做任何事情,尤其是不要继承调用以避免基类 TCustomPanel.Paint 中的 FillRect 调用。此外,拦截 WM_ERASEBKGND 消息并且在里面什么也不做。这是因为当TPanel.ParentBackground为False时,Delphi负责重绘背景,为True时,ThemeService负责。

最后,要在 TPaintBox 中进行无闪烁绘制:
(1) 使用 VCL 内置的绘图例程,最好...
(2) 使用 OpenGL,启用 OpenGL 的双缓冲区。
(3) ...

===Q:如何消除TPaintBox右边缘的闪烁?===

假设对于一个 TForm,我有两个面板。顶部相对于表单对齐 alTop 并被视为按钮的容器。另一个是 alClient 相对于窗体对齐,并被视为绘制组件的容器(例如 VCL 中的 TPaintBox,或 Graphics32 中的 TPaintBox32)。对于后一个面板,它的 WM_ERASEBKGND 消息被截获。

现在,我在下面的示例代码中使用了一个 TPaintBox 实例。在它的 OnPaint 处理程序中,我有两种选择来绘制我希望没有闪烁的绘图。选项 1 是在填充矩形后绘制。因为它的父面板不应该擦除背景,所以绘图应该是无闪烁的。选择 2 是在 TBitmap 上绘图,然后将其 Canvas 复制回油漆盒。

但是,两个选项都在闪烁,第二个选项尤其闪烁。我主要关心的是选项 1。如果您调整表单的大小,您会看到闪烁的主要部分发生在右边缘。为什么会这样?有人可以帮助评论原因和可能的解决方案吗?(注意,如果我在这里使用 TPaintBox32 而不是 TPaintBox,右边缘根本不会闪烁。)

我的第二个担心是,当使用选项 1 时,闪烁的小部分随机发生在颜料盒上。如果您快速调整表单大小,这不是很明显但仍然可以观察到。此外,当使用选项 2 时,这种闪烁变得更加严重。我没有找到这个的原因。有人可以帮助评论可能的原因和解决方案吗?

任何建议表示赞赏!

===问:如何正确拦截面板重绘背景?===
(如果我应该在一个单独的问题中问这个问题,请直接说出来,我将删除它。)

新建一个VCL应用,粘贴示例代码,附上FormCreate,运行debug。现在将鼠标悬停在表单上,​​您可以看到面板正在重新绘制其背景。但是,如示例代码所示,我应该已经通过拦截 WM_ERASEBKGND 消息来拦截此行为。

注意,如果我注释掉这三行,

然后可以捕获 WM_ERASEBKGND 消息。我不知道这种差异。

有人可以帮助评论这种行为的原因,以及如何正确拦截 WM_ERASEBKGND 消息(当 ParentBackground := False 时)?

0 投票
2 回答
2440 浏览

delphi - 没有关键事件的 Delphi PaintBox

我看到我的 delphi 版本,没有用于 TPaintBox 的 Key Events(OnKeyDown, OnKeyUp, OnKeyPress) 事件。我想处理类似的事情。有人有这些事件的油漆盒吗?

0 投票
1 回答
1698 浏览

delphi - Delphi:将 TPaintbox 直接导出/绘制到具有自定义图像大小的文件

我已经ExtCtrls.TPaintBox用几个帮助函数进行了子类化并覆盖了该Paint方法。我可以将 a 添加TPaintBox到表单中,然后将其用作我的自定义画框对象并绘制所需的输出。

现在我想将我的画框的内容绘制(写入)到一个文件中,但尺寸不同;例如,在我的应用程序的 UI 中,paintbox 的大小为 150x600(宽 x 高),但是当绘制到文件时,我需要它更大。

我希望能够重用我的绘图代码(= TPaintBox.Paint)并将其虚拟绘制到an object然后将该对象保存到文件中。

我已经能够导出它,但是在导出时调整大小会使图像看起来像你会用油漆放大它。

0 投票
1 回答
1319 浏览

android - Delphi XE5 - TPaintBox 在 Android 机器上的 TListBox 下滚动太慢

我正在 Delphi XE5 上创建 Firemonkey 移动应用程序。我想使用 TPaintBox 组件来显示一些文本(2000 多个带有特殊字符的单词、表格)。我创建了带有 TListBox 的表单和type TListBoxItemPaintBox = Class(TListBoxItem)包含 TPaintBox 的特殊 TListBoxItem 。想法很简单——在 TPaintBox 上我将绘制数据,而 TListBox 将负责滚动。

当这个应用程序在 Win32 下编译时,一切运行完美,滚动很快。但是当我在我的手机上用 Android 编译这个应用程序时,应用程序变得毫无用处 - 滚动是令人难以置信的 ss-ll-oooo-www。

这是我的应用程序的完整代码(简化但工作版本)

有谁知道如何使它在Android上运行?是否有更合适的方式使用 TPaintBox 或者我应该使用完全不同的组件?

0 投票
0 回答
517 浏览

forms - 从paintbox borland c ++ builder中擦除线条

*使用 bcb6 (borland) c++ builder

我做了画框,并在此方法的 OnPaint 事件中绘制了轴系。

另外,在这种形式中我有计时器,并且在计时器方法中我画线,但我希望每次只有一条线在轴系上,这意味着,我想在画下一条线之前擦除这条线。

我尝试在计时器方法中执行:paintbox1->canvas->invalidate() 但它不起作用。

有什么想法可以解决这个问题吗?

谢谢!

0 投票
1 回答
1163 浏览

canvas - 油漆盒不从计时器方法 c ++ builder borland 绘画

我正在使用 Borland C++Builder 6。

我有两种形式的方法:

在第一种方法中,我绘制坐标系。

在第二种方法中,我做了:

并且该线不出现在坐标系上。

我的第二个问题,我怎样才能擦除线条并返回基础油漆?我应该这样做吗?

0 投票
2 回答
9154 浏览

delphi - 如何在 FMX 画布上用 Delphi 画一条线

这是 Delphi Berlin 10.1 Update 2

以下作品(我画了一条线):

以下不起作用:

为什么我不能用第二个?我怎样才能让它工作,或者我应该像第一个例子一样坚持创建笔刷?

我已经包含了一个最小的应用程序:

主文件

主.fmx:

测试.dpr: