Bagikan melalui


Alternatif untuk Dynamic Annotation

Ada cara lain untuk menyediakan dukungan IAccessible yang disesuaikan untuk elemen UI, dan dalam beberapa kasus, mereka adalah solusi yang benar. Sebelum Anotasi Dinamis, teknik alternatif ini adalah satu-satunya opsi yang tersedia untuk pengembang. Mereka termasuk mengimplementasikan semua antarmuka IAccessible dan teknik terprogram.

Menerapkan Semua Antarmuka IAccessible

Salah satu teknik alternatif adalah mengimplementasikan semua antarmuka IAccessible . Pendekatan ini sering diperlukan untuk kontrol kustom atau elemen UI yang sangat berbeda; namun, biaya pengembangan dan pengujian cukup signifikan sehingga harus dihindari kecuali benar-benar diperlukan. Jika tujuannya adalah untuk memodifikasi satu properti, biayanya sulit untuk dibenarkan.

Teknik Terprogram

Opsi lain adalah menggunakan teknik subkelas dan pembungkusan untuk memodifikasi informasi yang diekspos untuk properti tertentu. Ini adalah teknik yang dimaksudkan untuk menggantikan Anotasi Dinamis. Untuk mengambil alih satu properti dengan menggunakan subkelas dan pembungkusan, pengembang harus melakukan langkah-langkah berikut:

  1. Subkelas HWND dari objek IAccessible .
  2. Cegat pesan WM_GETOBJECT untuk nilai IParam/OBJID yang benar.
  3. Teruskan pesan WM_GETOBJECT ke kelas dasar menggunakan fungsi panggilan balik CallWndProc . Jika nol dikembalikan, panggil CreateStdAccessibleObject; jika tidak, panggil LresultFromObject pada nilai yang dikembalikan untuk mendapatkan penunjuk antarmuka IAccessible asli kontrol.
  4. Buat kelas pembungkus, yang mengimplementasikan IAccessible dan membungkus penunjuk antarmuka IAccessible yang dikembalikan dari langkah sebelumnya. Kelas pembungkus ini mengirimkan semua metode dan properti ke penunjuk antarmuka IAccessible asli, kecuali yang akan ditimpa. Ini melibatkan penulisan kode penerusan untuk semua 21 properti dan metode antarmuka IAccessible , terlepas dari berapa banyak yang benar-benar ditimpa.

Selain itu, pengembang harus memverifikasi kondisi berikut:

  • Metode atau properti yang ditimpa hanya boleh menangani ID anak yang diperlukan, dan meneruskan semua yang lain ke penunjuk antarmuka IAccessible asli.
  • Pembungkusan juga harus meneruskan antarmuka IEnumVARIANT dan IOleWindow hanya jika objek asli mendukungnya.
  • Penghitungan referensi harus ditangani dengan benar, terutama jika antarmuka lain didukung.
  • Nilai pengembalian IDispatch harus ditangani dengan benar, terutama dengan metode ITypeInfo::Invoke, yang harus dipanggil dengan penunjuk antarmuka ke antarmuka pembungkus, bukan penunjuk ke antarmuka IAccessible asli.

Teknik-teknik ini membutuhkan banyak pekerjaan, bahkan jika hanya satu atau dua properti yang perlu ditimpa. Sebagian besar kode yang dihasilkan berkaitan dengan subkelas dan pembungkusan, dan hanya sebagian kecil yang benar-benar memberikan informasi yang ditimpa.

Namun, ada skenario di mana teknik ini diperlukan. Misalnya, jika Anda membuat perubahan struktural untuk membuat elemen UI tempat penampung, maka Anda harus menggunakan teknik ini daripada Anotasi Dinamis.

Memperbaiki Nama yang Berasal dari Label

Beberapa kontrol umum Microsoft Win32, seperti kontrol kotak edit, hampir selalu digunakan dengan label (entri LTEXT dalam file sumber daya) atau kotak grup (GROUPBOX dalam file sumber daya). Aksesibilitas Aktif Microsoft secara otomatis memperoleh properti nama kontrol dari labelnya. Untuk kontrol tersebut, teks jendela (ditampilkan di Microsoft Visual Studio sebagai properti Nama atau ID) diabaikan, karena biasanya dibuat secara otomatis dan jarang deskriptif; misalnya, "IDC_EDIT1".

Jika antarmuka pengguna aplikasi tidak dirancang dengan benar, Aksesibilitas Aktif Microsoft mungkin tidak dapat mengatur nama dengan benar. Untuk dikaitkan dengan kontrol, kotak label atau grup harus ditempatkan segera sebelum kontrol dinamis dalam urutan tab.

Urutan tab dapat diubah dengan menggunakan alat di Visual Studio (pada menu Format saat editor sumber daya terbuka) atau dengan langsung mengedit file sumber daya.

Contoh berikut menunjukkan deskripsi file sumber daya dari kotak dialog yang berisi dua kotak edit berlabel.

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

Dalam contoh ini, label dan kontrol tidak tercantum dalam urutan tab yang benar. Akibatnya, Aksesibilitas Aktif Microsoft menetapkan nama "Nama Belakang" ke kotak edit nama depan, dan tidak ada nama sama sekali ke kotak edit nama belakang.

Contoh berikut menunjukkan daftar sumber daya yang benar. Perhatikan juga bahwa kunci pintasan telah ditunjuk dalam label.

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

Ketika kontrol memiliki label tambahan, seperti untuk nilai minimum dan maksimum pada trackbar, label ini harus ditempatkan setelah kontrol dalam urutan tab. Label utama kontrol harus muncul segera sebelum kontrol itu sendiri.

Kontrol Penamaan Tanpa Label

Tidak selalu mungkin atau diinginkan untuk memiliki label yang terlihat untuk setiap kontrol. Namun, Anda masih dapat memberikan nama untuk kontrol dengan menambahkan label yang tidak terlihat. Seperti biasa, label yang tidak terlihat harus segera mendahului kontrol dalam urutan tab.

Jika Anda menggunakan Editor Sumber Daya di Microsoft Visual Studio .NET, Anda dapat mengatur properti Terlihat ke False. Untuk membuat label tidak terlihat saat mengedit file sumber daya (.rc), tambahkan NOT WS_VISIBLE atau ke bagian gaya kontrol label, seperti yang ditunjukkan dalam contoh berikut.

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

Perhatikan bahwa setiap kunci pintasan yang ditunjuk berfungsi meskipun label tidak terlihat.