0

私のユーザー コントロールは、スムーズな垂直テキスト スクローラーとして動作することを目的としています。を使用して、(スクロールする) テキストをコントロールのサーフェスに一度だけレンダリングしますTextRenderer.DrawText。次に、タイマーを開始し、各ティックでBitBltクライアント全体を 1 ピクセル上に Bit-Blit ( ) します。コントロールのデバイス コンテキストは、次のように、操作のソースと宛先の両方です。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

コントロールの background として画像を設定するBitBltと、その上に表示されるテキストとともに背景がスクロールされます。もちろん、スクロールするのはテキストだけで、背景画像は静止したままにしたいです。

次のスレッドを見つけました。これは、背景が無地の均一な色であるTransparentBlt代わりに使用することを提案しています: BitBlt でコピーする方法?BitBlt

このソリューションは、カラフルな背景が使用されている当面のケースには適していないことを示唆していました。

文字自体は単色の単色ですのでご了承ください。

アドバイスをいただければ幸いです。それが問題であれば、私は VB.NET 2005 を使用しています。

4

1 に答える 1

1

テキストがその上を動き回っている間、背景が固定されたままであると思われる場合は、2 つの別個のビットマップを維持することをお勧めします。

次に、各タイマー ティックで、最初に背景ビットマップを描画し、次に目的のオフセット位置にテキスト ビットマップを描画します。

BitBltこの関数を P/Invoke する必要がある理由がわかりません。既に .NET Framework によってラップされている同等の GDI+ 関数の何が問題になっていGraphics.DrawImageますか?

于 2013-07-07T10:44:46.363 に答える