问题标签 [onpaint]

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 投票
3 回答
2821 浏览

combobox - MFC:如何为所有者绘制渲染 Aero 风格的组合框?

我继承了一个大型 MFC 应用程序,其中包含一个CComboBox覆盖OnPaint. 目前,它的所有绘图都是手工完成的(使用线条和矩形),并呈现一个看起来明显是 Windows 98 风格的组合框。但是,它在其他方面工作得很好,并提供了许多我们所依赖的有用的自定义功能,并且重写整个控件可能不是一种选择。

我想对其进行现代化改造,以便OnPaint在可用的地方以 Aero 风格绘制(当现代主题不可用时回退到旧代码)。我已经使用我们拥有的其他一些自定义控件(例如按钮)完成了此操作,它非常适合我们的目的。我知道有一些微小的行为是不正确的,比如鼠标悬停时的柔和高光,但这对这个应用程序来说没什么大不了的。

我可以访问CVisualStylesXPckass,所以我已经有了基础设施来拨打电话OpenThemeDataGetThemeColor或者DrawThemeBackground很容易(通过LoadLibrary所以我们不强制 Vista 作为最小系统)。不幸的是,我不知道正确的调用顺序来获得带有主题适当边框和下拉按钮的漂亮组合框。

有人知道在这里做什么吗?

0 投票
1 回答
4045 浏览

c# - 将图像绘制到 Panel 控件上会在调整大小时产生伪影

目前我正在尝试做我认为是一项简单的任务:

Panel在 Windows 窗体中的控件的整个区域上绘制图像。(请暂时忽略我可以使用该BackgroundImage属性的那一刻)

要绘制的图像如下所示:

在此处输入图像描述

即一个黄色框,周围有一个 1 像素的蓝色框。

要绘制,我正在使用控件的Paint事件Panel

最初显示表单时,这看起来不错:

在此处输入图像描述

在调整表单(以及停靠面板)的大小时,它要么在变小时切割边缘......

在此处输入图像描述

...或者当它变大时,它会绘制人工制品:

在此处输入图像描述

我很确定发生了一些相当简单直接的事情,但我真的无法理解原因。

由于我忽略ClipRectangle并始终绘制所有内容,因此我认为图像会一直缩放。

我的问题是:

  • 文物出现的原因是什么?(我喜欢理解这一点!)
  • 为了摆脱人工制品,我必须做什么?(除了调用Invalidate每次调整大小)

更新,解决方案:

感谢Ryan 的回答,我能够找到一个可以接受的解决方案。基本上,我从 派生了一个类Panel,覆盖OnPaintBackground没有调用基方法。最后,我将以下代码添加到派生面板的构造函数中:

0 投票
1 回答
1971 浏览

c# - Winform 中的 OnPaint - .NET Compact Framework 3.5

我目前正在研究智能设备项目中的弯曲进度条。我重写了 OnPaint 函数。

在 Override OnPaint() 函数中,我用深灰色绘制弯曲的进度条,用黄色绘制进度条的一部分,以反映进度条的变化值(例如 30%)。但是,当值不断变化时,我可以看到进度条的一部分颜色变为黄色。但是,弯曲的进度条本身也被重新绘制。有谁知道如何避免在值发生变化时重绘原始曲线进度条?这样当值发生变化时,它只用黄色重绘进度条的一部分,而不是用灰色重绘原始进度条。这是我在 OnPaint 函数中使用的代码。

我曾尝试使用 Override OnBackgroundPaint 将原始弯曲进度条绘制为背景,以避免在 OnPaint 中重新绘制它,但它不起作用。加载表单时我看不到任何东西。有任何想法吗?

感谢您提前提供任何帮助。

问候

0 投票
2 回答
10310 浏览

c# - 在 C# 中具有重写 OnPaint 方法的 PictureBox

我想在 PictureBox 中绘制一些小图片(连续 4 x 32px 图像),所以我应该重写 OnPaint 方法还是需要制作扩展 PictureBox 的新组件?我试过这个,它在Java中工作,但不是在这里:

InitializeComponent 方法的完整代码:

0 投票
1 回答
2535 浏览

c++ - 使用 CDC::DrawText 绘制可变文本

我想在屏幕上显示一些可变的值。我有以下代码

它在窗口出现时绘制文本。但是在接下来的通话中,当文本不同时,屏幕上的文本并没有改变。使用调试器,我可以看到调用了 OnPaint, 文本已更改,但在我的窗口中文本保持不变。GetLastError() 返回 0。我想我错过了 DrawText 工作原理的重要内容。最后我尝试调用 UpdateWindow() ,但没有任何改变。由于某种原因屏幕没有更新..

0 投票
2 回答
25635 浏览

c# - 如何在 C# 中使用 OnPaint 事件?

我在网站上看到了一些类似的问题,但没有一个真的对我有帮助。

我有一个函数,当单击一个按钮时,它会在表单上绘制几行,这些行的形状取决于用户在某些文本框中输入的值。

我的问题是,当我最小化表单时,线条消失了,我明白这可以通过使用 OnPaint 事件来解决,但我真的不明白如何。

谁能给我一个简单的例子,使用 OnPaint 事件按下按钮,使用函数绘制一些东西?

0 投票
2 回答
2269 浏览

c# - 自定义控件 onPaint 事件不起作用

嘿人们我有一个问题,我正在编写一个自定义控件。我的控件继承自 Windows.Forms.Control 并且我试图覆盖 OnPaint 方法。这个问题有点奇怪,因为它只有在我在表单中包含一个控件时才有效,如果我添加另一个控件,那么第二个控件不会被绘制,但是 OnPaint 方法会为所有控件调用。所以我想要的是我所有的自定义控件都被绘制,这里不仅有一个是我的代码:

如果您运行代码,您将看到屏幕上只出现一个红色矩形。

0 投票
1 回答
752 浏览

vb.net - 为什么 Paint 不绘制此图像?

我正在重写我的控件中的 OnPaint 方法,该方法是直接从我自己的ICan3D.Graphics类生成的图像中绘制的。当我保存图像时(如您所见,该行已被注释掉)图像是正确的。但是,当表单加载时,它不会将图像作为背景显示。

我正在使用 VB.net,所以所有 .net 答案都是可以接受的 :)

0 投票
2 回答
232 浏览

c# - 如何在自定义控件中使用 Control.Update 方法

我将首先发布我的代码,因为它简短易懂,然后我会问我的问题。

控件大小应为 195,14,以防您决定尝试使用它。我在一个 200,200 的面板中有 8 个,在 1.6Ghz 原子处理器上运行。它用于在计算机上显示最多 3 节电池的值。标签每 500 毫秒刷新一次。正如您可能已经收集到的那样,有一点闪烁,但这是可以忍受的。如果可能的话,我希望更少。所以我开始研究使用更新,并移动我的一些代码,比如我想也许我应该把它移动到 OnPaintBackground() 的背景位,但是在我组成的测试框架中,更新方法并没有改变任何东西,并且当我使用 Invalidate 方法时,它同时运行 OnPaintBackground 和 OnPaint。这是我在这种情况下尝试过的。

我将一个用户控件设置为大约 300,300,因此我可以确定我所看到的。我忘了提到在我的 500 毫秒计时器的电池控制中,我只是更新文本、文本 2 和文本 3。我在想,如果该文本的值超出规范,我将设置电池故障标志,然后无效.. 但我不确定。那么我应该如何只更新文本???

0 投票
2 回答
453 浏览

visual-c++ - CStatic中的CPaintDC不切割绘图

据我所知,派生的 CStatic 控件中的我的 OnPaint() 方法应该是切割比控件大的绘图部分。但是它不这样做。