C中给控件设置标签的方法

在C++中使用CreateWindow函数创建出的控件,例如列表框(listbox)、编辑框(edit)等,想让其被屏幕阅读器朗读其标签,我们可以实现IAccessible接口,具体步骤如下:

一、实现IAccessible

我们首先需要定义一个类,让其继承于IAccessible,在IAccessible中有很多方法,例如get_accName、get_accChild、get_accRole等,并非所有方法我们都需要实现,不实现的方法我们可以直接在方法中返回E_NOTIMPL即可。

我们要给控件添加标签,就要实现get_accName,它的声明如下:

IFACEMETHODIMPget_accName(VARIANTvarChild,BSTR*pszName);

参数一共就两个,我们首先来说varChild参数。

varChild中有一个lVal属性,此属性当varChild.vt等于VT_I4时有效,此属性的含义为要获取标签的控件ID。

lVal等于CHILDID_SELF时,表示要获取控件本身的标签,而等于其它值,则表示要获取控件中的子控件标签,例如要获取列表框中某一项的标签。

而第二个参数pszName,是用来保存标签名的缓冲区,我们可以直接使用如下代码给它赋值:

*pszName=SysAllocString(L测试标签);

最后我们需返回S_OK表示调用成功。

二、给屏幕阅读器返回IAccessible

要想让屏幕阅读器调用我们自己实现的IAccessible,我们需要处理控件的WM_GETOBJECT消息。

在WM_GETOBJECT消息中使用LresultFromObject函数,将我们定义的IAccessible返回给屏幕阅读器,具体代码如下:

LresultFromObject(IID_IAccessible,wParam,static_cast(iAccessible));

这样当屏幕阅读器浏览到此控件的时候,就会调用我们自己实现的IAccessible,并调用get_accName方法,获取出我们定义的控件标签,并朗读出来。




转载请注明:http://www.aierlanlan.com/cyrz/3359.html