有没有人对屏幕阅读器和Windows对话框有任何了解?具体来说,如何强制屏幕阅读器按特定顺序读取对话框控件。 此顺序必须在运行时确定,因为实际的对话框控件是动态添加的,具体取决于要显示的对话框类型。
注意
我正在使用一个简单的Win32应用程序对话框。我能够重现我的问题的一个小例子是空白的Win32应用程序并使用默认的“关于”对话框。
背景
我需要更新现有的弹出对话框,以便对于那些需要屏幕阅读器的用户,它将被正确解释和理解。目前,屏幕阅读器以令人困惑的顺序阅读信息,使视障用户难以理解继续需要什么。
问题详情
我似乎无法更新对话框上控件的z顺序,以更改屏幕阅读器读取它们的顺序。
根据我的理解,我必须更新对话框上控件的tab-order(z-order),因为这是屏幕阅读器读取信息的顺序(如果这一点,请随时纠正我的意思我离这儿目标了。)
网络上的许多建议建议使用SetWindowPos函数或DeferWindowPos函数。不幸的是,我无法让这些工作正常。
我的“基本”测试对话框定义了以下控件;
HWND ctrl_StaticText1 = GetDlgItem(hDlg, IDC_STATIC_1);
HWND ctrl_StaticText2 = GetDlgItem(hDlg, IDC_STATIC_2);
HWND ctrl_StaticText3 = GetDlgItem(hDlg, IDC_STATIC_3);
HWND ctrl_Edit1 = GetDlgItem(hDlg, IDC_EDIT_1);
HWND ctrl_Edit2 = GetDlgItem(hDlg, IDC_EDIT_2);
HWND ctrl_Pict1 = GetDlgItem(hDlg, IDC_PICT_1);
HWND ctrl_ButtonOk = GetDlgItem(hDlg, IDOK);
然后我尝试按如下方式设置z顺序;
HDWP windowPos = BeginDeferWindowPos(7);
windowPos = DeferWindowPos(windowPos, ctrl_StaticText1, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
windowPos = DeferWindowPos(windowPos, ctrl_StaticText2, ctrl_StaticText1, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
windowPos = DeferWindowPos(windowPos, ctrl_StaticText3, ctrl_StaticText2, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
windowPos = DeferWindowPos(windowPos, ctrl_Edit1, ctrl_StaticText3, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
windowPos = DeferWindowPos(windowPos, ctrl_Edit2, ctrl_Edit1, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
windowPos = DeferWindowPos(windowPos, ctrl_Pict1, ctrl_Edit2, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
windowPos = DeferWindowPos(windowPos, ctrl_ButtonOk, ctrl_Pict1, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
EndDeferWindowPos(windowPos);
打开对话框时,屏幕阅读器显示“静态文本1,静态文本3,只读编辑”(只读编辑框为ctrl_Edit1,ctrl_Edit2不是只读)。
旁注
当对话框只包含几个静态文本控件时,此功能似乎正常工作,只有当我开始添加更多“复杂”控件时,例如编辑框和图片控件才会出现问题。
感谢您的帮助:)
修改
根据要求,下面是.rc文件(我假设它只是感兴趣的对话框控件部分。)
IDD_ABOUTBOX DIALOGEX 0, 0, 349, 190
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
LTEXT "Static text 1",IDC_STATIC_1,35,25,40,8,NOT WS_GROUP
LTEXT "Static text 2",IDC_STATIC_2,33,55,40,8,NOT WS_GROUP
LTEXT "Static text 3",IDC_STATIC_3,173,52,40,8,NOT WS_VISIBLE | NOT WS_GROUP
DEFPUSHBUTTON "OK",IDOK,292,169,50,14
EDITTEXT IDC_EDIT_1, 72, 95, 55, 14, ES_AUTOHSCROLL | ES_READONLY
CONTROL "",IDC_PICT_1,"Static",SS_BLACKFRAME,138,92,20,20
EDITTEXT IDC_EDIT_2, 174, 95, 40, 14, ES_AUTOHSCROLLs
END
注意,我在测试时做了一些更改,所以使用上面的文件,屏幕阅读器输出现在是“静态文本1,静态文本2,静态文本3,只读编辑”。我已尝试改变该文件中的顺序,屏幕阅读器不输出编辑框后的任何内容。