我创建了一个简单的基于对话框的应用程序,并在默认的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,则仅绘制插入符号(表示焦点的虚线)。
我希望按钮看起来与我点击后看起来完全一样。以编程方式显示按钮内的虚线将是一个加号。
我想要的是:
我得到了什么:
使用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);
}
通过调用UpdateWindow,在焦点更改生效之前,正在重绘按钮。 Invalidate本身就足够了,当一切都安定下来时,窗口会重新粉刷。
这会在按钮周围绘制粗边框:
static_cast<CButton*>(GetDlgItem(IDC_BUTTON1))->SetButtonStyle(BS_DEFPUSHBUTTON);
更优雅的方法是在CbuttonfocusDlg中定义一个CButton成员变量并将其与IDC_BUTTON1控件相关联,然后调用
this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);
这使得我设置焦点的按钮成为默认按钮,但请注意,当焦点转到不是按钮的控件(在对话框内)时,默认按钮再次是原始默认按钮设置在对话框资源,在这种情况下是“确定”按钮。
我正在追随乔尔的建议。但与该链接中使用的API略有不同,我的是:
PostMessage(WM_NEXTDLGCTL,(WPARAM)(pwnd-> GetSafeHwnd()),TRUE);