我的用户控件旨在用作平滑的垂直文本滚动条。
它使用TextRenderer.DrawText
将文本(要滚动)呈现为仅控制的表面 。
然后它启动一个计时器,在每个计时器上,Bit-Blits(BitBlt
)整个客户端矩形向上一个像素。控件的设备上下文是BitBlt
操作的来源和目的地,如下所示:
Protected Sub handleTimerTick(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim oG As Graphics = Me.CreateGraphics()
Dim sHdc As IntPtr = oG.GetHdc()
Dim iRes As Integer = BitBlt(sHdc, 0, 0, Me.ClientRectangle.Size.Width, Me.ClientRectangle.Size.Height, sHdc, 0, 1, SRCCOPY)
oG.ReleaseHdc(sHdc)
oG.Dispose()
End Sub
只有当我的控件背景为纯色(例如Me.BackColor = Color.Gray
)时,才能成功完成所需的滚动效果但。
如果我将图片设置为控件的背景,BitBlt
会滚动背景以及显示在其上的文字。当然,我只想滚动文本,背景图像保持静止。
我找到了以下主题,建议使用TransparentBlt
代替BitBlt
,其中背景是要忽略的纯色统一颜色:How to copy with BitBlt?
解决方案建议不适合手头的情况,使用彩色背景。
请注意 文字本身颜色均匀。
非常感谢您的建议。如果有任何问题,我正在使用VB.NET 2005 。
答案 0 :(得分:1)
如果背景应该在文本移动时保持固定,我建议您保留两个单独的位图:一个包含背景图像,另一个包含透明背景上的文本。< / p>
然后,在每个计时器刻度上,首先绘制背景位图,然后在所需的偏移位置绘制文本位图。
我不明白为什么你需要P / Invoke BitBlt
函数。等效的GDI +函数有什么问题,由.NET Framework包装为Graphics.DrawImage
?