Поскольку с Аксом многие стандартные вещи тяжело совместимы, в моем проекте все окна форм (а также главное окно и окно MDI-клиента) субклассированы через DLL, реализованную на C++, что позволяет избежать падений, случающихся при написании оконной процедуры на VBA.
При таком подходе можно существенно расширить возможности UI, предоставляемые Акс-ом, например есть реализации для Custom-Draw полей ленточной формы (иконки + текст), организация параллельных оконных стеков - внутри каждого стека доступна только верхняя форма, а переключение между ними производится при помощи тулбара типа панели задач Windows, "резиновые" заголовки столбцов ленточной формы и т.п.
На обсуждаемый баг с прокруткой колесом ранее как-то не обращал внимания (с Акс-ом работаю всего около 3 месяцев), однако решил и его подправить. Вот кусок субклассированной оконной процедуры класса C++, реализующего субклассинг окна формы Access.
LRESULT CFormSubclasser::SubclassedWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL* bNoDefault)
{
CWndStack* ws;
if (m_IsSubForm) return 0; // Для вложенных форм ничего не делаем.
switch (uMsg) {
case WM_MOUSEWHEEL: // прокрутка мышкой
// Если не нажимали всяких шифтов и крутили вверх
if ((LOWORD(wParam) == 0) && (((short)HIWORD(wParam)) > 0))
{
int scp;
HWND hScrollBar = GetVerticalScrollBar(); // ищем скроллбар формы
if (hScrollBar) {
// текущая позиция скроллбара
scp = GetScrollPos(hScrollBar, SB_CTL);
// вызовем стандартную оконную процедуру, пусть Акс выполнит прокрутку
LRESULT lRetVal = CallDefaultProc(hWnd, uMsg, wParam, lParam);
*bNoDefault = TRUE; // Стандартную процедуру второй раз не вызываем
// Если Акс никуда ничего не прокрутил
if (GetScrollPos(hScrollBar, SB_CTL) == scp) {
// Имитируем нажатие на стрелочку вверх в скролл-баре
PostMessage(m_hWnd, WM_VSCROLL, SB_LINEUP, 0);
}
return lRetVal;
}
}
break;
case ... (здесь обработка других сообщений, к обсуждаемой проблеме не относящихся)
Наверное, что-то подобное можно сотворить и на VBA, например в Form_MouseWheel посылать окну WM_VSCROLL при определенных условиях, однако этот способ я не исследовал, тем более что обработчик придется копи-пастить во всех формах.