Синхронная прокрутка текстбоксов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Синхронная прокрутка текстбоксов

Сообщение BP » 13.07.2004 (Вт) 18:37

Нужно чтобы при прокрутке одного текстбокса (когда жмёшь на его вертикальный скрулбар) прокручивались и остальные.
Пробовал через CallBack, но прокручиваются только если двигаешь мышью.

Может где чего пропустил. Гляньте. Есть три текст бокса. Когда кликаешь на вертикальной полосе прокрутки проверяются TopLine всех остальных и прокручиваются до первой. Всё вроде работает, но виснет, пока не начнёшь водить мышью по форме. Остановишь - опять виснет.

Код: Выделить всё
'Модуль
Private Const EM_SCROLL = &HB5
Private Const WM_VSCROLL = &H115

Public Text1_OldProc As Long, Text3_OldProc As Long, TxtPreCode_OldProc As Long
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
     ByVal hwnd As Long, _
     ByVal nIndex As Long, _
     ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _
     ByVal lpPrevWndFunc As Long, _
     ByVal hwnd As Long, _
     ByVal msg As Long, _
     ByVal wParam As Long, _
     ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = -4

Public Function TextBox_CallBack(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_VSCROLL And wParam < 2 Then
LASMIDE.Text_AlignTopLines hwnd
End If
If hwnd = LASMIDE.Text1.hwnd Then TextBox_CallBack = CallWindowProc(Text1_OldProc, hwnd, uMsg, wParam, lParam)
If hwnd = LASMIDE.Text3.hwnd Then TextBox_CallBack = CallWindowProc(Text3_OldProc, hwnd, uMsg, wParam, lParam)
If hwnd = LASMIDE.TxtPreCode.hwnd Then TextBox_CallBack = CallWindowProc(TxtPreCode_OldProc, hwnd, uMsg, wParam, lParam)
End Function

'Форма
Private Sub Form_Load()
Text1_OldProc = SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf TextBox_CallBack)
Text3_OldProc = SetWindowLong(Text3.hwnd, GWL_WNDPROC, AddressOf TextBox_CallBack)
TxtPreCode_OldProc = SetWindowLong(TxtPreCode.hwnd, GWL_WNDPROC, AddressOf TextBox_CallBack)
End Sub

Function Text_TopLine(ByVal hwnd As Long) As Long
Const EM_GETFIRSTVISIBLELINE = &HCE
Text_TopLine = SendMessage(hwnd, EM_GETFIRSTVISIBLELINE, 0, ByVal 0)
End Function

Sub Text_AlignTopLines(ByVal hWnd_Action As Long)
Dim AlignedTopLine As Long
AlignedTopLine = Text_TopLine(hWnd_Action)
If hWnd_Action <> Text1.hwnd Then Text_Scroll Text1.hwnd, AlignedTopLine
If hWnd_Action <> Text3.hwnd Then Text_Scroll Text3.hwnd, AlignedTopLine
If hWnd_Action <> TxtPreCode.hwnd Then Text_Scroll TxtPreCode.hwnd, AlignedTopLine
End Sub

Sub Text_Scroll(ByVal hwnd As Long, ByVal NewTopLine As Long)
Dim Text_CurrLine As Long
Text_CurrLine = Text_TopLine(hwnd)
If Text_CurrLine = NewTopLine Then Exit Sub
 
Const EM_SCROLL = &HB5
Const SB_LINEDOWN = 1
Const SB_LINEUP = 0
 
Dim ScrollMsg As Long, ScrollCount As Long
If Text_CurrLine < NewTopLine Then
    ScrollMsg = SB_LINEDOWN
    ScrollCount = NewTopLine - Text_CurrLine
ElseIf Text_CurrLine > NewTopLine Then
    ScrollMsg = SB_LINEUP
    ScrollCount = Text_CurrLine - NewTopLine
End If
Dim Scrolling As Long
For Scrolling = 1 To ScrollCount
    SendMessage hwnd, EM_SCROLL, ScrollMsg, 0
Next Scrolling
End Sub

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 13.07.2004 (Вт) 19:02

Разобрался сам.
Можете удалить эту тему. Она всё равно не несёт полезной информации.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

    TopList