?? csdn_文檔中心_創(chuàng)建更易理解的動(dòng)態(tài)注釋用戶界面.htm
字號(hào):
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399 height=10><FONT
color=#ffffff>出處</FONT></TD>
<TD height=10> <A
href="http://www.microsoft.com/china/msdn/technic/library/techart/dynmicannot.asp">http://www.microsoft.com/china/msdn/technic/library/techart/dynmicannot.asp</A></TD></TR>
<TR>
<TD align=middle height=10></TD>
<TD height=10></TD></TR></TBODY></TABLE><!--文章說明信息結(jié)束//-->
<TABLE border=0 width=600>
<TBODY>
<TR>
<TD align=left><BR><FONT face=宋體 size=2>Rob Sinclair 和 Brendan
McKeon <BR>Microsoft Corporation <BR>2000年9月 </FONT>
<P></P>
<P><B>摘要:</B> :作為 Microsoft Active Accessibility 2.0
系列的第一篇文章,本文論述了動(dòng)態(tài)注釋 (DA),一種使開發(fā)人員提高用戶界面可用性的新技術(shù)。
<P><B>目錄</B>
<UL>
<LI><A
href="http://www.microsoft.com/china/msdn/technic/library/techart/dynmicannot.asp#1">簡(jiǎn)介</A>
<LI><A
href="http://www.microsoft.com/china/msdn/technic/library/techart/dynmicannot.asp#2">什么是動(dòng)態(tài)注釋</A>
<LI><A
href="http://www.microsoft.com/china/msdn/technic/library/techart/dynmicannot.asp#3">動(dòng)態(tài)注釋的替代方法</A>
<LI><A
href="http://www.microsoft.com/china/msdn/technic/library/techart/dynmicannot.asp#4">為用戶界面添加注釋</A>
<LI><A
href="http://www.microsoft.com/china/msdn/technic/library/techart/dynmicannot.asp#5">可用性和其它資源</A>
</LI></UL>
<HR SIZE=1>
<P><BR><FONT class=105v><B><A name=#1></A><FONT
size=3>簡(jiǎn)介</FONT></B></FONT>
<P>前面的文章介紹了作為 Microsoft Active Accessibility 1.0 的一部分的 <FONT
face=arial><B>IAccessible</FONT></B> 界面,并說明了 oleacc.dll 為標(biāo)準(zhǔn)控件(USER 和
ComCtl)提供了該界面的默認(rèn)實(shí)現(xiàn)。這些文章使開發(fā)人員在使用自己繪制的和自定義控件時(shí)避免破壞默認(rèn)實(shí)現(xiàn)。有關(guān)詳細(xì)信息,請(qǐng)參閱 <A
href="http://msdn.microsoft.com/library/techart/actvaccess.htm">Microsoft
Active Accessibility: Part 1</A>(英文)(另在 <I>MSDN News</I> 的 2000 年
5/6 月刊)<I> </I>和 <A
href="http://msdn.microsoft.com/library/techart/msaa_sa.htm">Microsoft
Active Accessibility: Part 2</A>(英文)(另在 <I>MSDN News</I> 的 2000 年
7/8 月刊)。
<P>本文是討論 Active Accessibility 2.0 及其新功能系列文章的第一篇。作為這些功能之一的動(dòng)態(tài)注釋 (DA)
與前面文章中討論的技術(shù)相比,為自定義輔助功能信息提供了更好的靈活性并明顯降低了開發(fā)成本。</P>
<HR SIZE=1>
<P><BR><FONT class=105v><B><A name=#2></A><FONT
size=3>什么是動(dòng)態(tài)注釋</FONT></B></FONT>
<P>Active Accessibility 組件 oleacc.dll 創(chuàng)建代表標(biāo)準(zhǔn) Microsoft Windows? 控件實(shí)現(xiàn)
<B><FONT face=arial>IAccessible</FONT></B> 的代理對(duì)象。由于這些代理使用標(biāo)準(zhǔn) Windows
消息和控件專用 API 收集每個(gè)控件的信息,因此沒有直接的機(jī)制自定義這些代理通過 <B><FONT
face=arial>IAccessible</FONT></B> 提供的信息。</P>
<P>動(dòng)態(tài)注釋允許開發(fā)人員將提示和其他有用信息傳遞給 OLEACC 來自定義其提供的信息。該功能本身將降低支持 Active
Accessibility 的成本,使開發(fā)人員大大改進(jìn)用戶界面的輔助功能。</P>
<HR SIZE=1>
<P><BR><FONT class=105v><B><A name=#3></A><FONT
size=3>動(dòng)態(tài)注釋的替代方法</FONT></B></FONT>
<P>還有其他方法可以為界面元素提供自定義 <B><FONT face=arial>IAccessible</FONT></B>
支持,在某些場(chǎng)合它們是正確的解決方案。實(shí)際上,在引入注釋之前,這些技術(shù)是開發(fā)人員的唯一選擇。</P>
<P>第一種替代方法是實(shí)現(xiàn)整個(gè) <B><FONT face=arial>IAccessible</FONT></B>
界面。自定義控件或不同用戶界面元素通常需要該方法,但是開發(fā)和測(cè)試成本明顯太高,因此除非真正必要否則應(yīng)該避免采用。如果目標(biāo)是更改單個(gè)屬性,則成本難以判斷。</P>
<P>第二種方法是使用子類和封裝技術(shù)修改指定屬性的信息。這是動(dòng)態(tài)注釋要替代的技術(shù)。要使用子類和封裝重載單個(gè)屬性,開發(fā)人員必須:
<UL type=disc>
<LI>使 <B><FONT face=arial>IAccessible</FONT></B> 對(duì)象的 HWND
成為子類。<BR><BR>
<LI>截取 WM_GETOBJECT 獲得正確 lParam/OBJID 值。<BR><BR>
<LI>將 WM_GETOBJECT 通過 <B><FONT face=arial>CallWndProc()</FONT></B>
傳遞給基類。如果返回 0,則調(diào)用 <B><FONT
face=arial>CreateStdAccessibleObject</FONT></B>;否則調(diào)用 <B><FONT
face=arial>LresultFromObject</FONT></B> 來獲得控件本身的 <B><FONT
face=arial>IAccessible</FONT></B>。<BR><BR>
<LI>創(chuàng)建封裝類,該類實(shí)現(xiàn) <B><FONT face=arial>IAccessible</FONT></B>
并封裝了上一步返回的 <B><FONT
face=arial>IAccessible</FONT></B>。除需要重載的之外,該封裝類將所有方法和屬性均傳遞給原始
<B><FONT face=arial>IAccessible</FONT></B>。這包括編寫傳遞 <B><FONT
face=arial>IAccessible</FONT></B> 所有 21
種屬性和方法的代碼,無論實(shí)際重載多少。<BR><BR>
<LI>重載方法和屬性必須只處理所需的子 ID,而將所有其他內(nèi)容傳遞給原始 <B><FONT
face=arial>IAccessible</FONT></B>。<BR><BR>
<LI>如果且僅在原始對(duì)象支持的情況下,封裝還必須傳遞 <B><FONT face=arial>IEnumVARIANT</B> 和
<B>IOleWindow</FONT></B> 接口。<BR><BR>
<LI>必須仔細(xì)確保正確處理引用計(jì)算,特別是如果支持其它界面的話。<BR><BR>
<LI>必須仔細(xì)正確處理 <B><FONT face=arial>IDispatch</FONT></B>,特別是 <B><FONT
face=arial>ITypeLib::Invoke()</FONT></B>,它必須隨指向封裝接口的接口指針一起調(diào)用,而不是指向原始
<B><FONT face=arial>IAccessible</FONT></B> 接口的指針。 </LI></UL>
<P>如前所見,這包括相當(dāng)?shù)墓ぷ髁浚词怪挥幸粋€(gè)或兩個(gè)屬性需要重載。結(jié)果代碼的大部分用于子類和封裝,只有一小部分結(jié)果代碼實(shí)際執(zhí)行真正提供重載信息的任務(wù)。</P>
<HR SIZE=1>
<P><BR><FONT class=105v><B><A name=#4></A><FONT
size=3>為用戶界面添加注釋</FONT></B></FONT>
<P>Active Accessibility 2.0
中支持三種動(dòng)態(tài)注釋:<I>直接注釋</I>、<I>數(shù)值映射注釋</I>和<I>回調(diào)注釋</I>。每種類型都有它的優(yōu)點(diǎn),因此首先要理解哪一種方法適用于指定場(chǎng)合。</P>
<P><B>注釋接口</B>
<P>在繼續(xù)之前,熟悉注釋所涉及的三種主要接口非常重要。由于篇幅所限,我們只對(duì)每一種進(jìn)行高層次的說明。有關(guān)詳細(xì)信息,包括每個(gè)界面方法的討論,可在
Active Accessibility SDK 中找到。</P>
<P><I><B><FONT face=arial>IAccPropServices</FONT></B> 接口。</I>這是由單個(gè)類
<B><FONT face=arial>CLSID_AccPropServices</FONT></B> 實(shí)現(xiàn)的主要注釋接口,該類位于
oleacc.dll 中。該接口包含注釋訪問元素的方法(請(qǐng)參閱表 1)。</P>
<P class=label><B>表 1. <FONT face=arial>IAccPropServices</FONT>
接口方法</B></P>
<TABLE border=1 cellPadding=5 cols=2 frame=below rules=rows>
<TBODY>
<TR vAlign=top>
<TD width="50%"><FONT class=90v><B><FONT face=arial
size=2>SetPropValue()</FONT></B></FONT></TD>
<TD width="50%"><FONT class=90v size=2>需要通過一個(gè) VARIANT 變量傳遞
<B><FONT face=arial>IAccessibleIdentity</FONT></B>
和注釋值。</FONT></TD></TR>
<TR vAlign=top>
<TD width="50%"><FONT class=90v><B><FONT face=arial
size=2>SetPropServer()</FONT></B></FONT></TD>
<TD width="50%"><FONT class=90v size=2>用于回調(diào)注釋。</FONT></TD></TR>
<TR vAlign=top>
<TD width="50%"><FONT class=90v><B><FONT face=arial
size=2>ClearProps()</FONT></B></FONT></TD>
<TD width="50%"><FONT class=90v
size=2>闡述屬性的注釋值,但是這通常不需要,因?yàn)樽⑨尫?wù)在注釋元素銷毀時(shí)自動(dòng)清除并釋放該信息。</FONT></TD></TR>
<TR vAlign=top>
<TD class=indent width="50%"><FONT class=90v><FONT
size=2><B><FONT face=arial>SetHwndProp()</FONT></B> </FONT>
<P class=indent><B><FONT
face=arial>SetHwndPropStr()</FONT></B></P>
<P><B><FONT
face=arial>SetHwndPropServer()</FONT></B></P></FONT></TD>
<TD width="50%"><FONT class=90v size=2>這些方法提供 HWND
專用注釋。</FONT></TD></TR>
<TR vAlign=top>
<TD class=indent width="50%"><FONT class=90v><FONT
size=2><B><FONT face=arial>SetHmenuProp()</FONT></B> </FONT>
<P class=indent><B><FONT
face=arial>SetHmenuPropStr()</FONT></B></P>
<P><B><FONT
face=arial>SetHmenuPropServer()</FONT></B></P></FONT></TD>
<TD width="50%"><FONT class=90v size=2>這些方法提供 HMENU
專用注釋。</FONT></TD></TR></TBODY></TABLE><BR>
<P><I><B><FONT face=arial>IAccIdentity</B></FONT> 接口。</I>由 <B><FONT
face=arial>IAccessible</FONT></B>
對(duì)象實(shí)現(xiàn)并內(nèi)部用于進(jìn)入注釋數(shù)據(jù)庫(kù)的密匙。所有希望支持動(dòng)態(tài)注釋的對(duì)象必須支持該接口。</P>
<P><I><B><FONT face=arial>IAccPropServer</FONT></B>
接口。</I>由在回調(diào)注釋中使用的回調(diào)對(duì)象實(shí)現(xiàn)。</P>
<P><B>直接注釋</B>
<P>動(dòng)態(tài)注釋的最簡(jiǎn)單形式稱作<B>直接注釋</B>。這種注釋最適用于注釋屬性不依賴于控件狀態(tài)的訪問元素,因此不需要由<B>數(shù)值映射注釋</B>和<B>回調(diào)注釋</B>提供的附加支持。</P>
<P>要使用直接注釋為訪問元素進(jìn)行注釋:
<UL type=disc>
<LI>獲得指向要注釋的訪問元素的 <B><FONT face=arial>IAccessible</FONT></B>
接口指針。<BR><BR>
<LI><B><FONT face=arial>IAccIdentity</FONT></B> 接口的 QI,并調(diào)用
<B><FONT face=arial>GetIdentityString()</FONT></B>
獲得訪問元素的標(biāo)識(shí)字符串。<BR><BR>
<LI><B>同時(shí)創(chuàng)建</B> <B><FONT face=arial>AccPropServices</FONT></B>
對(duì)象。<BR><BR>
<LI>調(diào)用 <B><FONT
face=arial>IAccPropServices::SetPropValue</FONT></B>,傳遞標(biāo)識(shí)字符串,代表要重載的屬性的
GUID,一個(gè)包含新屬性值的 VARIANT 變量。 </LI></UL>
<P>如果不對(duì)訪問元素的標(biāo)識(shí)調(diào)用 <B><FONT
face=arial>SetPropValue</FONT></B>,開發(fā)人員可以調(diào)用 <B><FONT
face=arial>SetHwndProp<I>X</I></B></FONT> 或 <B><FONT
face=arial>SetHmenuProp<I>X</I></FONT></B> 方法并提供訪問元素的 HWND/HMENU、對(duì)象
ID 和子 ID。這不需要 <B><FONT face=arial>IAccIdentity</FONT></B> 的 QI,調(diào)用
<B><FONT face=arial>GetIdentityString</FONT></B> 并在 VARIANT
中包裝字符串值。</P>
<P>下列屬性可使用直接注釋進(jìn)行注釋,數(shù)值必須為指定類型:</P>
<TABLE border=1 cellPadding=5 cols=2 frame=below rules=rows>
<TBODY>
<TR vAlign=top>
<TD width="74%"><FONT class=90v
size=2>PROPID_ACC_DEFAULTACTION</FONT></TD>
<TD width="26%"><FONT class=90v size=2>(VT_BSTR)</FONT></TD></TR>
<TR vAlign=top>
<TD width="74%"><FONT class=90v
size=2>PROPID_ACC_DESCRIPTION</FONT></TD>
<TD width="26%"><FONT class=90v size=2>(VT_BSTR)</FONT></TD></TR>
<TR vAlign=top>
<TD width="74%"><FONT class=90v
size=2>PROPID_ACC_HELP</FONT></TD>
<TD width="26%"><FONT class=90v size=2>(VT_BSTR)</FONT></TD></TR>
<TR vAlign=top>
<TD width="74%"><FONT class=90v
size=2>PROPID_ACC_KEYBOARDSHORTCUT</FONT></TD>
<TD width="26%"><FONT class=90v size=2>(VT_BSTR)</FONT></TD></TR>
<TR vAlign=top>
<TD width="74%"><FONT class=90v
size=2>PROPID_ACC_NAME</FONT></TD>
<TD width="26%"><FONT class=90v size=2>(VT_BSTR)</FONT></TD></TR>
<TR vAlign=top>
<TD width="74%"><FONT class=90v
size=2>PROPID_ACC_ROLE</FONT></TD>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -