Поделиться через


Альтернативы динамической аннотации

Существуют и другие способы предоставления настраиваемой поддержки IAccessible для элементов пользовательского интерфейса, и в некоторых случаях они являются правильным решением. До динамической аннотации эти альтернативные методы были единственными вариантами, доступными разработчикам. Они включают реализацию всех интерфейсов IAccessible и программных методов.

Реализация всего интерфейса IAccessible

Одним из альтернативных способов является реализация всего интерфейса IAccessible . Этот подход часто необходим для пользовательских элементов управления или радикально разных элементов пользовательского интерфейса; однако затраты на разработку и испытания являются достаточно значительными, что их следует избегать, если это действительно необходимо. Если цель заключается в изменении одного свойства, затраты трудно оправдать.

Программные методы

Другой вариант — использовать методы подклассов и упаковки для изменения информации, предоставляемой для определенного свойства. Это метод, который должен заменить динамическая заметка. Чтобы переопределить одно свойство с помощью подклассов и упаковки, разработчик должен выполнить следующие действия:

  1. Подкласс HWND объекта IAccessible .
  2. Перехватите сообщение WM_GETOBJECT для правильного значения IParam/OBJID.
  3. Переадресуйте сообщение WM_GETOBJECT в базовый класс с помощью функции обратного вызова CallWndProc . Если возвращается ноль, вызовите CreateStdAccessibleObject; в противном случае вызовите LresultFromObject для возвращаемого значения, чтобы получить собственный указатель интерфейса IAccessible элемента управления.
  4. Создайте класс-оболочку, который реализует IAccessible и создает оболочку для указателя интерфейса IAccessible , возвращенного на предыдущем шаге. Этот класс-оболочка отправляет все методы и свойства в исходный указатель интерфейса IAccessible , за исключением тех, которые необходимо переопределить. Это включает в себя написание кода пересылки для всех 21 свойств и методов интерфейса IAccessible , независимо от того, сколько из них фактически переопределено.

Кроме того, разработчики должны проверить следующие условия:

  • Переопределенный метод или свойство должно обрабатывать только необходимые дочерние идентификаторы и пересылать все остальные в исходный указатель интерфейса IAccessible .
  • Оболочка также должна пересылать интерфейсы IEnumVARIANT и IOleWindow только в том случае, если исходный объект поддерживает их.
  • Подсчет ссылок должен обрабатываться правильно, особенно если поддерживаются другие интерфейсы.
  • Возвращаемые значения IDispatch должны обрабатываться правильно, особенно с помощью метода ITypeInfo::Invoke, который должен вызываться с помощью указателя интерфейса на интерфейс оболочки, а не указателя на исходный интерфейс IAccessible.

Эти методы требуют значительного объема работы, даже если нужно переопределить только одно или два свойства. Большая часть полученного кода связана с подклассами и оболочками, и лишь небольшая часть фактически предоставляет переопределенные сведения.

Однако существуют сценарии, в которых эти методы необходимы. Например, если вы вносите структурные изменения для создания замещающего элемента пользовательского интерфейса, следует использовать эти методы, а не динамические заметки.

Исправление имен, производных от меток

Некоторые распространенные элементы управления Microsoft Win32, такие как элемент управления "Поле ввода", почти всегда используются с меткой (запись LTEXT в файле ресурсов) или полем группы (GROUPBOX в файле ресурсов). Microsoft Active Accessibility автоматически наследует свойство name элемента управления от его метки. Для таких элементов управления текст окна (показанный в Microsoft Visual Studio в качестве свойства Name или ID) игнорируется, так как обычно он создается автоматически и редко является очень описательным. Например, "IDC_EDIT1".

Если пользовательский интерфейс приложения разработан неправильно, возможно, Microsoft Active Accessibility не сможет правильно задать имя. Чтобы быть связанным с элементом управления, метку или группу необходимо поместить непосредственно перед динамическим элементом управления в порядке табуляции.

Порядок табуляции можно изменить с помощью средства в Visual Studio (в меню Формат при открытии редактора ресурсов) или путем непосредственного редактирования файла ресурсов.

В следующем примере показано описание диалогового окна с двумя помеченными полями редактирования в файле ресурсов.

IDD_INPUTNAME DIALOGEX 22, 17, 312, 118
STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Enter your name"
FONT 8, "System", 0, 0, 0x0
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,179,35,30,11,WS_GROUP
    LTEXT           "First Name:",IDC_STATIC,8,16,43,8
    LTEXT           "Last Name:",IDC_STATIC,8,33,43,8
    EDITTEXT        IDC_EDITFIRSTNAME,53,15,120,12,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDITLASTNAME,53,34,120,12,ES_AUTOHSCROLL
END

В этом примере метки и элементы управления не указаны в правильном порядке табуляции. В результате Microsoft Active Accessibility назначает имя "Фамилия" поле ввода имени, а поле редактирования фамилии вообще не имеет имени.

В следующем примере показан правильный список ресурсов. Обратите внимание, что в метках указаны сочетания клавиш.

IDD_INPUTNAME DIALOGEX 22, 17, 312, 118
STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Enter your name"
FONT 8, "System", 0, 0, 0x0
BEGIN
    LTEXT           "&First Name:",IDC_STATIC,8,16,43,8
    EDITTEXT        IDC_EDITFIRSTNAME,53,15,120,12,ES_AUTOHSCROLL
    LTEXT           "&Last Name:",IDC_STATIC,8,33,43,8
    EDITTEXT        IDC_EDITLASTNAME,53,34,120,12,ES_AUTOHSCROLL
    DEFPUSHBUTTON   "OK",IDOK,179,35,30,11,WS_GROUP
END

Если элементы управления имеют дополнительные метки, например для минимальных и максимальных значений на панели отслеживания, эти метки следует размещать после элемента управления в порядке табуляции. Метка main элемента управления должна отображаться непосредственно перед самим элементом управления.

Именование элементов управления без меток

Не всегда возможно или желательно иметь видимую метку для каждого элемента управления. Однако вы по-прежнему можете указать имя элемента управления, добавив невидимую метку. Как всегда, невидимая метка должна непосредственно предшествовать элементу управления в порядке табуляции.

Если вы используете редактор ресурсов в Microsoft Visual Studio .NET, можно задать для свойства Visible значение False. Чтобы сделать метку невидимой при редактировании файла ресурсов (RC), добавьте not WS_VISIBLE или в часть стиля элемента управления label, как показано в следующем примере.

    LTEXT           "&FullName:",IDC_STATIC,111,23,44,8,NOT WS_VISIBLE

Обратите внимание, что все назначенные сочетания клавиш работают, даже если метка невидима.