Can*_*rse 4 c++ user-interface logic mfc
我在一个对话框上工作,在启用确定按钮之前必须满足几个规则.
目前,页面上的任何操作(例如输入数据或从下拉列表中选择项目(以及其他内容))都会调用一个名为ProcessEvent()的函数 - 此函数处理所有逻辑,并启用或禁用"确定"按钮.
我的问题是我发现难以使规则简洁易懂.
一些规则可以通过对话框上的另一个操作来否定,我现在最终得到if else语句到处或者难以阅读和跟随和扩展.
下面的代码是问题的简化,但很好地证明了这一点.如何更好地处理这个问题(如果可能的话)
bool CWorkstation::ProcessEvent(void)
{
UpdateData();
CharCount = GetDlgItemInt(IDC_CharCount, NULL, FALSE); //get latest
if ( IsDlgButtonChecked(IDC_USEDBNAME))
{
if (!IsDlgButtonChecked(IDC_MAXDBNAME))
{
EnableNext(TRUE);
}
}
if (IsDlgButtonChecked(IDC_MAXDBNAME) && CharCount)
{
if (IsDlgButtonChecked(IDC_USEXMLNAME))
{
if ( PrefixName.IsEmpty() )
{
EnableNext(FALSE);
}
else
{
EnableNext(TRUE);
}
}
}
if (IsDlgButtonChecked(IDC_USEXMLNAME) && PrefixName.GetLength() > 1)
{
EnableNext(TRUE);
}
if ( IsDlgButtonChecked(IDC_WSAUTONAME) || IsDlgButtonChecked(IDC_RENAMEIFDUP))
{
// TRACE("IDC_WSAUTONAME is Checked\n");
if ( IsDlgButtonChecked(IDC_USEXMLNAME) && PrefixName.GetLength() > 1 )
{
if ( IsDlgButtonChecked(IDC_IDC_USESHORTNAME) )
{
EnableNext(TRUE);
}
else if ( IsDlgButtonChecked(IDC_USELONGNAME) )
{
EnableNext(TRUE);
}
else
{
EnableNext(FALSE);
}
}
if ( !IsDlgButtonChecked(IDC_USEPREFIX) )
{
if ( IsDlgButtonChecked(IDC_IDC_USESHORTNAME) || IsDlgButtonChecked(IDC_USELONGNAME) )
{
EnableNext(TRUE);
}
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我会将你的if/else语句拆分成多个函数,并对发送给EnableNext的参数执行&=.您应该只调用一次EnableNext.
所以,例如:
// in CWorkStation::ProcessEvent
bool enableNext = true; // start with true
enableNext &= Condition1(); // of course pick better names than Condition1
enableNext &= Condition2(); // this is just for an example
EnableNext(enableNext);
Run Code Online (Sandbox Code Playgroud)
Condition1()可能是:
bool Condition1()
{
return (IsDlgButtonChecked(IDC_USEDBNAME)
&& !IsDlgButtonChecked(IDC_MAXDBNAME));
}
Run Code Online (Sandbox Code Playgroud)
等等.
这里发生的是enableNext变量以true开头.然后,每个&=你这意味着如果任何ConditionX()函数返回false,则enableNext将结束为false.如果所有条件都成立,那么最终才会成立.
| 归档时间: |
|
| 查看次数: |
474 次 |
| 最近记录: |