Использование колесика мыши в документе со внедренными объектами
Этот пример предполагает документ Microsoft ® Word с различными внедренными объектами:
Сообщение MSH_MOUSEWHEEL всегда отправляется в главное окно Microsoft Word. Это верно, даже если активна внедренная электронная таблица. Нижеследующая таблица объясняет, как сообщение MSH_MOUSEWHEEL обрабатывается в соответствии с тем, где фокус.
Фокус находится в | Обработка как следует ниже |
---|---|
Документе Word | Word прокручивает для просмотра окно документа. |
Внедренной электронной таблице Excel | Word посылает сообщение в Excel. Вы должны выяснить, ответило ли внедренное приложение на сообщение или нет. |
Внедренном органе управления | В зависимости от приложения, отправляющего сообщение внедренному органу управления, который имеет фокус, и от проверки возвращенного кода, выясните, обрабатывал ли орган управления сообщение. Если орган управления не обрабатывал его, то приложение должно прокрутить для просмотра окно документа. Например, если пользователь щелкнул по окну со списком, а затем прокрутил колесико, тот орган управления в ответ на вращение колесика прокручивается. Если пользователь щелкнул по текстовому полю, а затем вращал колесико, документ будет прокручиваться полностью. |
Этот нижеследующий пример показывает, как приложение может обработать два сообщения колесика.
Пример
/************************************************ * этот код распределяет MSH_MOUSEWHEEL *************************************************/ #include "zmouse.h" // // Mouse wheel для вращения используется только тогда, если // мы в версии ОС, которая не поддерживает // сообщения WM_MOUSEWHEEL. // #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL WM_MOUSELAST+1 // Идентификатор (ID) сообщения для IntelliMouse wheel #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) { // // Обработка сообщений модуля Mouse Wheel созданных // операционными системами , которые имеют встроенную // поддержку сообщений WM_MOUSEWHEEL. // case WM_MOUSEWHEEL: ((short) HIWORD(wParam)< 0) ? nZoom-- : nZoom++; // // Делаем другое колесико используемым... // break; default: // // uMSH_MOUSEWHEEL является зарегистрированным сообщением // библиотеки mswheel.dll для версии Windows, которая // не поддерживает эти новые сообщения в ОС. if( msg == uMSH_MOUSEWHEEL ) { ((int)wParam < 0) ? nZoom-- : nZoom++; // // Делаем другое колесико используемым... // break; } return DefWindowProc(hwnd, msg, wParam, lParam); } return 0L; } |