需要调用两次 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会弹出两次对话框,求解?只要执行一