需要调用两次setter才能在MFC中强制GUI刷新

时间:2014-01-31 15:01:18

标签: c++ combobox mfc

我正在使用MFC ComboBox控件来更改某些参数,这些参数在可用的IP范围内具有选区(例如,仅/无广播IP)。

我需要调用范围修改功能两次以强制刷新显示的值:为什么?

行为:

enter image description here

                         One call to range modification

 two call to range modification

                         Two calls to range modification

源代码:

void CIPAddressBugDlg::OnChangeCombo()
{

    UpdateData(TRUE);
    ChangeIPRange();
    //ChangeIPRange();

}


void CIPAddressBugDlg::ChangeIPRange()
{
    BYTE nField0, nField1, nField2, nField3;

    if ( Combo.GetCurSel() )
    {
        IpAddress.GetAddress(nField0, nField1, nField2, nField3);
        if ( nField0  < (BYTE) 224 )
            nField0 = 224;
        IpAddress.SetAddress(nField0, nField1, nField2, nField3);
        IpAddress.SetFieldRange(0, 224 , 232 );
    }
    else
    {
        IpAddress.GetAddress(nField0, nField1, nField2, nField3);
        if ( nField0  >= (BYTE) 224 )
            nField0 = 223;
        IpAddress.SetAddress(nField0, nField1, nField2, nField3);
        IpAddress.SetFieldRange(0, 0 , 223 );
    }
}

Combo是一个ComboBox控件,IpAddress是一个CIPAddressCtrl。我正在编译运行Windows XP的VS C ++ 6.0(是的,我知道-_-)。

(如果需要,我也可以上传整个玩具项目)

3 个答案:

答案 0 :(得分:1)

在第二次执行对UpdateData的调用之前,您不会更新编辑字段中的值。我不确定你为什么依赖于OnChangeCombo中的UpdateData,但是,这就是导致该字段更新的原因。尝试删除对UpdateData的调用,并添加对SetWindowText的调用,或者在ChangeIPRange()中使用等效的对话框命令来更新IP数据字段。

答案 1 :(得分:1)

这可能就像这样简单:

void CIPAddressBugDlg::OnChangeCombo()
{

    UpdateData(TRUE);
    ChangeIPRange();
    UpdateData(FALSE);
}

ChangeIPRange中所做的更改仅在您致电UpdateData(FALSE)时更新为控件。

答案 2 :(得分:1)

尝试在SetFieldRange之前移动SetAddress Windows会忽略SetAddress,因为它超出了范围。