Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Прокрутка при помощи "колесика"


Автор: Nastya 13.10.2003, 20:26
Есть ScrollBar`ы, как сделать так, что бы они реагированили на колесико прокрутки, если мышь такое имеет.

Автор: RAN 13.10.2003, 21:16
обработкой сообщения WM_MOUSEWHEEL. Там ты получишь на сколько прокрутили колесо * 120. На 120 умножается потому, что MicroSoft надеятся в будущем разработать более точные мыши. Эти мыши будут работать по какому-то другому принципы. А пока работает примитивный счётчик один такт = 120 единицам.

Ну, вот. В этом сообщении посылай команды ScrollBar'у, чтоб тот прокручивался.

Автор: mr.DUDA 13.10.2003, 23:14
ЗЫ, ещё умным будет если сделать проверку (при поступлении WM_MOUSEWHEEL в оконную процедуру), находится ли курсор мыши в пределах окна. Более интеллектуальная обработка получается.

Автор: Step 14.10.2003, 12:09
вообщето если правильно установленны драйвера, и вы вставляете например рич едит со скролом, то он уже потдерживает колесико, у меня такое было, пишу прогу и вижу что текст прокручуется по колесику, ничего дополнительно я не писал. Windows Сама посылает сообщения скролирования

Автор: RAN 14.10.2003, 18:19
Step, ты писал не в API значит. Писать надо самому. Даже если какие-то драйвера мышей сами посылают окну сообщение WM_HSCROLL, то это скорее исключение, чем правило. И интересно как на таких компах обрабатывать WM_MOUSEWHEEL. Или надо драйверу возвращать, что сообщение WM_MOUSEWHEEL обработано, и он (драйвер) не пошлёт окну сообщение WM_HSCROLL.

Автор: Дрон 14.10.2003, 18:22
Для отдельных ScrollBar'ов само работать не будет, т.е. там нужен WM_MOUSEWHEEL, а вот для ListBox, например, всё автоматически скроллиться и без WM_MOUSEWHEEL.

Автор: RAN 14.10.2003, 19:21
Блин. Виноват. Не внимательно прочитал. В стандартных классах колёсико работает. Там всё реализовано. Но это делает не драйвер, а само окно через всё то же WM_MOUSEWHEEL. Здесь мы обсуждаем собственные классы окон. Я так понимаю.

Автор: Nastya 14.10.2003, 20:48
Цитата
Здесь мы обсуждаем собственные классы окон. Я так понимаю.


Да речь шла об полосах прокрутки на окнах, установленных "вручную".
Спасибо большое, кажись понятно smile.gif

Автор: Step 15.10.2003, 09:25
Цитата
Блин. Виноват. Не внимательн.....  Но это делает не драйвер, а само окно через всё то же WM_MOUSEWHEEL. Здесь мы обсуждаем собственные классы окон. Я так понимаю.
, а вот тут я готов поспорить, но флейм разводить не будем

Автор: RAN 15.10.2003, 22:43
Какой же это флейм? Это как раз рациональное зерно smile.gif Это надо уяснить раз и навсегда, чтоб грамотно работать с колесом. Step мне друг, но истина дороже.
Я делаю так:
1. Беру VC6.0
2. Создаю Win32 проект Hello World
3. Добавляю в процедуру окна WndProc следующие строки:
Код

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

switch (message)
{
 case WM_CREATE:
  LoadLibrary("RICHED32.DLL");
  CreateWindow("RICHEDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 10, 10, 100, 100, hWnd, NULL, hInst, NULL);
  break;
.................................................................

Больше ничего не меняем. Запускаем. Колёсико работает.

Теперь делаем следующее:

1. Перед функцией WinMain дописываем следующее:
Код

WNDPROC StdProc;
LRESULT CALLBACK MyProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return (uMsg != 0x020A/*WM_MOUSEWHEEL*/) ? CallWindowProc(StdProc, hWnd, uMsg, wParam, lParam) : 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR     lpCmdLine,
                    int       nCmdShow)
{
 // TODO: Place code here.
..........................................................

(На зло некоторым участникам другой темы форума и г-ну Страуструпу использовал ? : smile.gif )

2. А только что добавленный WM_CREATE исправляем на такой:
Код

 case WM_CREATE:
  {
   LoadLibrary("RICHED32.DLL");
   HWND h = CreateWindow("RICHEDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 10, 10, 100, 100, hWnd, NULL, hInst, NULL);
   StdProc = (WNDPROC)GetWindowLong(h, GWL_WNDPROC);
   SetWindowLong(h, GWL_WNDPROC, (LONG)MyProc);
  }
  break;


Запускаем. И RichEdit не реагирует на колесо.

Отсюда я делаю вывод, что прокрутку колеса обрабатывает класс окна RICHEDIT.

P.S. Для тех, кто не понял объясню, что я "запретил" RichEdit обрабатывать сообщение WM_MOUSEWHEEL.

Автор: Step 16.10.2003, 09:05
Step, также приношу свои извинения, но есть еще непонятки :

Берем мышь с 3 кнопками, без колеса, ставим драва, и что видим, нажимаю среднюю клавишу на ричедит, появляется иконка со стрелками вверх вниз, двигаем мышку - начинает работать скролл, скорость меняется от положения мышки и т.д.

мне понятно что драйвер подменяет действия средней мышки..... но вопрос тогда, кто рисует иконку

Автор: Ars 16.10.2003, 10:22
Цитата
но вопрос тогда, кто рисует иконку

Он же - подлый драйвер

Автор: GriKo 17.10.2003, 13:47
В Бормане есть такая фича - TControl::OnMouseWheel...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)