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


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

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

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

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

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

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

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

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

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

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

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

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

Некоторые распространенные элементы управления Microsoft Win32, такие как элемент управления "Поле редактирования", почти всегда используются с меткой (запись LTEXT в файле ресурса) или полем группы (GROUPBOX в файле ресурсов). Microsoft Active Accessibility автоматически наследует свойство имени элемента управления от его метки. Для таких элементов управления текст окна (показанный в 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

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

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

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

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

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

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