SetDlgItemText使用中遇到的问题

minigui 1.6.8   thread

OS: linux 2.6.20

CPU: s3c2410

 

最近在使用SetDlgItemText设置静态框文本时发现,在调用完这个函数后静态框的文本并没有立即显示出来,而是要等一会才能显示。我程序中的代码如下:

 

case MSG_TIMER:

SetDlgItemText (hWnd, ID_SYS_TIME, buffer);

McuGetStatus(&McuState);

return;

 

而当我把这两个函数调用换个位置时,静态框中的文本就能立即显示出来:

 

case MSG_TIMER:

McuGetStatus(&McuState);

SetDlgItemText (hWnd, ID_SYS_TIME, buffer);

return;

 

这时我以为是我的函数调用McuGetStatus(&McuState)出了某种错误,对SetDlgItemText (hWnd, ID_SYS_TIME, buffer)的调用有了某种影响,后来把这个函数换掉:

 

case MSG_TIMER:

SetDlgItemText (hWnd, ID_SYS_TIME, buffer);

sleep(3);

return;

 

依然是显示不出来,于是认为我原来的那个函数应该是起到了一种延时的作用。于是探索了一下SetDlgItemText的内部实现。

 

src/gui/Dialog.c line730-739

 

 

这里首先会根据主窗口的窗口句柄和静态框的ID找到

静态框的控件句柄。然后向静态框发送一个MSG_SETTEXT消息。

 

src/control/static.c line282-286

 

 

           

在处理这个消息时,调用了InvalidateRect这个函数,

 

src/gui/window.c line4343-4379

在这个函数的倒数第三行首先调用wndInvalidateRect (hWnd, prc, bEraseBkgnd)将静态框中的文本擦除,然后调用PostMessage (hWnd, MSG_PAINT, 0, 0)向消息队列中邮寄一个消息。

 

由此可以知道上面的原因了。原来在调用完SetDlgItemText (hWnd, ID_SYS_TIME, buffer)函数之后,静态框中原来的文本被擦除,而新的文本并没有写到静态框中,只是向消息队列中发送了一个MSG_PAINT消息,要等到下一次消息循环处理MSG_PAINT时才能将文本写到静态框,而在SetDlgItemText (hWnd, ID_SYS_TIME, buffer)之后调用McuGetStatus(&McuState)就相当于延时,延迟了下一次消息循环的时间,所以会看不到文本。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值