自定义对话框的默认按钮输入焦点传递

Posted Autumn の Box

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义对话框的默认按钮输入焦点传递相关的知识,希望对你有一定的参考价值。

注意:

  当一个对话框中没有按钮控件(也就没有缺省按钮)时,在对话框弹出后首次按下回车键即默认执行“OnOK”,会使对话框默认关闭,这时需要先注释掉调用基类的OnOK函数的响应执行,再利用GetNextDlgTabItem函数将回车后的焦点传递到当前对话框中的别的控件上,使对话框不被关闭!

  当对话框弹出后按下【esc】键会默认响应“OnCancel”,会使对话框默认关闭,可以改变响应函数“OnCancel”和“OnClose”以使对话框更好的关闭:  

 

void CxxxDlg::OnCancel()
{
	// TODO: 在此添加专用代码和/或调用基类
	//if (MessageBox(_T("确定要退出吗?"),_T("退出提示"),MB_OKCANCEL|MB_ICONQUESTION)!=IDOK)
	//{
	//	return;
	//}
	//else
	//{
		CDialogEx::OnCancel();	
	//}
}

void CxxxDlg::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	////////////////////////////////////////////////////////////////////////////////
	if (MessageBox(_T("确定要退出吗?"),_T("退出提示"),MB_OKCANCEL|MB_ICONQUESTION)!=IDOK)
	{
		return;
	}
	else
	{
		//CDialogEx::OnClose();
		CDialogEx::OnCancel();
	}
	////////////////////////////////////////////////////////////////////////////////
}

 

1、对话框的默认按钮

  当在资源窗口中插入一个默认的对话框资源时,“确定(OK)”按钮的样式中的“缺省按钮”选项是选中的,而别的控件的样式中均未选中;对话框中是否为默认按钮即由该样式选项决定,当对话框弹出后首次按下回车键即执行默认按钮的响应函数;

  

2、输入焦点

  在对话框中按Tab键时,输入焦点会依照Tab顺序在各控件上传递;Tab顺序:VC菜单栏->布局->Tab顺序/Ctrl+D可查看该顺序,在查看状态下点击控件可重排顺序;

  

  双击“确定(OK)”按钮,生成IDOK的响应函数OnOK,可见对话框的IDOK按钮响应函数调用了基类的OnOK函数;  

void CTestDlg::OnOK() 
{
    // TODO: Add extra validation here   
    CDialog::OnOK();
}

  当用户在对话框弹出后,按下“回车键”时,先查看对话框中是否有指定的默认按钮,如果有就调用该默认按钮的响应函数,如果没有则调用对话框的OnOK函数,即使对话框中没有“确定(OK)”按钮;

  注释掉调用基类的OnOK函数的这行代码后,利用GetNextDlgTabItem函数可用回车键将焦点在各控件间传递:  

void CTestDlg::OnOK() 
{
    // TODO: Add extra validation here
    GetNextDlgTabItem(GetFocus())->SetFocus();  
    //CDialog::OnOK();
}

  GetNextDlgTabItem:查找具有“制表站(Tab stop)”属性的控件,并按Tab顺序依次查找各控件;

  

 

以上是关于自定义对话框的默认按钮输入焦点传递的主要内容,如果未能解决你的问题,请参考以下文章

在片段活动中显示自定义对话框

JavaFX自定义窗口标题栏

Flutter:如何将可访问性焦点集中到自定义应用栏

android:自定义可输入对话框,EditText已经获得焦点,为啥就是不弹出输入法呢?

传递自定义类来连接(信号和插槽)

[WPF自定义控件库] 让Form在加载后自动获得焦点