Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прокрутка при помощи "колесика" 
:(
    Опции темы
Nastya
Дата 13.10.2003, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



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



--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
RAN
Дата 13.10.2003, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



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

Ну, вот. В этом сообщении посылай команды ScrollBar'у, чтоб тот прокручивался.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 13.10.2003, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



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


--------------------
user posted image
PM MAIL WWW   Вверх
Step
Дата 14.10.2003, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



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


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
RAN
Дата 14.10.2003, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Step, ты писал не в API значит. Писать надо самому. Даже если какие-то драйвера мышей сами посылают окну сообщение WM_HSCROLL, то это скорее исключение, чем правило. И интересно как на таких компах обрабатывать WM_MOUSEWHEEL. Или надо драйверу возвращать, что сообщение WM_MOUSEWHEEL обработано, и он (драйвер) не пошлёт окну сообщение WM_HSCROLL.
PM MAIL ICQ   Вверх
Дрон
Дата 14.10.2003, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 92



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


--------------------
Да. Именно так.
PM   Вверх
RAN
Дата 14.10.2003, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Блин. Виноват. Не внимательно прочитал. В стандартных классах колёсико работает. Там всё реализовано. Но это делает не драйвер, а само окно через всё то же WM_MOUSEWHEEL. Здесь мы обсуждаем собственные классы окон. Я так понимаю.
PM MAIL ICQ   Вверх
Nastya
Дата 14.10.2003, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Цитата
Здесь мы обсуждаем собственные классы окон. Я так понимаю.


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


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Step
Дата 15.10.2003, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



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


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
RAN
Дата 15.10.2003, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Какой же это флейм? Это как раз рациональное зерно 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.
PM MAIL ICQ   Вверх
Step
Дата 16.10.2003, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



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

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

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


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Ars
Дата 16.10.2003, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: 2
Всего: 2



Цитата
но вопрос тогда, кто рисует иконку

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


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
GriKo
Дата 17.10.2003, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 7.6.2003
Где: Израиль

Репутация: нет
Всего: нет



В Бормане есть такая фича - TControl::OnMouseWheel...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0992 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.