Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
RAD XE4+

Отследить нажатие на вертикальный ScrollBar компонента ListBox

13.09.2018, 22:59. Показов 1398. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!! Подскажите пожалуйста, как можно отследить прокрутку и нажатие на вертикальный ScrollBar компонента ListBox. Заранее благодарен за ответ.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2018, 22:59
Ответы с готовыми решениями:

DBGRid - не виден вертикальный ScrollBar
В DBGrid отображается фильтрованный набор данных. Фильтр выбирает пользователь. При запуске приложения Scrollbar есть, но при первом же...

Всегда активный scrollbar у компонента stringgrid
Пытался сделать по данному примеру https://www.cyberforum.ru/cpp-builder/thread304361.html, но scrollbar сразу исчезает

Привязать вертикальный ScrollBar к TextBox-у
Подскажите, пожалуйста, как мне привязать вертикальный ScrollBar к TextBar. Заранее спасибо! :umnik:

14
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
14.09.2018, 05:50
Получить событие можно по такой схеме__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    TWndMethod FOldLBox1Proc ;
//---------------------------------------------------------------------------
void __fastcall TForm1::MyLBox1Proc(TMessage &msg)
{            /* ...прообраз в unit.h */
    TPoint aPoint = this->ScreenToClient(Mouse->CursorPos);
    tagRECT re = ListBox1->BoundsRect;
    re.left = re.right - 19;  /* 19 - barwidth */
    if (PtInRect(&re,aPoint) && GetKeyState(VK_LBUTTON)<0)  
      { Caption = "Нажата ЛКМ на скроллбаре"; }
    FOldLBox1Proc(msg) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    FOldLBox1Proc = ListBox1->WindowProc;
    ListBox1->WindowProc = MyLBox1Proc;
}
//---------------------------------------------------------------------------
и в нём уже отследить ListBox1->TopIndex.
2
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
14.09.2018, 11:18
Лучше отслеживать событие WM_VSCROLL

C++
1
2
3
4
5
6
7
8
9
//---------------------------------------------------------------------------
void __fastcall TForm1::MyLBox1Proc(TMessage &msg) {
    if (msg.Msg == WM_VSCROLL) {
        OutputDebugStringW(UnicodeString().sprintf(L"VScroll Pos[%d] Action[%d=%s]",
            msg.WParamHi, msg.WParamLo, VScrollToString(msg.WParamLo).c_str()).c_str());
    }
 
    if (FOldLBox1Proc) FOldLBox1Proc(msg);
}
Code
1
2
3
4
5
6
7
Debug Output: VScroll Pos[86] Action[4=SB_THUMBPOSITION] Process Project1.exe (4816)
Debug Output: VScroll Pos[0] Action[8=SB_ENDSCROLL] Process Project1.exe (4816)
Debug Output: VScroll Pos[0] Action[3=SB_PAGEDOWN] Process Project1.exe (4816)
Debug Output: VScroll Pos[0] Action[8=SB_ENDSCROLL] Process Project1.exe (4816)
Debug Output: VScroll Pos[0] Action[1=SB_LINEDOWN] Process Project1.exe (4816)
Debug Output: VScroll Pos[0] Action[8=SB_ENDSCROLL] Process Project1.exe (4816)
Debug Output: VScroll Pos[0] Action[5=SB_THUMBTRACK] Process Project1.exe (4816)
3
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
14.09.2018, 12:48
WM_VSCROLL - это не событие, а сообщение. То есть, WM_VSCROLL - не следствие прокрутки, а ее причина. Точнее, одна из причин. Скажем, если выделить элемент в ListBox-е и кнопками "стрелка вниз/стрелка вверх" заставить ListBox прокрутиться - то никакого WM_VSCROLL в этот момент не будет получено, и отследить такую прокрутку этим способом не удастся. Сработает это только при прокрутке скроллбоксами.
2
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
14.09.2018, 14:43  [ТС]
volvo, а при помощи какого сообщения можно отследить правильно?
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
14.09.2018, 15:29
Добавляем сообщения, которые могут вызвать изменение положения в свитч

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void __fastcall TForm1::MyLBox1Proc(TMessage &msg) {
    switch(msg.Msg) {
    case WM_KEYUP:
    case WM_MOUSEWHEEL: {
            static int iVertScrollPos = 0;
 
            const int iNewVertScrollPos = GetScrollPos(ListBox1->Handle, SB_VERT);
            if (iNewVertScrollPos != iVertScrollPos) {
                iVertScrollPos = iNewVertScrollPos;
                // позиция поменялась
                OutputDebugStringW(UnicodeString().sprintf(L"VScroll pos[%d] ", iVertScrollPos).c_str());
            }
        }break;
    case WM_VSCROLL: {
                        // гарантированно сообщение от ScrollBar
            OutputDebugStringW(UnicodeString().sprintf(L"VScroll Pos[%d] Action[%d=%s]", msg.WParamHi, msg.WParamLo,
                    VScrollToString(msg.WParamLo).c_str()).c_str());
        }break;
    }
 
    if (FOldLBox1Proc)
        FOldLBox1Proc(msg);
}
2
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
14.09.2018, 22:52  [ТС]
Maluda, не находит функцию VScrollToString(). Где найти её описание?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
16.09.2018, 23:30  [ТС]
Спасибо за ответы!! Хотел ещё спросить, а можно как-то отследить отжатие левой клавиши мыши от скролбара листбокса в MyLBox1Proc(TMessage &msg)?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
17.09.2018, 00:40
Sasha, понимаю, что "костыль" в программировании - плохой совет, но тем не менее... . Я для отслеживания подобного события использую событие эдита OnChange. В предложенной мной схеме это будет выглядеть вот так:
C++
1
2
3
. . .
    if (msg.WParam && PtInRect(&re,aPoint))  Edit1->Text = GetKeyState(VK_LBUTTON);
. . .
и в Edit1Change__
C++
1
2
    if(Edit1->Text.ToInt() <0) Caption = "Нажата ЛКМ на скроллбаре";
    else if(Edit1->Text.ToInt() <2) Caption = "Отжата ЛКМ на скроллбаре";
То-есть при отжатии keystate становится равным 0 или 1. В каких-то пределах это работает.
1
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
17.09.2018, 08:45
Цитата Сообщение от Sasha Посмотреть сообщение
не находит функцию VScrollToString(). Где найти её описание?
Да это я просто для отладки написал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
UnicodeString VScrollToString(const System::Word VScroll) {
    switch(VScroll) {
    case SB_BOTTOM: return L"SB_BOTTOM";
    case SB_ENDSCROLL: return L"SB_ENDSCROLL";
    case SB_LINEDOWN: return L"SB_LINEDOWN";
    case SB_LINEUP: return L"SB_LINEUP";
    case SB_PAGEDOWN: return L"SB_PAGEDOWN";
    case SB_PAGEUP: return L"SB_PAGEUP";
    case SB_THUMBPOSITION: return L"SB_THUMBPOSITION";
    case SB_THUMBTRACK: return L"SB_THUMBTRACK";
    case SB_TOP: return L"SB_TOP";
    default: return "UNKNOWN";
    }
}
Цитата Сообщение от Sasha Посмотреть сообщение
а можно как-то отследить отжатие левой клавиши мыши
Об этом будет сигнализировать флаг SB_ENDSCROLL
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
17.09.2018, 21:19  [ТС]
Сделал вот так вот

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void __fastcall TForm1::MyLBox1Proc(TMessage &msg)
 {
    switch(msg.Msg)
    {
 
      case WM_VSCROLL:
      {
           Panel1->Visible = true;
           Panel1->Caption = ListBox1->Items->Strings[ListBox1->TopIndex][1];
           break;
      }
      case SB_ENDSCROLL:
      {
 
           ShowMessage("Отпуск");
           Panel1->Visible = false;
           break;
      }
    }
 
 
    if (FOldLBox1Proc)
    {
        FOldLBox1Proc(msg);
    }
}
но когда я прокрутил ScrollBar отпустил его после прокрутки, то сообщение не появляется. Следовательно флаг не отрабатывается. Как быть в такой ситуации?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.09.2018, 01:27
C++
1
2
3
4
5
6
7
8
      if(msg.Msg==WM_VSCROLL)
      { Panel1->Visible = true;
        Panel1->Caption = ListBox1->Items->Strings[ListBox1->TopIndex][1];
      }
      if( msg.WParamLo==8 && GetKeyState(VK_LBUTTON)>=0)
      { Panel1->Visible = false;
        ShowMessage("Отпуск");
      }
Добавлено через 26 минут
Вместо if( msg.WParamLo==8 && можно при желании- if( msg.WParamLo==SB_ENDSCROLL &&.
1
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
18.09.2018, 09:07
Sasha, ну совершенно не хочешь документацию читать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
void __fastcall TForm1::MyLBox1Proc(TMessage &msg) {
    switch(msg.Msg) {
    case WM_KEYUP:
    case WM_MOUSEWHEEL: {
            static int iVertScrollPos = 0;
 
            const int iNewVertScrollPos = GetScrollPos(ListBox1->Handle, SB_VERT);
            if (iNewVertScrollPos != iVertScrollPos) {
                iVertScrollPos = iNewVertScrollPos;
                // позиция поменялась
                OutputDebugStringW(UnicodeString().sprintf(L"VScroll pos[%d] ", iVertScrollPos).c_str());
            }
        }break;
    case WM_LBUTTONUP: {
            // отжата левая кнопка мыши на листбоксе
            OutputDebugStringW(L"LButtonUp");
        }break;
    case WM_VSCROLL: {
            OutputDebugStringW(UnicodeString().sprintf(L"VScroll Pos[%d] Action[%d=%s]", msg.WParamHi, msg.WParamLo,
                    VScrollToString(msg.WParamLo).c_str()).c_str());
 
            switch(msg.WParamLo) {
            case SB_BOTTOM:
                break;
            case SB_ENDSCROLL:
 
                // отжата левая кнопка мыши на скроллбаре
 
                break;
            case SB_LINEDOWN:
                break;
            case SB_LINEUP:
                break;
            case SB_PAGEDOWN:
                break;
            case SB_PAGEUP:
                break;
            case SB_THUMBPOSITION:
                break;
            case SB_THUMBTRACK:
                break;
            case SB_TOP:
                break;
            default:;
 
            }
 
        }break;
    }
 
    if (FOldLBox1Proc)
        FOldLBox1Proc(msg);
}
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
18.09.2018, 13:03  [ТС]
Прочитал бы, если бы знал где!!!!
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
18.09.2018, 14:21
Цитата Сообщение от Sasha Посмотреть сообщение
Прочитал бы, если бы знал где!!!!
Здесь
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.09.2018, 14:21
Помогаю со студенческими работами здесь

Вертикальный ScrollBar рабочего листа
На листе есть таблица, которая в разное время может занимать разное количество строк. ..... Как сделать что-то вроде этого: ...

Отображается ли вертикальный ScrollBar у DataGridView
Как мне узнать, отображается ли вертикальный ScrollBar у DataGridView в данный момент? И если отображается, то как узнать его ширину (вроде...

Постоянно отображать вертикальный ScrollBar в Datagridview
как сделать чтобы у datagridview был постоянно виден вертикальный scrollbar?

Как убрать вертикальный ScrollBar в Microsoft Interner Control?
как убрать в открывающейся HTML-страничке вертикальный ScrollBar ???

PyQT. Не перемещать вертикальный ScrollBar в QScrollArea когда вращаю колёсико мыши
PyQT5. Как не перемещать вертикальный ScrollBar в QScrollArea когда вращаю колёсико мыши? Возможно я не знаю какого-то свойства, или ещё...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru