首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

[高难度]怎么解决设置TransparencyKey属性后窗体闪烁有关问题

2012-03-31 
[高难度]如何解决设置TransparencyKey属性后窗体闪烁问题?环境:VS2005 C# WinForm窗口设置TransparencyKey

[高难度]如何解决设置TransparencyKey属性后窗体闪烁问题?
环境:VS2005 C# WinForm

窗口设置TransparencyKey属性后(不管设成什么颜色),窗口加载时,未被透明的部分会先出现黑块,然后刷新成正常颜色,从而造成了闪烁。

双缓冲、屏蔽WM_ERASEBKGND这些方法都不管用(重载WndProc或采用下面代码)

C# code
            SetStyle(ControlStyles.UserPaint, true);            SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.            SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲


我觉得这黑块是系统为了画出透明部分而产生的。因此和是否擦除背景无关。(一篇资料上说VC下可以重载OnEraseBkgnd来防止设置透明色后带来的闪烁http://www.vckbase.com/document/viewdoc/?id=1148)


哪位朋友能够解决这个问题?

[解决办法]
沙发,没有遇到过不怎懂,路过帮忙顶下~
[解决办法]
试了一下,没有出现楼主说的问题(Win7+VS2005)

UI控件很多?

Form的构造函数代码贴上来看看
[解决办法]
帮顶一下。。。
[解决办法]
探讨
如果不透明区放的是系统控件,那么肯定会出现闪烁。用下面方法可以确定黑块是否存在:

[解决办法]
帮up,闪烁问题太烦人了
[解决办法]
确实有这个问题.
但是当TransparencyKey=Black就不会出黑块了,
只是文本如果是黑色,全部变成透明,继续找原因,很有意思.
[解决办法]
我想我可以解决你的问题。我起初遇到这个问题是尝试了N中方案,都无济于事,最后发现了一个“不成文”但很凑效的办法:
需要一个Timer,
先设置要加载窗体的Opacity=0,然后执行加载,最后启动Timer。
Timer的Interval随便,效果是一样的。我一般都是设为1ms。Timer_Tick事件里设置窗体的Opacity=1,停止Timer1即可。

效果:相比现在的黑框,修改后的程序加载时会稍微顿一下,但没有任何闪烁或黑框!


例如,我有一个项目几乎所有控件和图像资源都是在运行时生成的,需要从远程加载图片。而Form是个不规则的窗体,必须设置TransparencyKey。加载时黑的很恐怖。。我的解决办法就是:

首先:
this.Visible = False
this.Opacity = 0

然后设置窗体大小布局等,连接远程主机,读取数据库,加载图片资源,生成控件等。

最后;this.timer1.Enabled = True
(Load结束)

Sub timer1_Tick()
{
this.Opacity = 1
timer1.Enabled = False
}

这个方法我已经在多个项目中使用并且非常奏效。
[解决办法]
另外,如果最小化后还原时还有黑框闪烁,处理WndProc就行了。最小化时Opacity = 0,还原时启动timer。
例如:

VB.NET code
Protected Overrides Sub WndProc(ByRef m As Message)        Select Case m.Msg            Case &H5                ' 为避免加载窗体或还原窗体时绘制出现黑框,处理Windows消息                'change size: WM_SIZE                If True Then                    Dim newState As FormWindowState = FormWindowState.Normal                    Select Case m.WParam.ToInt32()                        Case 0                            'SIZE_RESTORED                            Me.Timer1.Enabled = True                        Case 1                            'SIZE_MINIMIZED                            Me.Opacity = 0                        Case 2                            'SIZE_MAXIMIZED                        Case Else                            Exit Select                    End Select                End If                Exit Select            Case Else                Exit Select        End Select        MyBase.WndProc(m)    End Sub 

热点排行