Double-clicking radio buttons - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050804-10/?p=34713
Raymond Chen 在 2005年08月04日
让对话框单选按钮支持双击确定
提示
本文提供了一种让对话框窗口上的控件支持双击确定窗口返回的方法
正文
为你的对话框增加一丝精致感,可以通过支持双击单选按钮作为“选择 + 确定”的快捷方式。
( 如果页面是向导的一部分,则为“选择 + 下一步”或“选择 + 完成”。)
考虑以下对话框模板
1 DIALOGEX DISCARDABLE 32, 32, 200, 76
STYLE DS_MODALFRAME | WS_POPUP |
WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION “Sample”
FONT 8, “MS Shell Dlg”
BEGIN
LTEXT “A mumbler is needed.”,-1,7,8,100,10
AUTORADIOBUTTON “Do not &obtain a mumber now”,
100,17,24,180,10
AUTORADIOBUTTON “Obtain a mumbler auto&matically”,
101,17,34,180,10
AUTORADIOBUTTON “&Enter mumbler manually”,
102,17,44,180,10
DEFPUSHBUTTON “OK”,IDOK,92,58,50,14
PUSHBUTTON “Cancel”,IDCANCEL,146,58,50,14
END
和相关的对话框过程:
INT_PTR CALLBACK DlgProc(HWND hdlg, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_INITDIALOG:
CheckRadioButton(hdlg, 100, 102, 100);
return TRUE;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDOK:
for (int i = 100; i <= 102; i++) {
if (IsDlgButtonChecked(hdlg, i)) EndDialog(hdlg, i);
}
break;
case IDCANCEL:
EndDialog(hdlg, -1);
break;
}
}
return FALSE;
}
这是一个相当标准的、没什么特别的对话框,要求用户从列表中选择一个选项。注意,双击单选按钮并不做任何特别的事情。我们可以修复这一点。
1 DIALOGEX DISCARDABLE 32, 32, 200, 76
STYLE DS_MODALFRAME | WS_POPUP |
WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION “Sample”
FONT 8, “MS Shell Dlg”
BEGIN
LTEXT “A mumbler is needed.”,-1,7,8,100,10
AUTORADIOBUTTON “Do not &obtain a mumber now”,
100,17,24,180,10,BS_NOTIFY
AUTORADIOBUTTON “Obtain a mumbler auto&matically”,
101,17,34,180,10,BS_NOTIFY
AUTORADIOBUTTON “&Enter mumbler manually”,
102,17,44,180,10,BS_NOTIFY
DEFPUSHBUTTON “OK”,IDOK,92,58,50,14
PUSHBUTTON “Cancel”,IDCANCEL,146,58,50,14
END
INT_PTR CALLBACK DlgProc(HWND hdlg, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_INITDIALOG:
CheckRadioButton(hdlg, 100, 102, 100);
return TRUE;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDOK:
for (int i = 100; i <= 102; i++) {
if (IsDlgButtonChecked(hdlg, i)) EndDialog(hdlg, i);
}
break;
case IDCANCEL:
EndDialog(hdlg, -1);
break;
case 100:
case 101:
case 102:
if (GET_WM_COMMAND_CMD(wParam, lParam) == BN_DBLCLK) {
EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam));
}
break;
}
}
return FALSE;
}
我们在单选按钮上添加了 BS_NOTIFY
样式,这启用了扩展通知(除了 BN_CLICKED
之外的所有通知)。当我们收到一个指定操作为 BN_DBLCLK
的单选按钮的 WM_COMMAND
消息时,我们自动点击确定按钮。(对于向导,我们将根据情况自动点击下一步或完成按钮。)
请注意,双击作为选择和确定的快捷方式应该只用于只有单选按钮(和确定和取消按钮)的对话框或向导页面。如果页面上有除单选按钮之外的其他控件,那么你必须等待用户确定,因为他可能想操作其他控件。
如果对话框上只有列表框或列表视图,而用户被要求从中选择一个项目,那么这个“双击意味着选择和确定”的快捷方式也可以使用。如果用户双击列表中的一个项目,将其视为选择和确定。
资源管理器中的对话框对双击单选按钮的支持相当不一致。Office 和 Money 团队在这方面做得好多了。