Declare Function InvalidateRect Lib "user32" (ByVal hwnd As Long, _ lpRect As RECT, ByVal bErase As Long) As Long
InvalidateRect сообщает о необходимости полного или частичного обновления клиентской области окна
' Выводим бегущую строку на экран ' Добавьте на форму две кнопки и таймер с интервалом 1
Private Sub Command1_Click() Timer1.Enabled = True Command2.SetFocus End Sub
Private Sub Command2_Click() Timer1.Enabled = False RefreshDesktop Command1.SetFocus End Sub
Private Sub Timer1_Timer() ScrollDeskRight " Последние новости от Русского_Проекта ", 175 ScrollDeskLeft " Сегодня в 12 часов по московскому времени была обнаружена новая недокументированная функция API .", 325 End Sub
Public Sub RefreshDesktop() Dim rgn As Long Dim res As Long Dim del As Long Dim Y As Integer rgn = CreateRectRgn(0, 0, Screen.Width, Screen.Height) res = RedrawWindow(0, ByVal 0&, rgn, RDW_ERASE Or RDW_INVALIDATE Or RDW_ALLCHILDREN) ' Освобождаем ресурсы памяти del = DeleteObject(rgn) End Sub
Public Function ScrollDeskRight(sPrint As String, Y As Integer) As Long Dim hwndSrc As Long Dim hSrcDC As Long Dim lRtn As Long Dim rgn As Long Dim res As Long Dim del As Long Static X As Integer ' координата X ' Получим контекст устройства для вывода текста hwndSrc = 0 hSrcDC = GetDC(hwndSrc) ScrollDeskRight = TextOut(hSrcDC, X, Y, sPrint, Len(sPrint)) ' Освобождаем ресурсы lRtn = ReleaseDC(hwndSrc, hSrcDC) ' Перерисовываем за скроллингом rgn = CreateRectRgn(X, Y, X - 1, Y + 16) res = RedrawWindow(0, ByVal 0&, rgn, RDW_ERASE Or RDW_INVALIDATE Or RDW_ALLCHILDREN) ' Освобождаем ресурсы памяти del = DeleteObject(rgn) X = X + 1 ' двигаемся вправо If X > Screen.Width / 15 Then X = 0 ' начинаем новое движение с левой стороны End Function
Public Function ScrollDeskLeft(sPrint As String, Y As Integer) As Long ' Аналогична предыдущей функции Dim hwndSrc As Long Dim hSrcDC As Long Dim lRtn As Long Dim xRtn As Long Dim rgn As Long Dim res As Long Dim del As Long Static X As Integer hwndSrc = 0 hSrcDC = GetDC(hwndSrc) ScrollDeskLeft = TextOut(hSrcDC, X, Y, sPrint, Len(sPrint)) lRtn = ReleaseDC(hwndSrc, hSrcDC) rgn = CreateRectRgn(X + (Len(sPrint) * 6.6), Y, X + (Len(sPrint) * 6.6) + 1, Y + 16) res = RedrawWindow(0, ByVal 0&, rgn, RDW_ERASE Or RDW_INVALIDATE Or RDW_ALLCHILDREN) del = DeleteObject(rgn) X = X - 1 If X < 0 - (Len(sPrint) * 6.3) Then X = Screen.Width / 15 End Function