0

我的用户控件旨在作为平滑的垂直文本滚动器运行。它只将文本(要滚动)渲染到控件的表面一次,使用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背景是要忽略的纯色统一颜色:如何使用 BitBlt 复制?

建议的解决方案不适合手头的情况,其中使用了彩色背景。

请注意文本本身是纯色的。

您的建议将不胜感激。如果有任何问题,我正在使用 VB.NET 2005

4

1 回答 1

1

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

然后,在每个计时器滴答声中,首先绘制背景位图,然后在所需的偏移位置绘制文本位图。

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

于 2013-07-07T10:44:46.363 回答