【LibUIDK界面库系列文章】空闲消息

本文介绍如何在MFC对话框程序中利用WM_KICKIDLE消息实现空闲更新,当应用程序处于空闲状态时更新菜单项及工具栏按钮的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:刘树伟


MFC文档视图中的菜单项、工具栏按钮的状态,都可以通过空闲消息来更新。CWinApp提供了空闲消息函数的虚函数:CWinApp::OnIdle,它由CWinApp::Run调用,而CWinApp::Run又由AfxWinMain调用,AfxWinMain的代码如下:

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 _In_ LPTSTR lpCmdLine, int nCmdShow)
{
 ASSERT(hPrevInstance == NULL);

 int nReturnCode = -1;
 CWinThread* pThread = AfxGetThread();
 CWinApp* pApp = AfxGetApp();

 // AFX internal initialization
 if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
  goto InitFailure;

 // App global initializations (rare)
 if (pApp != NULL && !pApp->InitApplication())
  goto InitFailure;

 // Perform specific initializations
 if (!pThread->InitInstance()) // 这句最终会调用到CWinApp::InitInstance
 {
  if (pThread->m_pMainWnd != NULL)
  {
   TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n");
   pThread->m_pMainWnd->DestroyWindow();
  }
  nReturnCode = pThread->ExitInstance();
  goto InitFailure;
 }
 nReturnCode = pThread->Run(); // 这句最终会调用到CWinApp::OnIdle

InitFailure:
#ifdef _DEBUG
 // Check for missing AfxLockTempMap calls
 if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
 {
  TRACE(traceAppMsg, 0, "Warning: Temp map lock count non-zero (%ld).\n",
   AfxGetModuleThreadState()->m_nTempMapLock);
 }
 AfxLockTempMaps();
 AfxUnlockTempMaps(-1);
#endif

 AfxWinTerm();
 return nReturnCode;
}

所以,我们可以看到CWinApp::OnIdle是在pThread->InitInstance()之后调用的。对于模式对话框程序,直到对话框关闭后,才会执行到pThread->Run(),所以,对话框程序,重写CWinApp::OnIdle并不会被执行到。幸运的是,对话框程序提供了替代方案:WM_KICKIDLE消息。CWnd::RunModalLoop在处理循环时,会在空闲时,向对话框发送SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++)消息,我们只需要模仿CWinApp::Run,在对话框处理WM_KICKIDLE消息时,向它的所有孩子发送WM_IDLEUPDATECMDUI消息即可:
case WM_KICKIDLE:
{
 LONG lIdleCount = lParam;

 if (pUIWnd != NULL && pUIWnd->m_hWnd != NULL && pUIWnd->IsWindowVisible())
 {
  pUIWnd->SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0, TRUE, TRUE);
 }
}
break;

然后在需要响应空闲消息的子窗口内,响应WM_IDLEUPDATECMDUI消息,做一些事情。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值