C#:在自定义控件中滚动/自动调整子控件的大小,慢速重新绘制

C#:在自定义控件中滚动/自动调整子控件的大小,慢速重新绘制,c#,scroll,resize,custom-controls,scrollbar,C#,Scroll,Resize,Custom Controls,Scrollbar,我目前正在编写一个自定义控件,它必须持有子控件,并且必须支持滚动和自动调整。 自动滚动是不可能的,因为我的控件是完全自绘制的,只应滚动控件的一部分 现在控件的重新绘制速度非常慢,尤其是使用文本框和按钮控件以及系统绘制。停用系统绘制(TextBox.BorderStyle=BorderStyle.Fixed)会有所帮助,但控件也应支持此功能。使用SetRedraw并在之后更新控件没有帮助,因为文本框systemdraw被忽略,文本框看起来很难看。刷新我的整个控件或使用`RedrawWindow再次

我目前正在编写一个自定义控件,它必须持有子控件,并且必须支持滚动和自动调整。 自动滚动是不可能的,因为我的控件是完全自绘制的,只应滚动控件的一部分

现在控件的重新绘制速度非常慢,尤其是使用文本框和按钮控件以及系统绘制。停用系统绘制(
TextBox.BorderStyle=BorderStyle.Fixed
)会有所帮助,但控件也应支持此功能。使用
SetRedraw
并在之后更新控件没有帮助,因为文本框systemdraw被忽略,文本框看起来很难看。刷新我的整个控件或使用
`RedrawWindow
再次减慢绘制速度

我还尝试挂起我的控件和子控件布局,但没有成功

有人知道如何加快儿童控制绘画的速度吗

我的自定义控件具有样式
ControlStyles.allpaintingwmpaint | ControlStyles.supports备用backcolor | ControlStyles.OptimizedDoubleBuffer

ChildControl绑定在(MyControl)Resize和(滚动条)ValueChanged上更改

使用计时器有点帮助,但我不知道这是否真的是正确的解决方案

编辑:
我发现了问题,在重新激活
SetRedraw
Refresh
后,
OnPaint
使用37个控件触发38次。有什么解决办法吗?

有这么多控件,速度会变慢,其中37个控件太多了。相比之下,MicrosoftOutlook使用了大约50个窗口,而仅仅一个控件就有38个窗口。由于这些控件上的透明度效果,它变得格外缓慢。OnPaint()方法经常运行以提供控件的背景像素。你不能总是解决这个问题,例如,一个按钮会让它的父按钮绘制背景,即使它不是透明的。控件非常方便,但并不便宜


在这方面真正取得成功的唯一方法是:停止使用这么多控件,停止尝试支持透明度。不知道你用的是什么,但一个标签,例如,是特别浪费。在OnPaint方法中使用TextRenderer.DrawText还可以绘制一个标签,减去控件的成本。

使用这么多控件会变慢,其中37个控件相当多。相比之下,MicrosoftOutlook使用了大约50个窗口,而仅仅一个控件就有38个窗口。由于这些控件上的透明度效果,它变得格外缓慢。OnPaint()方法经常运行以提供控件的背景像素。你不能总是解决这个问题,例如,一个按钮会让它的父按钮绘制背景,即使它不是透明的。控件非常方便,但并不便宜


在这方面真正取得成功的唯一方法是:停止使用这么多控件,停止尝试支持透明度。不知道你用的是什么,但一个标签,例如,是特别浪费。在OnPaint方法中使用TextRenderer.DrawText还可以绘制减去控件成本的标签。

我可以通过添加一个自定义标志来加快绘制速度,该标志告诉我OnPaint是由我的控件还是由子控件触发的。如果我的控件触发事件,我会将控件内容绘制到位图中,然后为childcontrols执行blit操作。

我可以通过添加一个自定义标志来提高速度,该标志告诉我OnPaint是由我的控件还是由子控件触发的。如果我的控件触发事件,我会将控件内容绘制到位图中,然后对childcontrols进行blit。

您是否尝试使用double buffer属性?如您所见,我已在set Style中设置double buffer您是否尝试使用double buffer属性?如您所见,我已在set Style中设置double buffer谢谢您的回答,我想使用控件,因为我不想写我自己的文本框,似乎没有其他方法不重写文本框,这很不寻常。首先挑选低挂的水果、标签、图片框、面板。简化用户界面,没有一个用户可以在不犯错误或不打瞌睡的情况下填充几十个文本框。谢谢你的回答,我想使用控件,因为我不想编写自己的文本框,好像没有其他方法了。不要重写文本框,这很不寻常。首先挑选低挂的水果、标签、图片框、面板。简化用户界面,任何用户都无法在不出错或不打瞌睡的情况下填充几十个文本框。