Молотком
Во вложении - ответ.
Как применять:
1. На форме в ClassDeclaration определить пару переменных
X++:
DLL dll;
DLLFunction AxScrollGroup;
2. В Init() формы добавить код
X++:
dll = new Dll("AxScroll.dll");
AxScrollGroup = new DLLFunction(dll, "AxScrollGroup");
AxScrollGroup.returns(ExtTypes::DWord);
AxScrollGroup.arg(ExtTypes::DWord);
3. Подключать к нужному контролу так (можно в Init() формы после super())
X++:
if ([].hWnd()) AxScrollGroup.call([].hWnd());
4. Цеплять к контролам Group или TabPage. Для Group свойство FrameType ставить в None
5. На этих контролах размещать только группы или табы. Все остальные контролы должны находиться в этих элементах
6. Подключать можно неограниченное количество элементов (например, все закладки на форме InventTable)
Для скроллинга можно использовать колесо мыши. С зажатой кнопкой SHIFT - по вертикали, CONTROL - по горизонтали
Из замеченных глюков:
1. Если разместить на управляемой группе элемент ввода (например, StringEdit) (не во вложенной группе), то при скроллировании и перерисовке формы будет неправильно отображаться Label контрола
2. Если разместить на управляемом контроле Grid (не во вложенной группе), то при изменении размера формы и смещенным движкам скроллера Grid перескочит в верхний левый видимый угол.
3. При изменении размеров контрола (например, для Grid'а изменение ширины столбцов ), если смещены движки скроллера, то контрол перескочит в верхний левый видимый угол.
4. При изменении размеров контрола (например, для Grid'а изменение ширины столбцов) скроллеры не реагируют (не происходит пересчет размеров клиентской области). Если после этого изменить размер управляемой группы (например, изменить размер окна), то все корректно пересчатается
5. Если управляемый контрол Группа и для него включено FrameType, то некорректно будет происходить перерисовка элементов фрейма