【问题标题】:Is there any function called after the OnInitDialog function in MFC?在 MFC 中的 OnInitDialog 函数之后是否调用了任何函数?
【发布时间】:2011-07-02 14:00:07
【问题描述】:

我想在 MFC 中创建对话框后创建一个线程。 Windows 是否提供了任何函数并在OnInitDialog 之后自动调用,以便我可以在其中创建线程?

【问题讨论】:

    标签: c++ windows winapi mfc dialog


    【解决方案1】:

    您可以简单地在OnInitDialog 函数中创建您的线程。没有理由通过搜索不同的函数或将初始化代码分成两部分来使事情变得过于复杂。 (还有没有任何这样的功能,因为没有发送相应的 Windows 消息。)

    如果您想在创建线程之前在屏幕上显示对话框,您可以使用ShowWindow function 手动显示它。例如:

    ShowWindow(SW_SHOW);
    RedrawWindow();
    

    另见 Raymond Chen 的这篇文章:Waiting until the dialog box is displayed before doing something

    【讨论】:

    • 我发现我还需要调用CenterWindow(),因为调用 ShowWindow 会导致出现左上角的对话框。
    • @klox 嗯,这应该没有必要。对话框自动以它们的所有者窗口为中心。这发生在内部 MFC 函数 _AfxPostInitDialog 中,该函数在 OnInitDialog 之后运行。如果OnInitDialog 函数没有改变对话框的坐标,_AfxPostInitDialog 实际上会调用CenterWindow。但是明确地调用它也不会受到伤害,所以不管怎样都行。只需确保将其置于合理的位置,同时考虑到多显示器系统。始终以主显示器为中心将是错误的决定。 :-)
    • 我没有所有者窗口(对话框是唯一的窗口),但您的描述有助于解释我所看到的行为变化。
    【解决方案2】:

    OnInitDialog() 是初始化时调用的主函数(响应WM_CREATE)。

    你为什么不能在那里创建你的线程?

    【讨论】:

    • 我在 onintidialog 函数中创建了两个线程,但是当我运行它时,对话框的运行速度非常慢。所以我在 ontimer 中创建线程,即在对话框形成 5 毫秒后,线程将启动工作正常。所以我在想,如果在创建 dialo 之后有任何其他函数调用,而不是在计时器中创建线程,那么我可以把我的代码放在那里。是否存在任何函数?
    • OnInitDialog 不是为了响应WM_INITDIALOG 而调用的吗?
    【解决方案3】:

    我已将线程优先级更改为低于正常值,并且当线程第一次执行时,我将线程设置为正常优先级。这工作正常。感谢您的回复。

    【讨论】:

      【解决方案4】:

      多年来对在 MFC 对话框应用程序(最喜欢的游乐场)中绘制第一个视图图形的 OnTimer 解决方案感到不满意之后,这似乎是一个不错的简单解决方案:-

      1. 使用类向导添加 WM_HSCROLL 处理程序。
      2. 在 OnInitDialog 的末尾发布一条带有 NULL LPARAM 的 hscroll 消息
      3. 在处理程序中检测 NULL,绘制图形。

      计时器意味着应用程序在图形发生之前已经存在了一段时间,并且显然 hscroll 优先发生在 WM_PAINT 消息之后,该消息会将图片元素擦除为空白状态,删除在 initdialog 期间绘制的任何内容。

      BOOL CSpecDlg::OnInitDialog()
      {
          ...
      
          PostMessage(WM_HSCROLL,0, (LPARAM)NULL);
          return TRUE;  // return TRUE  unless you set the focus to a control
      }
      
      void CSpecDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
      {
          // TODO: Add your message handler code here and/or call default
          if (pScrollBar==NULL)
          {
              plot();
          }
          CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 2016-11-23
        • 1970-01-01
        • 2021-11-14
        • 2015-01-18
        相关资源
        最近更新 更多