C# 在滚动面板时关闭/打开运行时合成的WS_EX_
我们是否可以仅在滚动面板/容器控件时打开WS_EX_COMPOSITED,然后将其关闭?在应用程序的整个生命周期中激活它,会影响应用程序周围的每个控件,我只需要在滚动面板时激活它 诸如此类:C# 在滚动面板时关闭/打开运行时合成的WS_EX_,c#,windows,scroll,panel,C#,Windows,Scroll,Panel,我们是否可以仅在滚动面板/容器控件时打开WS_EX_COMPOSITED,然后将其关闭?在应用程序的整个生命周期中激活它,会影响应用程序周围的每个控件,我只需要在滚动面板时激活它 诸如此类: private int originalExStyle = -1; private bool _scrolling = false; protected override CreateParams CreateParams { get {
private int originalExStyle = -1;
private bool _scrolling = false;
protected override CreateParams CreateParams
{
get
{
if (originalExStyle == -1)
originalExStyle = base.CreateParams.ExStyle;
CreateParams cp = base.CreateParams;
if (_scrolling)
cp.ExStyle |= 0x02000000; // Turn on
else
cp.ExStyle = originalExStyle; // Reset to original state
return cp;
}
}
protected override void OnScrollBegin(ScrollEventArgs se)
{
base.OnScrollBegin(se);
_scrolling = true;
RecreateHandle();
}
protected override void OnScrollEnd(ScrollEventArgs se)
{
base.OnScrollEnd(se);
_scrolling = false;
RecreateHandle();
}
请不要
重新创建句柄()代码>像那样。也许您只需要通过启用容器的DoubleBuffered
属性来双重缓冲容器,而不是应用WS_EX_COMPOSITED
样式来双重缓冲它包含的所有内容。阅读更多。作为CreateParams
添加/删除样式/标志的替代方法,您可以使用GetWindowLongPtr
和SetWindowLongPtr
函数。谢谢!是的,我知道,这只是一个例子,也是我唯一知道的重新调用CreateParams方法的选项,也许UpdateStyles也会起作用。我很可能会让它被双缓冲,有一天我会创建一个自定义滚动处理(将控件隐藏在视口之外,等等)。激活WS_EX_COMPOSITED非常糟糕。