Enter 键不会触发 IDOK 默认按钮操作
Enter key does not trigger IDOK Default Push Button action
我有一个派生的 CDialog class。它的界面定义后面有几个图片框和一些按钮,在资源文件中定义为:
IDD_SELECT_ITEMS DIALOGEX 0, 0, 462, 274
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Select"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
CONTROL "",IDC_ITEM1,"Static",SS_BLACKFRAME,13,18,59,52
//...
CONTROL "",IDC_ITEM18,"Static",SS_BLACKFRAME,373,178,59,52
LTEXT "Select",IDC_STATIC,7,256,40,8
PUSHBUTTON "All",IDC_ALL,47,253,50,14
PUSHBUTTON "None",IDC_NONE,101,253,50,14
PUSHBUTTON "Filter ...",IDC_FILTER,155,253,60,14
DEFPUSHBUTTON "OK",IDOK,353,253,50,14
PUSHBUTTON "Cancel",IDCANCEL,405,253,50,14
END
当我初始化表单时,按 Enter 键不会触发与 IDOK 按钮关联的操作,因为 IDC_ALL 按钮被聚焦并且 Enter 执行它的操作,这是不希望的。
在其初始化例程中,
BOOL CSelectDialog::OnInitDialog()
{
CDialog::OnInitDialog();
//...
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
我尝试了所有方法将焦点放在 IDOK 按钮上,但没有成功。厌倦了交替评论和取消评论我添加的行:
BOOL CSelectParts::OnInitDialog()
{
SendDlgItemMessage(IDOK, DM_SETDEFID, 0);
CDialog::OnInitDialog();
// ...
this->SetDefID(IDOK);
GetDlgItem(IDOK)->SendMessage(BN_SETFOCUS, 0, 0);
SendDlgItemMessage(IDOK, WM_SETFOCUS, 0, 0);
SendDlgItemMessage(IDOK, BN_SETFOCUS, 0, 0);
SendDlgItemMessage(IDC_ALL, WM_KILLFOCUS, 0, 0);
SendDlgItemMessage(IDOK, DM_SETDEFID, 0,0);
::SetFocus(GetDlgItem(IDOK)->GetSafeHwnd());
GetDlgItem(IDOK)->SetFocus();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
我离得越近,是使用这条线
SendDlgItemMessage(IDOK, WM_SETFOCUS, 0, 0);
它做了一件非常奇怪的事情:它在两个按钮上绘制了一个焦点矩形,如图所示:
但 Enter 键尚未触发默认按钮!
我什至尝试添加一个 OnOK 方法
void CSelectDialog::OnOK()
{
__super::OnOK();
}
还没有成功!
另一个实验:我在 class 的消息映射中添加了一个条目:
ON_COMMAND(IDOK, OnOK)
还是不成功!
如何让 Enter 键执行 IDOK 按钮的操作?
解决方案就在我眼前的评论中,我完全瞎了,没看到!
看到 Dialog Box Programming Considerations 上 "The WM_INITDIALOG
Message" 部分的结尾后,我明白我必须 return FALSE。
我删除了我添加的所有无用行,将 return 值更改为 FALSE
,然后一切开始按预期正常工作:)
我有一个派生的 CDialog class。它的界面定义后面有几个图片框和一些按钮,在资源文件中定义为:
IDD_SELECT_ITEMS DIALOGEX 0, 0, 462, 274
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Select"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
CONTROL "",IDC_ITEM1,"Static",SS_BLACKFRAME,13,18,59,52
//...
CONTROL "",IDC_ITEM18,"Static",SS_BLACKFRAME,373,178,59,52
LTEXT "Select",IDC_STATIC,7,256,40,8
PUSHBUTTON "All",IDC_ALL,47,253,50,14
PUSHBUTTON "None",IDC_NONE,101,253,50,14
PUSHBUTTON "Filter ...",IDC_FILTER,155,253,60,14
DEFPUSHBUTTON "OK",IDOK,353,253,50,14
PUSHBUTTON "Cancel",IDCANCEL,405,253,50,14
END
当我初始化表单时,按 Enter 键不会触发与 IDOK 按钮关联的操作,因为 IDC_ALL 按钮被聚焦并且 Enter 执行它的操作,这是不希望的。
在其初始化例程中,
BOOL CSelectDialog::OnInitDialog()
{
CDialog::OnInitDialog();
//...
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
我尝试了所有方法将焦点放在 IDOK 按钮上,但没有成功。厌倦了交替评论和取消评论我添加的行:
BOOL CSelectParts::OnInitDialog()
{
SendDlgItemMessage(IDOK, DM_SETDEFID, 0);
CDialog::OnInitDialog();
// ...
this->SetDefID(IDOK);
GetDlgItem(IDOK)->SendMessage(BN_SETFOCUS, 0, 0);
SendDlgItemMessage(IDOK, WM_SETFOCUS, 0, 0);
SendDlgItemMessage(IDOK, BN_SETFOCUS, 0, 0);
SendDlgItemMessage(IDC_ALL, WM_KILLFOCUS, 0, 0);
SendDlgItemMessage(IDOK, DM_SETDEFID, 0,0);
::SetFocus(GetDlgItem(IDOK)->GetSafeHwnd());
GetDlgItem(IDOK)->SetFocus();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
我离得越近,是使用这条线
SendDlgItemMessage(IDOK, WM_SETFOCUS, 0, 0);
它做了一件非常奇怪的事情:它在两个按钮上绘制了一个焦点矩形,如图所示:
但 Enter 键尚未触发默认按钮!
我什至尝试添加一个 OnOK 方法
void CSelectDialog::OnOK()
{
__super::OnOK();
}
还没有成功!
另一个实验:我在 class 的消息映射中添加了一个条目:
ON_COMMAND(IDOK, OnOK)
还是不成功!
如何让 Enter 键执行 IDOK 按钮的操作?
解决方案就在我眼前的评论中,我完全瞎了,没看到!
看到 Dialog Box Programming Considerations 上 "The WM_INITDIALOG
Message" 部分的结尾后,我明白我必须 return FALSE。
我删除了我添加的所有无用行,将 return 值更改为 FALSE
,然后一切开始按预期正常工作:)