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

Posted

技术标签:

【中文标题】需要调用两次 setter 来强制在 MFC 中刷新 GUI【英文标题】:Need to call twice a setter to force GUI refresh in MFC 【发布时间】:2014-01-31 15:01:17 【问题描述】:

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

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

行为:

                         One 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(是的,我知道 -_- )上编译。

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

【问题讨论】:

【参考方案1】:

尝试将SetFieldRange 移动到SetAddress 之前,否则Windows 将忽略SetAddress,因为它超出了范围。

【讨论】:

谢谢,这就是它最初不起作用的原因!【参考方案2】:

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

【讨论】:

UpdateData 在这里没用(只是想看看它是否有帮助)。无论如何,作为一个非阻塞怪癖,我将保持双重调用不变,但最好能解释一下它为什么会这样。【参考方案3】:

大概就这么简单:

void CIPAddressBugDlg::OnChangeCombo()


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

ChangeIPRange 中所做的更改只有在您调用 UpdateData(FALSE) 时才会更新到控件。

【讨论】:

不。我试过这个答案,但无济于事:***.com/questions/17111894/mfc-edit-control-update

以上是关于需要调用两次 setter 来强制在 MFC 中刷新 GUI的主要内容,如果未能解决你的问题,请参考以下文章

VC++ MFC关于全局勾子的执行次数问题,高手帮助!成功调用以后,按下F9会弹出两次对话框,求解?只要执行一

在mfc中 为啥关闭子窗口连带把主窗口关闭了??

如何用wpf调用mfc程序呢?

开发板刷系统---利用fastboot向iNand中刷入镜像

MFC 自定义 OnPaint 未被可靠调用

MFC中啥时候调用OnDraw()函数?