使用BitBlt在图片背景上滚动文本

时间:2013-07-07 10:34:41

标签: winapi gdi+ sprite gdi bitblt

我的用户控件旨在用作平滑的垂直文本滚动条。 它使用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

1 个答案:

答案 0 :(得分:1)

如果背景应该在文本移动时保持固定,我建议您保留两个单独的位图:一个包含背景图像,另一个包含透明背景上的文本。< / p>

然后,在每个计时器刻度上,首先绘制背景位图,然后在所需的偏移位置绘制文本位图。

我不明白为什么你需要P / Invoke BitBlt函数。等效的GDI +函​​数有什么问题,由.NET Framework包装为Graphics.DrawImage