原创

C

C++

windows sdk

无障碍

C/C++中给控件设置标签方法

2020-07-01 Wednesday 12:30

前言

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

1.实现IAccessible

我们首先需要定义一个类,让其继承于IAccessible,在IAccessible中有很多方法,例如get_accName、get_accChild、get_accRole等,并非所有方法我们都需要实现,不实现的方法我们可以直接在方法中返回E_NOTIMPL即可。
实现IAccessible接口
我们要给控件添加标签,就要实现get_accName,它的声明如下:
IFACEMETHODIMP get_accName(VARIANT varChild, BSTR * pszName);
参数一共就两个,我们首先来说varChild参数。
varChild中有一个lVal属性,此属性当varChild.vt等于VT_I4时有效,此属性的含义为要获取标签的控件ID。
lVal等于CHILDID_SELF时,表示要获取控件本身的标签,而等于其它值,则表示要获取控件中的子控件标签,例如要获取列表框中某一项的标签。
而第二个参数pszName,是用来保存标签名的缓冲区,我们可以直接使用如下代码给它赋值:
*pszName = SysAllocString(L”测试标签”);
最后我们需返回S_OK表示调用成功。

2.给屏幕阅读器返回IAccessible

要想让屏幕阅读器调用我们自己实现的IAccessible,我们需要处理控件的WM_GETOBJECT消息。
在WM_GETOBJECT消息中使用LresultFromObject函数,将我们定义的IAccessible返回给屏幕阅读器,具体代码如下:
LresultFromObject(IID_IAccessible, wParam,static_cast<IAccessible*>(iAccessible));
这样当屏幕阅读器浏览到此控件的时候,就会调用我们自己实现的IAccessible,并调用get_accName方法,获取出我们定义的控件标签,并朗读出来。


随手打赏
关闭

感谢您的支持!

扫码打赏,你说多少就多少
打赏二维码

打开

支付宝

扫一扫,即可进行扫码打赏哦