问题标签 [custom-draw]

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 投票
5 回答
5726 浏览

winapi - Win32 List-View Control SubItem padding for custom-drawn SubItems?

When using custom-draw (NM_CUSTOMDRAW) to draw the entire contents of a ListView SubItem (in Report/Details view), it would be nice to be able to apply the same left and right padding in my custom paint method that is applied by the control itself for non-custom-drawn items.

Is there a way to programmatically retrieve this padding value? Is it related to the width of a particular character (" " or "w" or something?) or is it a fixed value (6px on left and 3px on right or something) or...?

EDIT: To clarify, I want to add the same padding to my NM_CUSTOMDRAWn SubItems that the control adds to items that it draws, and the metric that I'm looking for, for example, is the white space between the beginning of the 2nd column and the word "Siamese" in the following screenshot (Note: screenshot from MSDN added to help explain my question):

List View in Report View
(source: microsoft.com)

Note that the word "Siamese" is aligned with the header item ("Breed"). I would like to be able to guarantee the same alignment for custom-drawn items.

0 投票
1 回答
2330 浏览

visual-c++ - 如何在自定义淹没 CListCtrl 中更改项目大小和它们之间的间隙

据我所知ON_WM_MEASUREITEM,不会在自定义绘制列表控件中调用。仅当控件为所有者绘制时才使用。

我找到了一种方法来做到这一点,但这有点像 HACK,我仍然无法控制它们以某种方式自动设置的项目之间的差距。

诀窍是您可以CImageList使用所需大小的未使用图像创建,如果将此类图像列表分配给列表控件,则项目的大小将调整为接近图像大小的尺寸。之后,您可以使用自定义绘图在这些放大的项目中绘制任何内容。

所以问题是如何在自定义淹没控件中更改项目大小和它们之间的间距?

LVS_OWNERDRAWFIXED还是我唯一的选择是完全由所有者绘制的控件?

0 投票
1 回答
1596 浏览

mfc - CListCtrl:在同一列上使用不同字体时如何获取列宽?

我从 CListCtrl 派生了一个名为 CListCtrlCustomDraw 的类,并使用 NM_CUSTOMDRAW 处理程序来绘制列表。
问题是我选择的项目和未选择的项目有不同的字体,它们是列表控件的成员变量,但是当我使用

计算列宽时,列表使用未选中项的字体,该字体没有
选中项的字体(粗体)那么宽,因此即使内容相同,也会有一些内容无法显示在
选中项中。

我可以设置使用哪种字体来计算列宽吗?
我尝试在上述代码之前设置字体,但没有效果。
任何建议将不胜感激。

0 投票
5 回答
16219 浏览

windows - Win32:如何自定义绘制编辑控件?

我需要实现EM_SETCUEBANNER的功能,其中一个文本提示出现在 Edit 控件中:

编辑控件中的提示横幅示例

问题是我不能使用第 6 版的通用控件,这是获得 Microsoft 提供的提示横幅实现所必需的。

我已经研究过简单地将编辑控件的文本和字体格式更改为

但它会抛出我无法避免的更改事件(更高组件库提供的组件包装器)。

所以我改为自定义绘制文本,在控件未聚焦且为空时绘制提示横幅文本,否则依赖默认绘制。

Edit 控件并没有很好地公开自定义绘图机制,如 ListView、TreeView 和其他提供的 .

其他人已经研究过了,但这似乎是一项几乎不可能完成的任务:

从事情的方式来看,我将不得不处理以下消息:

  • WM_ERASEBKGND、WM_PAINT(原因很明显)
  • WM_SETFOCUS、WM_KILLFOCUS(防止白条显示——如上所述)
  • WM_CHAR(处理和更新控件中的文本)

而且我还需要找到一种在控件中显示插入符号的方法,因为我还没有找到一种方法来允许 Windows 为我做到这一点,而无需同时绘制我提到的白条。

这将会非常好玩。:翻白眼:

鉴于 Windows Edit 控件从未打算自定义绘制:有谁知道如何自定义绘制 Windows Edit 控件?


注意:我也会接受解决我问题的答案,而不是回答我的问题。但是任何其他想要自定义绘制编辑控件的人,遇到这个问题,可能会想要一个答案。

0 投票
1 回答
1576 浏览

c++ - CustomDraw 中的 SetWindowLong 导致未处理的异常

我正在使用自定义绘图对 CSliderCtrl 进行一些更改,该控件将在对话框中使用。这是结构: 在我的 MessageMap 中,我有:ON_NOTIFY_REFLECT_EX(NM_CUSTOMDRAW, OnNMCustomdraw)

OnNMCustomdraw 方法如下所示:

阅读周围我了解到您必须使用 SetWindowLong 设置自定义绘制的返回值,否则您的方法将不会总是收到 CDDS_ITEMPREPAINT 消息。但是,当使用 SetWindowLong 时,我的应用程序将永远不会收到 CDDS_ITEMPREPAINT,因此我的滑块看起来就像一个标准滑块。当滑块上发生任何类型的交互时,应用程序会崩溃,例如将鼠标悬停在滑块上或最小化和最大化对话框。

我剪断了 TBCD_CHANNEL 代码,因为它从未到达过。

在调试模式下运行时,它会在 afxcrit.cpp 中的 AfxUnlockGlobals 方法结束时崩溃。这是一个堆栈跟踪: 更新:由于添加了调试符号,崩溃似乎是在 CWnd::DefWindowProc mwthod 处发生的。

那么,有人对这件事有任何见解吗?如果您需要更多信息,请告诉我。


更新:我现在找到了一种解决方法,而不是使用 SetWindowLong,我只是将结果分配给 pResult,然后返回。我通过调用 SetRangeMin(GetRangeMin(), TRUE); 强制重新绘制确实重新绘制子项目;虽然不完全优雅,但它可以工作。

0 投票
1 回答
1277 浏览

c++ - 自定义绘制 CTreeCtrl:如何添加字体删除线?

我已经在我的 MFC 智能设备程序中为 CTreeCtrl 实现了自定义绘制。我已经成功更改了 CTreeCtrl 的特定节点的颜色。我现在正在尝试了解如何获取用于在控件中绘制文本的默认字体,以便我可以为某些节点的字体添加删除线。我将如何获取用于在 CTreeCtrl 中绘制文本并将字体删除线应用于字体的默认字体?

0 投票
5 回答
9300 浏览

delphi - 以 Delphi 形式绘制控件

如何在 Forms 画布上和 Form 上的控件上绘制一些东西?

我尝试以下方法:

该矩形是在绘制其他控件之前绘制的,因此它隐藏在控件后面(根据 Delphi Docs,这是预期的行为)。

我的问题是如何绘制控件?

0 投票
0 回答
1888 浏览

delphi - 使用面板自定义绘制 ListBox 项

可能重复:
可以模仿 Firefox 的“附加组件|扩展列表”的 Delphi 控件?

我想做一个自定义 ListBox 控件。它可能看起来像 Firefox 下载

Firefox 下载示例

但我不想为任何特定布局硬编码自定义绘图,而是允许单独定义布局。让我解释一下,列表框将有一个已发布的属性 Layout: TWinControl 这个想法是在说面板中设计一个布局,因此对于上面的示例,它看起来像:

具有行布局的面板

然后在 ListBox 的 customdraw 中,它将使用面板的绘画。当然,每一行都会绘制相应项目的数据。因此控件将是 DbAware 并且 recordIndex 将针对每次抽奖进行调整。(我不是真的用DBAware控件,我用的是自定义数据绑定,不过原理是一样的)

有没有人已经做过这样的事情?认为这是一个好/坏主意?

我已经开始编写一个测试应用程序并将编辑这个问题以添加具体的实施问题,

我希望对所有行只使用 1 个面板实例,它不应该在列表框之外自己看到。

到目前为止,我尝试Panel.PaintTo()在 ListBox 中使用OnDrawItem,它基本上可以工作,但前提是 Panel 是父级并且在表单的其他地方可见。我可以让面板不可见但仍然使用它的绘画吗?您将如何实施?

0 投票
1 回答
479 浏览

cocoa - NSSplitView 中的 NSOutlineView 徽章

我有一个 NSOutlineView,我使用 drawAtPoint:、NSAttributedString 和 NSBezierPath 在单元格的右侧绘制徽章编号。当在 NSSplitView 的子视图中调整大纲视图的大小时,我的问题存在。徽章随着调整大小向左或向右移动。当他们到达单元格本身的文本时,他们不会停止或截断它们下面的文本。它只是飞过来。

有没有办法让单元格识别它旁边的自定义绘制视图并相应地截断文本?我已经尝试过解决方案 PXSourceList,但这也无济于事。

0 投票
1 回答
1032 浏览

ios - 如何在 iPhone SDK 中使用手势在屏幕上绘图?

我想通过在屏幕上移动手指来在屏幕上绘图。

我们如何在 iPhone SDK 中实现这一点?