Страница 5 из 6 Использование колеса мышки в документах с встраиваемыми объектами В этом разделе представлен пример, демонстрирующий работу с документом Microsoft® Word, с различными встраиваемыми объектами: - Таблица Microsoft Excel
- Элемент управления list box, который скроллируется в ответ на вращение колёсика
- Элемент управления text box, который не реагирует на колёсико
Сообщение MSH_MOUSEWHEEL всегда посылается главному окну в Microsoft Word, даже если активна встраиваемая таблица экселя. Следующая таблица объясняет, как сообщение MSH_MOUSEWHEEL обрабатывается в ответ на изменение фокуса. Фокус на | Обрабатывается следующим образом | документе Word | Word скроллирует окно документа. | внедрённой таблице Excel | Word постит сообщение в Excel. Вы должны решить, должно ли внедрённое приложение реагировать на сообщение или нет. | внедрённом элементе управления | Сперва приложение посылает сообщение внедрённому контролу, который имеет фокус, и проверяет код возврата, чтобы узнать, обработал ли это сообщение внедрённый элемент управления. Если элемент управления не обработал сообщение, то приложение начнёт скроллировать окно всего документа. Например, если пользователь кликает по списку (list box), а затем начинает вращать колёсико, то список будет скроллироваться в соответствии с вращением колеса. Если пользователь кликнет в текстовое окно, а затем будет прокручивать колёсико, то будет скроллироваться весь документ. | Следующий пример демонстрирует, как приложение может обработать два сообщения от колёсика. Пример: /************************************************ * эта часть кода работает с MSH_MOUSEWHEEL *************************************************/ #include "zmouse.h"
// // Самое главное, это определеить, поддерживается ли в системе // сообщение WM_MOUSEWHEEL. // #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL WM_MOUSELAST+1 // ID сообщения для колёсика IntelliMouse #endif
UINT uMSH_MOUSEWHEEL = 0; // Значение, возвращённое функцией // RegisterWindowMessage()
/**************************************************/
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, INT nCmdShow) { MSG msg; BOOL bRet;
if (!InitInstance(hInst, nCmdShow)) return FALSE;
// // Новые IntelliMouse используют зарегистрированное сообщение // для передачи информации о вращении колеса. Зарегистрируем! uMSH_MOUSEWHEEL = RegisterWindowMessage(MSH_MOUSEWHEEL); if ( !uMSH_MOUSEWHEEL ) { MessageBox(NULL," RegisterWindowMessag Failed!", "Error",MB_OK); return msg.wParam; } while (( bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { // обработка ошибки и возможный выход } else { if (!TranslateAccelerator(ghwndApp, ghaccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } }
return msg.wParam; }
/************************************************ * Следующий код показывает как работать с WM_MOUSEWHEEL *************************************************/ LONG APIENTRY MainWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static int nZoom = 0;
switch (msg) { case WM_MOUSEWHEEL: ((short) HIWORD(wParam)< 0) ? nZoom-- : nZoom++;
// // Как-нибудь работаем с колёсиком... //
break;
default: // // uMSH_MOUSEWHEEL это сообщение, зарегистрированное // ддл-кой mswheel в версиях Windows, которые не // поддерживают новые сообщения в системе.
if( msg == uMSH_MOUSEWHEEL ) { ((int)wParam < 0) ? nZoom-- : nZoom++;
// // Как-нибудь работаем с колёсиком... // break; }
return DefWindowProc(hwnd, msg, wParam, lParam); }
return 0L; } |