为什么以Dialog为主窗口的应用中OnIdle没法调用

richard_yang 2001-03-09 05:18:00
本人在开发中发现,以Dialog为主窗口的应用中OnIdle()没法调用,请哪位高手帮助解答,多谢。解释原因将多给分。
...全文
167 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ecai 2001-03-13
  • 打赏
  • 举报
回复
使用未公开的消息WM_KICKIDLE,它在CWnd::DoModalLoop()中当对话框窗口空闲时发送
SAMPLE:
// in MyDialog.h, add the declaration of the message handler
afx_msg LRESULT OnKickIdle(WPARAM,LPARAM);

// in MyDialog.cpp, add the declaration of the message map
ON_MESSAGE(WM_KICKIDLE,OnKickIdle)

// implemention of the message handler
LRESULT CMyDialog::OnKickIdle(WPARAM,LPARAM)
{
// 如果需要更新对话框上的控件
UpdateDialogControls(this,FALSE);
// 做类似OnIdle()中做的工作
return 0;
}

//////////// 可以使用ON_UPDATE_COMMAND_UI更新对话框中的控件 //////////////
// then you can update the controls , e.g. a button, in your dialog
// in MyDialog.h
afx_msg void OnUpdateDeleteButton(CCmdUI* pCmdUI) ;

// in MyDialog.cpp
ON_UPDATE_COMMAND_UI(IDC_DELETE_BUTTON, OnUpdateDeleteButton)
void CMyDialog::OnUpdateDeleteButton(CCmdUI* pCmdUI)
{
pCmdUI->Enable(...);
}
======================================================================
注意: 如果时使用CView,可以使用ON_UPDATE_COMMAND_UI 更新菜单,如果需要更新View中的控件的话,需要使用WM_IDLEUPDATECMDUI,和上述的WM_KICKIDLE类似.
for a view in a frame, the CFrameWnd will dispatch another message
of WM_IDLEUPDATECMDUI, which works like the WM_KICKIDLE. You need to
do the following:
// in CMyView.h
afx_msg void OnIdleUpdateCmdUI();

// in CMyView.cpp
ON_MESSAGE_VOID(WM_IDLEUPDATECMDUI, OnIdleUpdateCmdUI)
void CMyView::OnIdleUpdateCmdUI()
{
UpdateDialogControls(this,FALSE);
}

BTW: OnIdle()有一个参数lCount可以控制更新的频繁程度,但是OnKickIdle()没有这样的功能
richard_yang 2001-03-12
  • 打赏
  • 举报
回复
怎样改成无模式,我试验过不成功。有没有其它办法,请指教,能否具体做说明,比如,简要的编码。(目前,我使用了定时解决我实际要解决的问题,但感觉不爽)
happylaodu 2001-03-09
  • 打赏
  • 举报
回复
所以要是改成非模式对话框,也许可以。
happylaodu 2001-03-09
  • 打赏
  • 举报
回复
有点明白了,好像是因为模式对话框中断了应用程序的消息队列,直到DoModal返回。
Seal 2001-03-09
  • 打赏
  • 举报
回复
这种窗口的生命周期值存在于CWinApp::InitInstance函数中,而OnIdle属于CWinThread的,并且在其消息循环中起作用。以Dialog为主窗口的应用在到达该循环前就已经结束了。
happylaodu 2001-03-09
  • 打赏
  • 举报
回复
好像是要响应一个叫WM_ENTERIDLE消息,生成它的处理函数就可以了。用法和OnIdle差不多。

我前两天刚从书上看来的,其理由当时只是稍微看了一下,还没有搞很明白,不敢瞎说。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧