1

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

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

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

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

我编码了这个:

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

    Invalidate();

}

但是 button1 中的边框从未被绘制。只有在单击按钮 3 之前按 TAB 键时才会绘制插入符号(表示焦点的虚线)。

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

我想要的是:

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

我得到什么:

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

4

4 回答 4

4

使用WM_NEXTDLGCTL.

请参阅Reymond Chen 的“如何在对话框中设置焦点”

void SetDialogFocus(HWND hdlg, HWND hwndControl)
{
    SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
}
于 2008-12-16T22:51:21.230 回答
0

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

于 2008-12-15T21:47:43.417 回答
0

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

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

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

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

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

于 2008-12-16T15:54:22.680 回答
0

我遵循乔尔的建议。但与该链接中使用的 API 略有不同,我的是:

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

于 2014-06-24T01:58:50.560 回答