问题标签 [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.
winapi - CDDS_ITEMPREPAINT GetItem 为孩子返回 false
我正在阅读 CDDS_ITEMPREPAINT 中子项的 tv.pszText,但每次运行此代码时它都会返回垃圾值。但它适用于父节点
对于作为父节点的 level==0 来说,它的运行很好,但对于作为子节点的 level==1,它会获得垃圾值。帮助表示赞赏!
delphi - 在鼠标位置绘制组件时闪烁
我正在尝试在光标的 X 位置绘制一条垂直线,该垂直线将随鼠标移动。这条线必须绘制在我表单上所有组件的“顶部”。为此,我使用了此处提供的一段代码:https ://stackoverflow.com/a/4481835 。
这是完整形式的代码:
它就像我想要的那样工作,除了一件事。当您左右移动鼠标(以及改变 X 位置)时,这条线会在屏幕上不断地被绘制和不被绘制而闪烁。当移动相对较快时,您还可以注意到“滞后”光标的行。
有谁知道如何改善这种视觉效果?另一种技术/算法?某处的专用组件?
winapi - 在按钮上处理 NM_CUSTOMDRAW - 但 Windows 仍然绘制文本
我正在尝试在我的 win32 应用程序中使用 NM_CUSTOMDRAW 而不是 WM_DRAWITEM 作为位图按钮。WM_DRAWITEM 工作正常 - 除了它在启用桌面主题的 WINE 下不起作用(出于某种原因,启用主题时,WINE 仅在您单击按钮时发送 WM_DRAWITEM)。
无论如何,我尝试从下面的“确定”按钮中删除 BS_OWNERDRAW - 让其他人独自一人。为了测试 WM_NOTIFY 的处理,我只需将我需要的字段从 NMCUSTOMDRAW 结构复制到 DRAWITEMSTRUCT 并将其传递给我现有的 WM_DRAWITEM 处理程序。按钮画得很好,但随后 Windows 在我的上面绘制了 OK 文本(我的文本被移动以为复选标记腾出空间)。我已经粘贴了下面的代码。我认为如果我返回 CDRF_SKIPDEFAULT 以响应所有 NM_CUSTOMDRAW 通知,Windows 就不会尝试绘制任何东西。显然我还有其他事情要做...
wpf - 强制在自定义 WPF 控件中重新绘制自定义绘制的 UIElement
我正在开发一个自定义 WPF 控件。此控件的主要目的是在可滚动区域中可视化数千个图形基元。控件模板的核心部分如下所示:
ItemAreaElement 负责绘制项目。为简单起见,我们可以认为它的核心部分是这样的:
每次当整个 ItemVisualizer 控件中的相关属性发生更改时,我都需要重新绘制 ItemAreaElement。但是,我没有找到在 WPF 中做到这一点的方法。Dispatcher 对象的众所周知的技巧在我的情况下不起作用:
,其中 _itemArea 是对在 OnApplyTemplate() 中获得的 ItemAreaElement 的本地引用:
还有其他方法可以强制更新我的构造中的 UIElement 吗?或者,我需要重新设计整个控件以使其成为可能?
wpf - 在 WPF 中使用 DrawingContext 进行奇怪的绘图
我正在开发一个自定义 WPF 控件,该控件应该在可滚动区域中可视化数千个图形基元。控件模板的核心部分如下:
为了获得更好的性能,所有绘图操作都在 ItemAreaElement 的 OnRender 方法中执行。为了获得清晰的绘图,我还在初始化代码中使用了以下设置:
但是,我的绘画有一些奇怪的问题。为了演示它们,我将 ItemAreaElement 的定义简化为以下内容:
当我在配备 282ppi 超高清屏幕(系统比例因子为 300%)的主开发笔记本电脑上启动此代码时,我得到了这张图片:
或者,在使用网格线放大paint.net 之后:
如您所见,我的 ItemAreaElement 的左边缘和上边缘被控件的边框部分覆盖。一定要这样吗?有没有我可以用来避免这种情况的设置?
第二个问题是不包括起点的线(请参阅我的“单元格”的左上角)。这是预期的行为吗?如果是这样,如何强制 WPF 绘制起始像素?
第三个问题是绿线应相交的位置或与设备无关的点(我的单元格的右下角)。如您所见,这一点是锯齿状的。我预计在那个地方只会看到一个绿色的广场。我可以在 DrawingContext.DrawLine 方法的帮助下实现吗?或者我是否需要使用更复杂的几何图形以及多点线的特殊设置等?
顺便说一句,当我在具有“经典”96 ppi 显示器且操作系统的比例因子设置为 100% 的测试电脑上启动此代码时,右下角的情况要好一些:
但我什至看不到顶行的水平红线或第一列的垂直红线。我希望在那里看到它们,但不会被控件的边界覆盖。如果您知道如何解决所有这些问题,请告诉我。
mfc - 如何在 MFC 应用程序中调整应用程序菜单栏的大小?
我正在使用 MFC,并且成功地创建了自定义绘制的菜单。每个菜单项都被正确测量和绘制,除了主级别项。我唯一无法完成的是重绘应用程序菜单栏。
我附上了两张图片:
- 第一个显示菜单栏的一部分。字体 Consolas 11pt 绘制正确。按钮的宽度计算正确,按钮需要分布在两行中。
- 第二张图片显示了相同的菜单栏,字体为 Consolas 20pt。现在菜单需要三行来包含所有菜单项。但是,每个单独行的高度不会更新。(在调试时,我看到 MeasureItem 覆盖计算每个菜单项的正确高度)。在菜单栏下方,有一个工具栏 (BCGToolBar),用于计算其栏的正确高度。
所以无论字体大小是什么,应用程序菜单栏永远不会改变它的高度?
如何在此 MFC 应用程序中调整应用程序菜单栏的大小?
到目前为止,我尝试过的事情是以不同的顺序遵循代码行:
performance - Delphi TTreeView OnCustomDrawItem 事件减慢它的速度
我有一个大纲应用程序(在 Delphi 10.2 Tokyo 中),用于记笔记(我称之为 NoteApp)。我有另一个用于编辑纯文本 (TextApp) 的应用程序。由于我经常在这些应用程序之间切换,我决定在 TextApp 中集成笔记功能。
我将代码从 NoteApp 复制/粘贴到 TextApp,并将组件(一个 TTreeView、一个 TRichEdit 和一个 TActionToolbar)放在 TextApp.Form_Main 上。TTreeView 的 OnCustomDrawItem 事件设置为根据对应的注释项的 NoteType 更改每个 Node 的 FontStyle,NoteType 是一个简单记录的数组:
我们的数组:
和事件:
当我在 NoteApp 中打开一个便笺文件时,它运行良好。当我在 TextApp 中打开同一个文件时,TTreeView 刷新缓慢。TTreeView 中的 top 项是可以的,但是越往下,刷新率越低。
所有组件的属性设置相同。我怀疑我在某个地方犯了错误。我将 TextApp 上所有其他组件的可见性设置为 false,但 TTreeView 仍然非常缓慢。如果我删除上面的代码,它会再次变快。我不在 TextApp 中使用运行时主题。
winapi - 自定义轨迹栏刻度
我正在使用库存的Trackbar控件。我想自定义绘制刻度。
这里我做了一个实验,只是想在合适的地方画图:
在我的CDDS_ITEMPREPAINT
, ifdwItemSpec == TBCD_TICS
中,更新矩形 ( NMCUSTOMDRAW->rc
) 始终是一个空矩形。我检查了,对于其他项目(TBCD_CHANNEL
和TBCD_THUMB
),我得到了一个有效的矩形,并且可以代替通道和拇指进行绘制。
好的:那么,TBCD_TICS
如果它没有给我一个可以绘制的矩形,那有什么意义呢?
所以也许我可以通过另一种方式获得刻度位置。好吧,有TBM_GETTICPOS,这似乎可行。除了文档提到这一点:
第一个和最后一个刻度线的位置不能通过此消息直接获得。
So how can I get the first and last tick positions? They do not correspond with the start and end of the channel, the ticks are inset slightly. Perhaps we can calculate the insert from the sides of the channel, but that seems fragile (especially on differently scaled displays).
c# - TabControl 自定义标签栏背景颜色
我有一个 TabControl,我需要自定义标签颜色。为此,我将 DrawMode 设置为 OwnerDrawFixed,并覆盖了 DrawItem 事件。但是,当我更改 DrawMode 时,选项卡栏的透明度似乎被替换为灰色。我需要让它再次透明,或者将颜色显式更改为主页背景颜色,但我不知道如何做到这一点。
我可以在 OwnerDrawFixed 和 Normal 之间来回切换,并且在设计模式下可以看到透明度的变化,但即使在正常情况下运行,我也会得到灰色的标签栏背景。
我的覆盖代码如下。
我也希望删除选项卡框周围的灰色边框,但除了在其顶部进行绘画之外,似乎没有一个好的方法可以做到这一点。有没有更好的办法?
listview - win32 ListView CustomDraw,为什么dwDrawStage值总是等于1
我在做win32 listview控件,想实现CustomDraw,
但我得到了一些奇怪的东西。我想知道为什么这个dwDrawStage值总是等于 1
OnListViewNotify
自定义绘图
想实现CustomDraw,但是我得到了一些奇怪的东西。我想知道为什么这个dwDrawStage值总是等于1
调试信息
感谢您分享您的智慧和经验;