Какой же это флейм? Это как раз рациональное зерно Это надо уяснить раз и навсегда, чтоб грамотно работать с колесом. 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. ..........................................................
|
(На зло некоторым участникам другой темы форума и г-ну Страуструпу использовал ? : )
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. |