如何将焦点设置为按钮,以便可以看到边框和焦点虚线?

问题描述 投票:1回答:4

我创建了一个简单的基于对话框的应用程序,并在默认的CDialog中使用Visual Studio编辑器添加了三个按钮(通过拖放它们)。

默认的“确定”和“取消”按钮也在那里。

当我点击按钮3时,我想将焦点设置为按钮1。

我在muy按钮的属性中将属性Flat设置为true。

我编码了这个:

void CbuttonfocusDlg::OnBnClickedButton3()
{
    // TODO: Add your control notification handler code here
    GetDlgItem(IDC_BUTTON1)->SetFocus();

    Invalidate();

}

但是从不绘制按钮1中的边框。如果我在点击按钮3之前随时按下TAB,则仅绘制插入符号(表示焦点的虚线)。

我希望按钮看起来与我点击后看起来完全一样。以编程方式显示按钮内的虚线将是一个加号。

我想要的是:

http://i33.tinypic.com/11t8pkl.png

我得到了什么:

http://i37.tinypic.com/160q5hw.png

c++ mfc setfocus cdialog cbutton
4个回答
4
投票

使用WM_NEXTDLGCTL

Reymond Chen's "How to set focus in a dialog box"

void SetDialogFocus(HWND hdlg, HWND hwndControl)
{
    SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
}

0
投票

通过调用UpdateWindow,在焦点更改生效之前,正在重绘按钮。 Invalidate本身就足够了,当一切都安定下来时,窗口会重新粉刷。


0
投票

这会在按钮周围绘制粗边框:

static_cast<CButton*>(GetDlgItem(IDC_BUTTON1))->SetButtonStyle(BS_DEFPUSHBUTTON);

更优雅的方法是在CbuttonfocusDlg中定义一个CButton成员变量并将其与IDC_BUTTON1控件相关联,然后调用

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

这使得我设置焦点的按钮成为默认按钮,但请注意,当焦点转到不是按钮的控件(在对话框内)时,默认按钮再次是原始默认按钮设置在对话框资源,在这种情况下是“确定”按钮。


0
投票

我正在追随乔尔的建议。但与该链接中使用的API略有不同,我的是:

PostMessage(WM_NEXTDLGCTL,(WPARAM)(pwnd-> GetSafeHwnd()),TRUE);

© www.soinside.com 2019 - 2024. All rights reserved.