【问题标题】:Enter key does not trigger IDOK Default Push Button actionEnter 键不会触发 IDOK 默认按钮操作
【发布时间】:2016-02-02 00:52:51
【问题描述】:

我有一个 CDialog 派生类。它的界面定义后面有几个图片框和一些按钮,在资源文件中定义为:

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();
}

还没有成功!

另一个实验:我在班级的消息映射中添加了一个条目:

ON_COMMAND(IDOK, OnOK)

还是不成功!

我怎样才能设法让 Enter 键执行 IDOK 按钮的操作?

【问题讨论】:

    标签: mfc focus enter cdialog defaultbutton


    【解决方案1】:

    解决方案就在我眼前的评论中,我完全失明,看不到它!

    在看到Dialog Box Programming Considerations 上“WM_INITDIALOG 消息”部分的结尾后,我明白我必须返回 FALSE。

    我消除了我添加的所有无用的行,将返回值更改为FALSE,一切都开始按预期正常工作:)

    【讨论】:

    • 您可以更改标签顺序,以便首先出现“确定”按钮。在资源编辑器中单击“格式”菜单,选择“Tab order”(或单击 Ctrl+D)选择 OK 按钮作为第一个控件。
    • @BarmakShemirani:我们不希望这样,因为它会给用户带来对界面的扭曲感知!
    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 2016-03-10
    • 2013-08-20
    • 1970-01-01
    • 2016-10-25
    • 2011-05-13
    • 2014-02-09
    • 2014-11-30
    相关资源
    最近更新 更多