Статья описывает как создавать и получать данные из стандартного элемента управления 1С: поле ввода (возможно, с кнопкой выбора).
Существует два класса для работы с полями ввода: CMaskEdit и CBtnEdit. При этом CBtnEdit является наследником CMaskEdit и только немного расширяет функционал CMaskEdit: добавляет отображение кнопки выбора («педальки») и генерацию событий при ее нажатии.
В нашем классе, наследнике CWnd, определяем переменную типа CBtnEdit (или CMaskEdit, далее будем рассматривать только CBtnEdit):
Для хранения значения, которое будет меняться этим элементом определяем еще одну переменную класса типа CDate, CNumeric или CString:
В функции OnCreate для CWnd или OnInitialUpdate для CView выполняем создание окна – элемента управления:
Как можно видеть, используется стандартная для CWnd функция Create, которая принимает в качестве параметров стиль создаваемого окна, прямоугольник, определяющий, положение и размеры окна, ссылку на родительское окно, идентификатор элемента управления и текст окна. Отличия для одинэсных элементов только в использовании параметра «текст окна». Этот параметр определяет тип и другие параметры создаваемого элемента управления. Строка задается в формате: «ИМЯ_ПАРАМЕТРА1=ЗНАЧЕНИЕ_ПАРАМЕТРА1,ИМЯ_ПАРАМЕТРА2=ЗНАЧЕНИЕ_ПАРАМЕТРА2,...» Доступные параметры (которые удалось пока реконструировать):
Для записи и чтения данных из элементов 1С применяется стандартный MFC-механизм обмена данными с элементами CWnd. Поэтому в своем классе мы должны определить функцию DoDataExchange, в котором мы должны разместить код обмена данными:
Как можно видеть, применяется функция DDX_MaskText?, экспортируемая из br32.dll. Данная функция будет читать/записывать данные в элемент управления в зависимости от текущего этапа обмена данными.
Для начальной инициализации элемента управления (после создания элемента управления и инициализации соответствующей переменной CNumeric) мы должны вызвать функцию UpdateData (FALSE). Для получения данных из элемента управления мы должны вызвать UpdateData (TRUE).
Элемент управления генерирует события при помощи отправки сообщений WM_COMMAND родительскому окну. При этом вся информация о событии передается в параметре wParam: в LOWORD (wParam) – идентификатор элемента (с которым он был создан), в HIWORD (wParam) – код события. Расшифрованные события:
Есть и другие события (в частности, получение/потеря фокуса), клик мышкой по элементу и другие.
Для обработки событий можно использовать функцию класса OnCommand:
или можно отредактировать карту сообщений класса.
Итак, у нас есть возможность отловить событие нажатия на кнопку выбора. Почему бы при поступлении этого события не отобразить календарь или калькулятор, как это обычно делает 1С? Рассмотрим, как это можно сделать.
Для выбора даты используем класс CCalendar:
Для выбора числа используем класс CCalculator:
Для нормальной работы класса CCalculator необходимо добавить в определение класса CCalculator переменную
При отсутствии этой переменной 1С падает при конструировании класса CCalculator.
Рассматриваемый элемент управления 1С не предоставляет возможности выбирать элементы справочников, документы и т.п. Поэтому остается реализовать эту возможность самостоятельно: